12. Order サービス
client.order() でアクセスします。作業指示(Work Order)の作成 → 開始 → 中断/再開 → 終了までの全ライフサイクルを ISA-88 ベースの状態マシンで管理します。
11.1 作業指示状態 (ISA-88 ベース)
CREATE → WAIT ──start()──► START ──pause()──► PAUSED
│ │
│ resume()
│ │
▼ ▼
END ◄──end()──── START
│
└─ (또는) ──abort()──► ABORTED
状態 (status) | 意味 | 遷移メソッド | ISA-95 状態 (isa95_state) |
|---|---|---|---|
WAIT | 待機 (作成直後の初期状態) | create() の結果 | Ready |
START | 進行中 | start(), resume() | Running |
PAUSED | 一時停止 | pause() | Held |
END | 正常完了 | end() | Completed |
ABORTED | 異常終了 | abort() | Aborted |
status は保存される値そのままであり、この5種類のみです。開始せずにキャンセルしたワークオーダーは新しい状態ではなく、
ABORTED + abort_code=CANCELLED となります。ワークオーダー行(/order·リスト·/order/query)と実績文書·plantpulse.order.*
イベントには、ここに ISA-95 Part 4 作業指示状態 isa95_state を付記します。対応は上の表ひとつであり、すべての経路が同じ値を返します。
状態遷移が不可能な呼び出し(例: すでに
START状態であるときにstart()を再呼び出し)の場合、サーバは OK +data.success=false応答を送信し、V5 メソッドはfalseを返します。
11.2 メソッド一覧
CRUD
| メソッド | 返却型 | HTTP | エンドポイント |
|---|---|---|---|
create(OrderRequestV5) | OrderResponseV5 または null | POST | /api/v5/order |
update(order_id, OrderRequestV5) | OrderResponseV5 または null | PUT | /api/v5/order/{id} |
delete(order_id) | boolean | DELETE | /api/v5/order/{id} |
get(order_id) | OrderResponseV5 または null | GET | /api/v5/order/{id} |
list() | List<OrderResponseV5> | GET | /api/v5/order |
exists(order_id) | boolean | GET | /api/v5/order/{id}/exists |
ライフサイクル (すべて boolean を返却)
| メソッド | HTTP | エンドポイント |
|---|---|---|
start(order_id) | POST | /api/v5/order/{id}/start |
end(order_id) | POST | /api/v5/order/{id}/end |
pause(order_id) | POST | /api/v5/order/{id}/pause |
resume(order_id) | POST | /api/v5/order/{id}/resume |
abort(order_id) | POST | /api/v5/order/{id}/abort |
11.3 OrderRequestV5 / OrderResponseV5
| フィールド | 型 | 説明 |
|---|---|---|
order_id | String | 作業指示 ID (PK) |
order_name | String | ワークオーダー名 — 必須、空白不可(422 order.name.required)。B2MML JobOrder の名称 |
description | String | 説明 |
site_id | String | 所属サイト |
asset_id | String | 対象設備 (Equipment) |
customer_id | String | 顧客 (任意) |
product_id | String | 生産製品 |
employee_id | String | 担当社員 (任意) |
planned_quantity | Quantity | 計画数量 — ISA-95 / B2MML QuantityValueType。下記 11.5 数量 参照 |
time_per_unit_in_ms | long | 単位当たり標準時間 |
planned_start_timestamp | long | 計画開始時刻 (ミリ秒) |
planned_end_timestamp | long | 計画終了時刻 (ミリ秒) |
external_id | String | 外部システム(MES·ERP)のワークオーダー番号(100文字まで)。external_system とペアで識別される — 11.6 |
external_system | String | そのワークオーダーを発行した外部システム名(50文字まで) — 外部識別ペアのもう一方 |
customer_po_id | String | このワークオーダーが対応する顧客発注(PO)番号 (任意) |
status | String | (応答専用) 現在の状態 — 保存値 WAIT·START·PAUSED·END·ABORTED |
isa95_state | String | (応答専用) ISA-95 作業指示状態 — Ready·Running·Held·Completed·Aborted (11.1) |
title → order_name, fix_start_timestamp·fix_end_timestamp → planned_start_timestamp·planned_end_timestamp,
external_order_id → external_id, external_po_id → customer_po_id。旧名称はリクエストで読み込まれず、応答にも表示されません —
アップグレードノート。
11.4 使用例
作業指示の作成
import plantpulse.api.v5.dto.Quantity;
import plantpulse.api.v5.dto.request.OrderRequestV5;
import plantpulse.api.v5.dto.response.OrderResponseV5;
OrderRequestV5 req = new OrderRequestV5();
req.setOrder_id("ORDER_000001");
req.setOrder_name("5월 14일 1교대 생산");
req.setDescription("PROD_A001 500개 생산");
req.setSite_id("SITE_DJ");
req.setAsset_id("ASSET_DJ_M_0001");
req.setProduct_id("PROD_A001");
req.setCustomer_id("CUST_001");
req.setEmployee_id("EMP_E12345");
req.setPlanned_quantity(Quantity.of("500", "EA")); // 값은 10진 «문자열», 단위는 UN/ECE Rec 20 코드
req.setTime_per_unit_in_ms(5_000);
long now = System.currentTimeMillis();
req.setPlanned_start_timestamp(now);
req.setPlanned_end_timestamp(now + 4 * 3600_000L);
req.setExternal_id("MES-2026-0514-001");
req.setExternal_system("MES");
OrderResponseV5 created = client.order().create(req);
標準ライフサイクル
String orderId = "ORDER_000001";
// WAIT → START
if (!client.order().start(orderId)) {
System.err.println("시작 실패 — planned_start_timestamp가 미래이거나 이미 진행중");
return;
}
// 잠시 후 — 일시중지
client.order().pause(orderId);
// 재개
client.order().resume(orderId);
// 정상 종료
client.order().end(orderId);
異常終了
// abort 는 별도 인자 없이 호출. 상세 사유는 update() 로 description/notes 에 기록.
if (!client.order().abort("ORDER_000001")) {
System.err.println("중단 실패");
}
単一照会 / 存在確認
OrderResponseV5 o = client.order().get("ORDER_000001");
if (o != null) {
System.out.println("상태: " + o.getStatus());
Quantity planned = o.getPlanned_quantity(); // {quantity_string, data_type, unit_of_measure}
System.out.println("계획: " + planned.getQuantity_string() + " " + planned.getUnit_of_measure());
java.math.BigDecimal value = planned.toBigDecimal(); // 계산은 BigDecimal 로 — double 로 바꾸지 않는다
}
boolean exists = client.order().exists("ORDER_000001");
全リスト
import java.util.List;
List<OrderResponseV5> all = client.order().list();
for (OrderResponseV5 o : all) {
System.out.printf("[%s] %s — %s%n",
o.getStatus(), o.getOrder_id(), o.getOrder_name());
}
進行中の作業指示のみ (クライアント側フィルタ)
import java.util.stream.Collectors;
List<OrderResponseV5> active = client.order().list().stream()
.filter(o -> "START".equals(o.getStatus())
|| "PAUSE".equals(o.getStatus()))
.collect(Collectors.toList());
設備別作業指示
String assetId = "ASSET_DJ_M_0001";
List<OrderResponseV5> assetOrders = client.order().list().stream()
.filter(o -> assetId.equals(o.getAsset_id()))
.collect(Collectors.toList());
状態別統計
import java.util.Map;
Map<String, Long> byStatus = client.order().list().stream()
.collect(Collectors.groupingBy(
OrderResponseV5::getStatus,
Collectors.counting()));
byStatus.forEach((status, count) ->
System.out.printf("%s: %d건%n", status, count));
修正 / 削除
// 수정 (계획 시간 연장)
OrderRequestV5 update = new OrderRequestV5();
update.setOrder_id("ORDER_000001");
update.setOrder_name("5월 14일 1교대 생산 (연장)");
// ... 모든 필드 다시 세팅 ...
update.setPlanned_end_timestamp(System.currentTimeMillis() + 8 * 3600_000L);
client.order().update("ORDER_000001", update);
// 삭제 (취소 처리)
client.order().delete("ORDER_000001");
11.5 数量 — ISA-95 Quantity
ワークオーダーの数量(計画·生産·良品·廃棄·再作業 …)は、単一の数値ではなく値と単位を保持するオブジェクトです。
形式は ISA-95(IEC 62264) / B2MML V0700 の QuantityValueType と 1:1 で対応しています。
V5 API(OpenAPI info.version 5.0) · 数量合意 2026-10-30 · 名称ウェーブ 2026-10-31 · プラットフォーム 2026.11 版(server-web 974891b4) 基準です。
イベントは plantpulse.order.*·plantpulse.calendar.* スキーマ major 2, plantpulse.kpi.oee.finalized major 1, DB は Flyway V99·V100·V103 および core マイグレーション V12V16·V21V23 —
アップグレードノート。
[
{ "quantity_string": "1250.5", "data_type": "decimal", "unit_of_measure": "KGM" },
{ "quantity_string": "1200", "data_type": "integer", "unit_of_measure": "EA" }
]
| 項目 | B2MML | 型 | ルール |
|---|---|---|---|
quantity_string | QuantityString | string | 10進表記そのまま — 指数表記禁止、小数点は .、小数第4位まで。計数単位は整数 |
data_type | DataType | string | integer(計数単位) または decimal(その他)。サーバが単位から決定する — リクエストでは省略可能であり、指定した場合は単位と一致しなければならない |
unit_of_measure | UnitOfMeasure | string | UN/ECE Recommendation 20 共通コード — 下記許容リスト参照 |
B2MML が QuantityString で定義しており、JSON 数値は多くのパーサーが double として読み込むため、10進精度の
損失が発生しやすいためです。SDK では Quantity.toBigDecimal() として読み込んで計算してください。リクエストを作成する際は
Quantity.of("1250.5", "KGM") — data_type を空にすればサーバが補完します。
単位 — 許容リスト (UN/ECE Rec 20)
| コード | 意味 | data_type | 画面記号 |
|---|---|---|---|
EA | each — 個数 | integer | EA |
H87 | piece | integer | pc |
C62 | one (unit) | integer | unit |
BX | box — 箱数 | integer | box |
SET | set — セット·キット数 | integer | set |
KGM | kilogram | decimal | kg |
GRM | gram | decimal | g |
TNE | tonne | decimal | t |
LTR | litre | decimal | L |
MLT | millilitre | decimal | mL |
MTQ | cubic metre | decimal | m³ |
MTR | metre | decimal | m |
MTK | square metre | decimal | m² |
- 許容単位は上記 13種類 であり、計数単位は
EA·H87·C62·BX·SETの5種類です。リスト外のコードは拒否されます(quantity.unit_invalid)。 コードは大文字小文字を含め厳密に比較します —ea,KG,PCSは許容コードではありません。 - 画面記号にないコードが入力された場合(例: 旧データ)、コードがそのまま表示されます。
- 単位換算は行いません(単位マスタ·換算は MES の役割です)。異なる単位の数量は合算しません。
- 画面記号は言語に依存しません — 日本語画面でも «個» ではなく
EAとなります。記号は常に付加されます(個数も同様)。
項目名 — ISO 22400
項目名は ISA-95 および ISO 22400-2(IEC 62264 の KPI 準拠) の用語に従います。旧名称は応答に表示されません(互換項目なし)。
| 意味 | 項目 (Quantity) | 旧項目 | 根拠 |
|---|---|---|---|
| 計画数量 | planned_quantity | target_units + unit | ISA-95 MaterialRequirement.Quantity · ISO 22400 POQ |
| 生産数量 | produced_quantity | total_production_count | ISO 22400 PQ |
| 良品数量 | good_quantity | total_good_count · good_count | ISO 22400 GQ |
| 廃棄数量 | scrap_quantity | total_bad_count · bad_count — 定義が狭まった: 旧項目は不良全体、新項目は廃棄のみ | ISO 22400 SQ |
| 再作業数量 | rework_quantity | (なし — 新項目) | ISO 22400 RQ |
| 計画外 良品 / 不良 | good_quantity_out_of_plan / scrap_quantity_out_of_plan | out_of_plan_good_count / out_of_plan_bad_count | |
| 計測 良品 / 不良 (PLC) | measured_good_quantity / measured_scrap_quantity | measured_good_count / measured_bad_count | |
| 補正 増減 | good_quantity_delta / scrap_quantity_delta | good_delta / bad_delta | |
| 補正 入力値 | entered_good_quantity / entered_scrap_quantity | entered_good / entered_bad | |
| 検査数量 | inspected_quantity | inspected_count | |
| 検査不良 合計 | inspected_scrap_quantity | inspected_bad_count | |
| 不良記録 処置別 | scrap_quantity / rework_quantity | scrap_count / rework_count | ISO 22400 SQ / RQ |
変更される応答: /order, /order/query(include=oee), /order/{id}/oee, /order/{id}/quantity(改定履歴含む),
/defects, /order/performance, /kpi/oee/history, /asset/{id}/status, MCP ワークオーダーツール, 生産イベント OEE_CALCULATED。
/asset/{id}/statusのplanned_quantity·good_quantity·scrap_quantityは進行中のワークオーダーの単位として表示されます。進行中のワークオーダーがない場合は null です。- 比率項目(
total_good_rate,production_rate, 可用性·性能·品質·OEE)は無次元であるため、数値そのままとなります。 /asset/{id}/statusにもrework_quantityが存在します(進行中のワークオーダーの再作業)。- PLC カウンタ記録(
GET /api/v5/kpi/oee/countのgood_quantity·scrap_quantity)と MCPget_asset_kpiの原因別廃棄(scrap_quantity)も その時点のワークオーダー単位の Quantity です。カウンタは整数でカウントするため、カウント 1 = ワークオーダー単位 1 となります — kg ワークオーダーに整数カウンタを適用した場合、1 kg 単位でカウントします。小数実績はカウンタではなく、数量訂正·実績入力で入力します。
廃棄と再作業 — «不良» は両者の合計
ISO 22400 に従い、不良を廃棄(SQ) と再作業(RQ) に分ける。
- 不良 = 廃棄 + 再作業, 生産 = 良品 + 廃棄 + 再作業(
produced_quantity=good_quantity+scrap_quantity+rework_quantity)。 scrap_quantityは廃棄のみです。PLC がカウントした不良は処置が不明であるため、廃棄としてカウントします。再作業は処置がREWORKである不良記録からのみ発生します。- 品質 Q は「良品 ÷ 生産」であるため、再作業も品質を低下させます — 分けて記載するだけで OEE 値は変わりません。
- 画面はこの区分を明示します:廃棄のみを指す箇所(生産履歴列、数量訂正項目)は «廃棄」、合計を表示する箇所は «不良» とし、 再作業がある場合は «14 kg (廃棄 12.75 · 再作業 1.25)» のように内訳を付記します — 生産管理 — 数量と単位。
- 連動で «不良合計» が必要な場合は、
scrap_quantity+rework_quantityを同一単位同士で10進数として合算します。scrap_quantity単体を不良合計として読み込まないでください。
項目別の数量ロード — カウンタ表
| 出典 (保存) | V5 項目 / イベント項目 | ロードされる数量 |
|---|---|---|
PLC カウンタ台帳 tm_kpi_oee_count | /kpi/oee/count の good_quantity · scrap_quantity | PLC がカウントした良品·不良増分。処置不明のため不良は廃棄(SQ) |
ワークオーダー OEE 行 mm_order_oee.total_production_count | produced_quantity · イベント pq/pq_quantity | 生産(PQ) = 良品 + 廃棄 + 再作業 |
mm_order_oee.total_good_count | good_quantity · gq/gq_quantity | 良品(GQ) |
mm_order_oee.total_bad_count − total_rework_count | scrap_quantity · sq/sq_quantity | 廃棄(SQ)。total_bad_count 自体(不良合)はワイヤに流れない |
mm_order_oee.total_rework_count | rework_quantity · rq/rq_quantity | 再作業(RQ) |
mm_order_oee.out_of_plan_good_count / out_of_plan_bad_count | good_quantity_out_of_plan / scrap_quantity_out_of_plan · gq_out_of_plan/sq_out_of_plan(+_quantity) | 計画停止中に作成された量 — 上記の良品·廃棄に含まれ、効率計算からは除外される |
数量訂正 mm_order_quantity_correction | /order/{id}/quantity の measured_*_quantity · good_quantity_delta/scrap_quantity_delta · (履歴) entered_*_quantity | PLC 計測値、訂正増減、REPLACE 入力値。廃棄項目は廃棄のみ |
不良記録 mm_defect_record (処置 SCRAP/REWORK) | /defects の quantity·inspected_quantity, 実績文書 defects.scrap_quantity / rework_quantity / inspected_scrap_quantity | 処置別廃棄·再作業、検査不良合計(SCRAP + REWORK) |
mm_order.planned_quantity | planned_quantity · イベント planned_quantity | 計画(POQ) |
リクエストルールと拒否
実績·補正·不良記録にロードする数量は、ワークオーダー planned_quantity と同一の単位である必要があります。サーバは換算せず拒否します。
値·単位の拒否は 422 E1002(400 ではありません)であり、応答(application/problem+json)の code が E1002,
reason 項目が以下の理由コードとなります。detail は呼び出し側言語の文章であるため、分岐は reason で行ってください。
| 理由コード | 時点 |
|---|---|
quantity.unit_mismatch | ワークオーダーの単位と異なる単位を送信した |
quantity.not_integer | 計数単位(EA·H87·C62·BX·SET)に小数を送信した |
quantity.unit_invalid | 単位がない、または許容リスト13種の範囲外である |
quantity.format | quantity_string が10進表記文字列ではない(指数表記·先頭0·+ 符号·数値型)、または data_type が単位と不一致である |
quantity.scale | 小数第5位以上である |
quantity.negative | 負数である(補正増減項目のみ負数を受け付ける) |
quantity.range | 絶対値が 1014 以上 — 保存 numeric(18,4) の範囲外 |
- 数量項目にオブジェクトではなく値(数値
500等)を指定したり、quantity_string·data_type·unit_of_measure以外のキーを入れた場合は 400E1000となります(形式エラー)。 - ワークオーダーの計画数量は 0 より大きくなければなりません。
期間 KPI — 単位が混在する場合、合算しない
/kpi/period·/kpi/daily のように複数のワークオーダーを合算する応答は、単位が1種類である場合にのみ合計を算出します。
数量合計項目は /kpi/period の oee オブジェクト内 good_count·total_count·in_plan_count, /kpi/daily の good_count·bad_count·planned_count です。
/kpi/daily の bad_count は「生産 − 良品」、すなわち不良合計(廃棄 + 再作業) です。
- 単位が1種類のみ — 数量合計項目は現状通り数値となり、ここにその単位
unit_of_measureが付記されます。 - 単位が混在 — 数量合計項目と
unit_of_measureは null となり、代わりにquantities_by_unitに単位別の良品·生産数量が Quantity として表示されます。
{
"good_count": null,
"total_count": null,
"in_plan_count": null,
"unit_of_measure": null,
"quantities_by_unit": [
{ "unit_of_measure": "EA",
"good_quantity": { "quantity_string": "2671", "data_type": "integer", "unit_of_measure": "EA" },
"produced_quantity": { "quantity_string": "2700", "data_type": "integer", "unit_of_measure": "EA" } },
{ "unit_of_measure": "KGM",
"good_quantity": { "quantity_string": "1250.5", "data_type": "decimal", "unit_of_measure": "KGM" },
"produced_quantity": { "quantity_string": "1302", "data_type": "decimal", "unit_of_measure": "KGM" } }
]
}
比率(可用性·性能·品質·OEE)は無次元であるため、単位が混在してもそのまま表示されます。
EMS 単位当たり値 — 分母の単位
energy_per_unit_kwh·co2_per_unit_kg の分母はワークオーダーの良品数量であるため、応答にその単位 unit_of_measure が共に表示されます
(/order/{id}/ems, /order/ems/*, /order/query?include=ems)。画面には «kWh/EA», «kWh/kg» のように記載します。
複数のワークオーダーを合算する集計において単位が混在する場合、単位当たり値と単位は null となります。
イベント
イベントスキーマは «末尾への追加» のみ許可されているため、型を変更せずに項目を追加しました。
| イベント | 数量項目 |
|---|---|
plantpulse.order.* | planned_quantity(number) + planned_quantity_unit_of_measure(Rec 20 コード) |
plantpulse.kpi.oee.finalized | 正本は gq_quantity·sq_quantity·rq_quantity·pq_quantity·gq_out_of_plan_quantity·sq_out_of_plan_quantity(number) + unit_of_measure。sq は廃棄のみ、再作業は rq(pq = gq + sq + rq)。整数項目 gq·sq·rq·pq·… は計数単位のときのみロードされ、小数単位の場合は存在しない — 次の major で削除予定 |
生産イベント OEE_CALCULATED | good_quantity·scrap_quantity(廃棄のみ)·rework_quantity = Quantity オブジェクト |
11.6 MES 連動 — 実績フィードと B2MML 対応
外部ワークオーダー識別 — (external_system, external_id) ペア
顧客システム(MES·ERP)のワークオーダーは、発行システム名とそのシステム内の番号という、2項目のペアで識別します。これは社員·整備オーダーの外部識別と同様の形式です。
- ペアはインバウンドおよびアウトバウンドの両方に存在します。V5
POST·PUT·PATCH /api/v5/orderがexternal_system(50文字)·external_id(100文字)を 受け取り、GET /order/{id}·リスト·/order/query·実績文書は常に両方を保持します(ない場合は null)。コンソール様式にはexternal_system項目がないため V5 で入力します。 - 空白または空白のみの値は null として保存します。長さを超える場合や制御文字が含まれる場合は 422
order.external_ref.invalidとなります。 - 両項目が共に非空であるとき、ペアは一意となります。同一ペアを2つ目のワークオーダーに指定すると 409
order.external.duplicateとなります。 PUTはリクエスト項目全体を更新します — 除外されたexternal_system·external_idは削除されます。一部のみ更新する場合はPATCHを使用してください。external_idのみが存在しexternal_systemがないワークオーダーも引き続き許容されますが、ペアではないため、以下の «ペアで検索» では見つけることができません。- イベントもペアを保持します:
plantpulse.order.*(スキーマ major 2)のcreated·updated·startedabortedがexternal_id·external_systemを、遷移イベント(startedaborted)はcustomer_po_idも保持します。 - ワークオーダーをペアで読み込む場合は
GET /api/v5/order/by-external/{system}/{external_id}— 存在しない場合は 404、片方が空の場合は 422order.external_ref.invalid。/order/queryのフィルタもexternal_id+external_systemです。旧パラメータexternal_order_idを送信した場合、無視せず 422 で拒否します。
実績フィードパス
| HTTP | パス | 内容 |
|---|---|---|
| GET | /api/v5/order/performance | 実績フィード — cursor·site_id·limit。実績が変更されたワークオーダーは performance_revision が1つ上がり、末尾に再掲される |
| GET | /api/v5/order/{order_id}/performance | ワークオーダー1つの実績文書 |
| GET | /api/v5/order/performance/by-external/{external_system}/{external_id} | ペアで検索 — 配列(ペアは一意であるため最大1つ)、存在しない場合は空配列 |
/api/v5/order/performance/by-external/{external_order_id}(システム指定なしで番号のみ)は削除されました。互換パスはありません。
実績文書の数量キー
| 位置 | キー (すべて Quantity) | 旧キー |
|---|---|---|
plan | planned_quantity | target_units |
quantity | measured_good_quantity / measured_scrap_quantity | measured_good / measured_bad |
quantity | good_quantity / scrap_quantity | good / bad |
quantity.correction | good_quantity_delta / scrap_quantity_delta | good_delta / bad_delta |
oee | good_quantity / scrap_quantity | total_good_count / total_bad_count |
defects | inspected_scrap_quantity / scrap_quantity / rework_quantity | inspected_bad_count / scrap_count / rework_count |
quantity.correction_version, progress.expected_now_units·pace_units は名称がそのままです(小数単位の場合は小数数値)。
quantity.scrap_quantity は廃棄のみ(PLC 不良 + SCRAP 記録)であり、defects.scrap_quantity と意味が同じです。quantity.rework_quantity は
defects.rework_quantity と同じ値です。defects.inspected_scrap_quantity は検査不良全体(SCRAP + REWORK)です。
実績文書の状態 — 変更箇所の読み取り方
実績文書1つはワークオーダー1つの現在の状態を保持し、状態が変更されるたびに版が上がります。
| 項目 | 意味 |
|---|---|
actual.status | 保存状態 WAIT·START·PAUSED·END·ABORTED — 11.1。キャンセルは ABORTED + actual.abort_code=CANCELLED |
actual.isa95_state | ISA-95 作業指示状態 Ready·Running·Held·Completed·Aborted |
performance_revision | 実績変更回数。変更ごとに 1 ずつ増加し、フィードはそのワークオーダーを末尾に再掲する。0 は未完了のワークオーダー — フィードにはなく /order/{id}/performance でのみ読み込まれる |
quantity.correction_version | 数量訂正版。訂正がない場合は計測値そのままとなり、訂正ごとに上昇する — 履歴は /order/{id}/quantity の改定履歴 |
changed_at · change_cause | 最終変更時刻とその原因 — ENDED·QUANTITY(数量訂正)·STOP_REASON·OEE_FINAL·DEFECT(不良記録)·PROGRESS·BASELINE |
数量は «値 + 単位» でのみ保持し、計算されていない項目は 0 ではなく null となります。MES は同一の order_id の performance_revision が
より大きい文書で、以前の文書を丸ごと置き換える形で更新します。
B2MML 対応表
実績文書1つは ISA-95 Part 4 の Job Response(Segment Response)に、その数量は Material Actual(Produced)の Quantity に相当します。
| ISA-95 / B2MML | PlantPulse V5 | 備考 |
|---|---|---|
QuantityValueType — QuantityString · DataType · UnitOfMeasure | Quantity — quantity_string · data_type · unit_of_measure | 1:1. B2MML の選択項目 Key は使用しない |
UnitOfMeasure 値 | UN/ECE Rec 20 コード | 許容リストは 11.5 参照 |
| Job Order の ID | external_id | 発行システム名は external_system — 両者で1ペア |
| Job Order · MaterialRequirement の Quantity | planned_quantity | ISO 22400 POQ |
| Job Order の名称 | order_name | |
| Job Order の StartTime · EndTime | planned_start_timestamp · planned_end_timestamp | 計画時刻。実際時刻は actual_start_timestamp · actual_end_timestamp |
| Job Response | 実績文書1つ (/order/{id}/performance) | |
| MaterialActual(Produced) の Quantity | produced_quantity | ISO 22400 PQ |
| そのうち良品 | good_quantity | ISO 22400 GQ |
| そのうちスクラップ | scrap_quantity | ISO 22400 SQ |
| そのうち再作業 | defects.rework_quantity | ISO 22400 RQ |
11.7 活用シナリオ
シナリオ — MES 連動作業指示自動作成
import java.text.SimpleDateFormat;
import java.util.Date;
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String today = df.format(new Date());
// 외부 MES 큐에서 받은 주문을 V5 Order로 변환
for (MesOrder mes : mesQueue) {
OrderRequestV5 req = new OrderRequestV5();
req.setOrder_id("ORDER_" + today + "_" + String.format("%03d", mes.seq));
req.setSite_id("SITE_DJ");
req.setAsset_id(mes.equipId);
req.setProduct_id(mes.productId);
// MES 수량을 그대로 — 단위 환산은 하지 않는다. 단위는 허용 목록(11.5) 안의 Rec 20 코드여야 한다
req.setPlanned_quantity(Quantity.of(mes.qty.toPlainString(), mes.unitCode));
req.setExternal_id(mes.mesOrderId);
req.setExternal_system("MES");
req.setPlanned_start_timestamp(mes.plannedStart);
req.setPlanned_end_timestamp(mes.plannedEnd);
client.order().create(req);
}
シナリオ — 安全な状態遷移ヘルパー
public static boolean safeStart(APIClient_V5 client, String orderId) {
OrderResponseV5 o = client.order().get(orderId);
if (o == null) {
log.warn("작업지시 없음: " + orderId);
return false;
}
if (!"WAIT".equals(o.getStatus())) {
log.warn("WAIT 상태가 아님: " + o.getStatus());
return false;
}
return client.order().start(orderId);
}
次のステップ
- Customer サービス, Employee サービス, Product サービス — Order に紐付くマスタデータ
- Calendar サービス — 作業指示と点検日程の衝突検知
- アップグレードノート — 数量 Quantity 移行時に連動側で修正すべき点