Business プラン以上では、GraphQL エンドポイントで 12 個の書き込みミューテーションを利用できます。作業指示・資産・部品の作成/更新/削除に加え、在庫移動用の adjustStock があります。ミューテーションはアプリ本体と同じサービスを経由するため、監査ログ、通知、参照番号の自動採番(WO-XX、ASS-XX、PART-XX)はすべてまったく同じように動作します。11 個目の addMeterReading は、メーターの検針値(稼働時間、カウンター)を記録します(後述)。12 個目の setPurchaseOrderErpReference は、ERP 側の伝票番号を発注書に書き込みます(FULL アクセスのキーのみ)。このミューテーションは Webhook を一切発生させないため、ERP が自身の書き込みを受け取ることはありません。
利用可能な突然変異
- createWorkOrder(input) → WorkOrder
- updateWorkOrder(id, input) → WorkOrder
- deleteWorkOrder(id) → DeleteResult
- createAsset(input) → Asset
- updateAsset(id, input) → Asset
- deleteAsset(id, force?) → DeleteResult
- createPart(input) → Part
- updatePart(id, input) → Part
- deletePart(id, force?) → DeleteResult
- adjustStock(id, quantity, reason?, vendorId?, documentNumber?) → Part
- addMeterReading(meterId, value?, incrementValue?, date?, notes?, confirmRegression?) → MeterReading
- setPurchaseOrderErpReference(id, erpReference?) → PurchaseOrder
入力形状
各ミューテーションには安全なフィールドだけを含む InputType があり、companyId、sequenceNumber、reference、createdById はサーバー側で設定されます。渡すのは title、description、status、priority、assetId、locationId などだけです。部品の入力では barcode、maxStockLevel、locationId、vendorId も指定でき、quantity/minQuantity/maxStockLevel には小数(例:0.5)を使えます。列挙型のフィールドは検証されます。priority は LOW、MEDIUM、HIGH、CRITICAL のいずれか、作業指示の status は OPEN、SCHEDULED、IN_PROGRESS、ON_HOLD、COMPLETED、VALIDATED、CANCELLED、CLOSED のいずれか、資産の status は OPERATIONAL、DEGRADED、DOWN、MAINTENANCE、STANDBY、RETIRED のいずれかでなければなりません。それ以外の値は BAD_REQUEST で拒否されます。部品の入力では customReference も指定できます。これは自社でその部品に付けている独自のコード(たとえば ERP のコード)で、part(barcode:) で照合されます。一意性は強制されないため、一意であることは自社側で保証してください。
例: 作業指示書を作成する
作業指示を作成する: mutation($i: WorkOrderCreateInput!) { createWorkOrder(input: $i) { id title reference status createdAt } } 変数は {"i": {"title": "Pump #3 leak", "priority": "HIGH"}}
在庫の調整
部品の数量を変更するには、符号付きの増減値を指定して adjustStock を使用します(消費はマイナス、入庫はプラス)。数量の更新と StockMovement 監査レコードの書き込みを 1 つのアトミックなトランザクションで行い、在庫がゼロを下回ることはありません。在庫をロケーションごとに管理している部品では locationId を渡してください。在庫変動はそのロケーションに適用されます。渡さない場合、呼び出しは拒否され、errors[0].extensions.code は BAD_REQUEST、extensions.reason は LOCATION_STOCK_REQUIRES_LOCATION になります。一方、updatePart(quantity) は絶対値を設定します。ロケーションごとに管理している部品では同じ理由で拒否され、それ以外の部品では差分を ADJUSTMENT の在庫変動として記録します。入荷元を記録することもできます。vendorId と documentNumber(仕入先の請求書番号または納品書番号、最大 64 文字)は在庫変動そのものに保存されるため、履歴で誰が納品したか、どの伝票によるものかを確認できます。どちらも任意で、通常の消費ではどちらも送信しません。仕入先は自社に属している必要があります。
メーター検針値の記録
addMeterReading はメーター(稼働時間、カウンター、走行距離計、ゲージ)に検針値を記録します。外部システム(SCADA、PLC ゲートウェイ、ERP)から、誰も数値を手入力することなくメーターベースの予防保全に値を供給できます。まずメーターの id を確認します: query { meters(assetId: 7) { id reference name unit type lastReadingValue lastReadingDate } } 次に value(メーターが示す累計の絶対値)か incrementValue(例: 前回の検針以降の稼働時間。サーバーが前回の検針値に加算します)の、どちらか一方だけを送ります: mutation { addMeterReading(meterId: 12, value: 1250.5, date: "2026-09-25T06:00:00Z") { id value date isAnomaly } } date は省略可能(ISO 8601、既定値は現在時刻)で、過去の日時は指定できますが未来の日時は指定できません。RUNTIME と COUNTER のメーターでは、前回の検針値より小さい値は BAD_REQUEST で拒否されます。メーターのリセットや交換の後は confirmRegression: true を付けて再送してください。検針値はアプリのメーター画面と同じサービスを通るため、最新の検針値であれば、メータートリガーとメーターベースの予防保全は技術者が入力した場合とまったく同じように動作します。このミューテーションには FULL アクセスのキーが必要です。
帰属
すべてのミューテーションは、キーの所有者(キーがその人として動作する人物)として、その人の権限とデータの可視範囲で実行され、監査ログにはその人の名前が記録されます。所有者自身が承認できる場合でも、キーがワークフローステップを承認することはありません。
安全な再試行(Idempotency-Key)
ネットワークのタイムアウトでは、ミューテーションが実行されたかどうかは分かりません。書き込みを行うすべてのリクエストに Idempotency-Key ヘッダー(8〜64 文字の英字・数字・ハイフン。UUID で構いません)を付け、再試行するときは同じキーを送ってください。7 日間は、同じキーでの再試行はミューテーションを再実行せず、最初の呼び出しで保存された結果を返します(レスポンスには "Idempotent-Replayed: true" が付きます)。作業指示が二重に作られることも、在庫移動が二重に記録されることもありません。
- 書き込み 1 件につきキーは 1 つです。エイリアス付きのミューテーションを複数含むリクエストでは、各ミューテーションがそのキーのもとで個別に記録されます。送信された値は比較されません。同じキーで値を変えて送っても、最初の呼び出しの結果が返されます。
- 失敗した呼び出しは何も残しません。同じキーで再試行すると、もう一度実行されます。
- IDEMPOTENCY_KEY_REUSED — このキーで、同じ名前(フィールドまたはエイリアス)がすでに別のミューテーションを実行したか、別の呼び出し元がこのキーを使用しました。新しい書き込みには新しいキーを使用してください。
- IDEMPOTENCY_IN_PROGRESS — 最初の呼び出しがまだ実行中です。数秒待ってから再試行してください。
よくあるエラー
- GRAPHQL_VALIDATION_FAILED — 入力の構造が一致しません(必須の title がない場合など)
- BAD_REQUEST — 値の検証に失敗しました(title が 500 文字を超えるなど)
- FORBIDDEN — プランが Business 未満です
- NOT_FOUND — id が存在しないか、別の会社のものです
- FORBIDDEN — キーのアクセスレベルが不足しています(READ キーでミューテーションを呼び出した場合など)
ヒント
関連記事
このページは役に立ちましたか?