メインコンテンツまでスキップ

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 または nullPOST/api/v5/order
update(order_id, OrderRequestV5)OrderResponseV5 または nullPUT/api/v5/order/{id}
delete(order_id)booleanDELETE/api/v5/order/{id}
get(order_id)OrderResponseV5 または nullGET/api/v5/order/{id}
list()List<OrderResponseV5>GET/api/v5/order
exists(order_id)booleanGET/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_idString作業指示 ID (PK)
order_nameStringワークオーダー名 — 必須、空白不可(422 order.name.required)。B2MML JobOrder の名称
descriptionString説明
site_idString所属サイト
asset_idString対象設備 (Equipment)
customer_idString顧客 (任意)
product_idString生産製品
employee_idString担当社員 (任意)
planned_quantityQuantity計画数量 — ISA-95 / B2MML QuantityValueType。下記 11.5 数量 参照
time_per_unit_in_mslong単位当たり標準時間
planned_start_timestamplong計画開始時刻 (ミリ秒)
planned_end_timestamplong計画終了時刻 (ミリ秒)
external_idString外部システム(MES·ERP)のワークオーダー番号(100文字まで)。external_system とペアで識別される — 11.6
external_systemStringそのワークオーダーを発行した外部システム名(50文字まで) — 外部識別ペアのもう一方
customer_po_idStringこのワークオーダーが対応する顧客発注(PO)番号 (任意)
statusString(応答専用) 現在の状態 — 保存値 WAIT·START·PAUSED·END·ABORTED
isa95_stateString(応答専用) ISA-95 作業指示状態 — Ready·Running·Held·Completed·Aborted (11.1)
2026.11 に名称が変更されました — エイリアスなし

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_stringQuantityStringstring10進表記そのまま — 指数表記禁止、小数点は .、小数第4位まで。計数単位は整数
data_typeDataTypestringinteger(計数単位) または decimal(その他)。サーバが単位から決定する — リクエストでは省略可能であり、指定した場合は単位と一致しなければならない
unit_of_measureUnitOfMeasurestringUN/ECE Recommendation 20 共通コード — 下記許容リスト参照
値が文字列である理由

B2MML が QuantityString で定義しており、JSON 数値は多くのパーサーが double として読み込むため、10進精度の 損失が発生しやすいためです。SDK では Quantity.toBigDecimal() として読み込んで計算してください。リクエストを作成する際は Quantity.of("1250.5", "KGM") — data_type を空にすればサーバが補完します。

単位 — 許容リスト (UN/ECE Rec 20)​

コード意味data_type画面記号
EAeach — 個数integerEA
H87pieceintegerpc
C62one (unit)integerunit
BXbox — 箱数integerbox
SETset — セット·キット数integerset
KGMkilogramdecimalkg
GRMgramdecimalg
TNEtonnedecimalt
LTRlitredecimalL
MLTmillilitredecimalmL
MTQcubic metredecimalm³
MTRmetredecimalm
MTKsquare metredecimalm²
  • 許容単位は上記 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_quantitytarget_units + unitISA-95 MaterialRequirement.Quantity · ISO 22400 POQ
生産数量produced_quantitytotal_production_countISO 22400 PQ
良品数量good_quantitytotal_good_count · good_countISO 22400 GQ
廃棄数量scrap_quantitytotal_bad_count · bad_count — 定義が狭まった: 旧項目は不良全体、新項目は廃棄のみISO 22400 SQ
再作業数量rework_quantity(なし — 新項目)ISO 22400 RQ
計画外 良品 / 不良good_quantity_out_of_plan / scrap_quantity_out_of_planout_of_plan_good_count / out_of_plan_bad_count
計測 良品 / 不良 (PLC)measured_good_quantity / measured_scrap_quantitymeasured_good_count / measured_bad_count
補正 増減good_quantity_delta / scrap_quantity_deltagood_delta / bad_delta
補正 入力値entered_good_quantity / entered_scrap_quantityentered_good / entered_bad
検査数量inspected_quantityinspected_count
検査不良 合計inspected_scrap_quantityinspected_bad_count
不良記録 処置別scrap_quantity / rework_quantityscrap_count / rework_countISO 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)と MCP get_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_quantityPLC がカウントした良品·不良増分。処置不明のため不良は廃棄(SQ)
ワークオーダー OEE 行 mm_order_oee.total_production_countproduced_quantity · イベント pq/pq_quantity生産(PQ) = 良品 + 廃棄 + 再作業
mm_order_oee.total_good_countgood_quantity · gq/gq_quantity良品(GQ)
mm_order_oee.total_bad_count − total_rework_countscrap_quantity · sq/sq_quantity廃棄(SQ)。total_bad_count 自体(不良合)はワイヤに流れない
mm_order_oee.total_rework_countrework_quantity · rq/rq_quantity再作業(RQ)
mm_order_oee.out_of_plan_good_count / out_of_plan_bad_countgood_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_*_quantityPLC 計測値、訂正増減、REPLACE 入力値。廃棄項目は廃棄のみ
不良記録 mm_defect_record (処置 SCRAP/REWORK)/defects の quantity·inspected_quantity, 実績文書 defects.scrap_quantity / rework_quantity / inspected_scrap_quantity処置別廃棄·再作業、検査不良合計(SCRAP + REWORK)
mm_order.planned_quantityplanned_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.formatquantity_string が10進表記文字列ではない(指数表記·先頭0·+ 符号·数値型)、または data_type が単位と不一致である
quantity.scale小数第5位以上である
quantity.negative負数である(補正増減項目のみ負数を受け付ける)
quantity.range絶対値が 1014 以上 — 保存 numeric(18,4) の範囲外
  • 数量項目にオブジェクトではなく値(数値 500 等)を指定したり、quantity_string·data_type·unit_of_measure 以外のキーを入れた場合は 400 E1000 となります(形式エラー)。
  • ワークオーダーの計画数量は 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_CALCULATEDgood_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、片方が空の場合は 422 order.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)旧キー
planplanned_quantitytarget_units
quantitymeasured_good_quantity / measured_scrap_quantitymeasured_good / measured_bad
quantitygood_quantity / scrap_quantitygood / bad
quantity.correctiongood_quantity_delta / scrap_quantity_deltagood_delta / bad_delta
oeegood_quantity / scrap_quantitytotal_good_count / total_bad_count
defectsinspected_scrap_quantity / scrap_quantity / rework_quantityinspected_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_stateISA-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 / B2MMLPlantPulse V5備考
QuantityValueType — QuantityString · DataType · UnitOfMeasureQuantity — quantity_string · data_type · unit_of_measure1:1. B2MML の選択項目 Key は使用しない
UnitOfMeasure 値UN/ECE Rec 20 コード許容リストは 11.5 参照
Job Order の IDexternal_id発行システム名は external_system — 両者で1ペア
Job Order · MaterialRequirement の Quantityplanned_quantityISO 22400 POQ
Job Order の名称order_name
Job Order の StartTime · EndTimeplanned_start_timestamp · planned_end_timestamp計画時刻。実際時刻は actual_start_timestamp · actual_end_timestamp
Job Response実績文書1つ (/order/{id}/performance)
MaterialActual(Produced) の Quantityproduced_quantityISO 22400 PQ
そのうち良品good_quantityISO 22400 GQ
そのうちスクラップscrap_quantityISO 22400 SQ
そのうち再作業defects.rework_quantityISO 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);
}

次のステップ​