Danh sách tác vụ kho
listWmsTasks · WMS · task:read
TaskPage · lược đồ
cURL
Sao chép
curl --request GET \
"https://factoryflow-api.example.invalid/wms/v1/tasks" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001"
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001'}
data = None
request = urllib.request.Request(base + "/wms/v1/tasks", data=data, headers=headers, method="GET")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wms/v1/tasks"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.GET();
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 200
Dữ liệu tĩnh, không request nào được gửi.
{
"items": [
{
"id": "DEMO-TASK",
"status": "CREATED",
"version": 1
}
],
"nextCursor": "DEMO-NEXT"
}
400 · 401 · 403 · 429 · 503 → application/problem+json
Giới hạn trang và cursor theo contract; cursor không hợp lệ cần
bắt đầu lại truy vấn, không diễn giải là hết task.
Điều kiện lỗi và xử lý
Với listWmsTasks: 401/403 yêu cầu kiểm danh tính, scope và site;
không retry để vượt quyền. Đối tượng không tìm thấy cần kiểm ID
và phạm vi; không suy là nhiệm vụ thất bại.
Tạo tác vụ kho
createWmsTask · WMS · task:create
Nội dung yêu cầu mẫu
{
"taskType": "TRANSFER",
"siteId": "DEMO-SITE",
"warehouseId": "DEMO-WH",
"sourceLocationId": "DEMO-A",
"targetLocationId": "DEMO-B",
"lines": [
{
"skuId": "DEMO-SKU",
"quantity": 1,
"uom": "EA"
}
],
"executionMode": "AMR"
}
Theo DTO nguồn: TRANSFER/PICK cần sourceLocationId;
PUTAWAY/TRANSFER/REPLENISH cần targetLocationId. siteId phải khớp
ngữ cảnh được phép. Các quy tắc có điều kiện được dịch vụ miền
kiểm tra.
TaskRequest · lược đồ
Task · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/wms/v1/tasks" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'taskType': 'TRANSFER', 'siteId': 'DEMO-SITE', 'warehouseId': 'DEMO-WH', 'sourceLocationId': 'DEMO-A', 'targetLocationId': 'DEMO-B', 'lines': [{'skuId': 'DEMO-SKU', 'quantity': 1, 'uom': 'EA'}], 'executionMode': 'AMR'}).encode("utf-8")
request = urllib.request.Request(base + "/wms/v1/tasks", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wms/v1/tasks"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 201
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-TASK",
"status": "CREATED",
"version": 1
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
TRANSFER thiếu nguồn hoặc đích bị chặn; SKU/UOM sai cần sửa
mapping trước tạo.
Điều kiện lỗi và xử lý
Với createWmsTask: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.
GET /wms/v1/tasks/{taskId}#
Tra cứu tác vụ kho
getWmsTask · WMS · task:read
Task · lược đồ
cURL
Sao chép
curl --request GET \
"https://factoryflow-api.example.invalid/wms/v1/tasks/DEMO-ID" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001"
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001'}
data = None
request = urllib.request.Request(base + "/wms/v1/tasks/DEMO-ID", data=data, headers=headers, method="GET")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wms/v1/tasks/DEMO-ID"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.GET();
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 200
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-TASK",
"status": "IN_PROGRESS",
"version": 3
}
400 · 401 · 403 · 429 · 503 · 404 → application/problem+json
Kiểm task thuộc site được phép; status COMPLETED phải được hiểu
trong miền WMS.
Điều kiện lỗi và xử lý
Với getWmsTask: 401/403 yêu cầu kiểm danh tính, scope và site;
không retry để vượt quyền. Đối tượng không tìm thấy cần kiểm ID
và phạm vi; không suy là nhiệm vụ thất bại.
POST /wms/v1/tasks/{taskId}/confirm#
Xác nhận nghiệp vụ
confirmWmsTask · WMS · task:execute
Ngữ cảnh ví dụ: {"beforeStatus": "IN_PROGRESS", "beforeVersion":
3, "afterStatus": "COMPLETED", "afterVersion": 4, "condition":
"Bằng chứng scan hợp lệ và đủ quyền đối tượng/site"}
Nội dung yêu cầu mẫu
{
"confirmationType": "SCAN",
"expectedVersion": 3,
"evidenceRef": "DEMO-SCAN"
}
Confirmation · lược đồ
Task · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/wms/v1/tasks/DEMO-ID/confirm" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'confirmationType': 'SCAN', 'expectedVersion': 3, 'evidenceRef': 'DEMO-SCAN'}).encode("utf-8")
request = urllib.request.Request(base + "/wms/v1/tasks/DEMO-ID/confirm", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wms/v1/tasks/DEMO-ID/confirm"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 200
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-TASK",
"status": "COMPLETED",
"version": 4
}
400 · 401 · 403 · 429 · 503 · 404 · 409 · 422 →
application/problem+json
Scan thiếu hoặc expectedVersion cũ chặn xác nhận; đọc lại task và
xác minh bằng chứng.
Điều kiện lỗi và xử lý
Với confirmWmsTask: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.
POST /wcs/v1/execution-orders#
Tạo lệnh thực thi
createExecutionOrder · WCS ·
wcs:dispatch
Nội dung yêu cầu mẫu
{
"taskId": "DEMO-TASK",
"expectedTaskVersion": 2,
"routeRef": "DEMO-ROUTE"
}
ExecutionRequest · lược đồ
Execution · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/wcs/v1/execution-orders" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'taskId': 'DEMO-TASK', 'expectedTaskVersion': 2, 'routeRef': 'DEMO-ROUTE'}).encode("utf-8")
request = urllib.request.Request(base + "/wcs/v1/execution-orders", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wcs/v1/execution-orders"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 201
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-EXE",
"taskId": "DEMO-TASK",
"status": "CREATED",
"version": 1
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
Task chưa phát hành hoặc version không khớp: giữ yêu cầu, trả về
bên WMS xử lý.
Điều kiện lỗi và xử lý
Với createExecutionOrder: 401/403 yêu cầu kiểm danh tính, scope
và site; không retry để vượt quyền. Request ghi phải giữ
key/body khi retry; khác body cần ý định mới sau khi đối soát.
POST /wcs/v1/execution-orders/{orderId}/dispatch#
Điều phối lệnh thực thi
dispatchExecutionOrder · WCS ·
wcs:dispatch
Ngữ cảnh ví dụ: {"beforeStatus": "PLANNED", "beforeVersion": 2,
"afterStatus": "DISPATCHING", "afterVersion": 3, "condition":
"Tuyến đã duyệt, executor sẵn sàng và safety cho phép"}
Nội dung yêu cầu mẫu
{
"expectedVersion": 2,
"executorRef": "DEMO-EXECUTOR",
"policyRef": "DEMO-POLICY"
}
DispatchRequest · lược đồ
Execution · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/wcs/v1/execution-orders/DEMO-ID/dispatch" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'expectedVersion': 2, 'executorRef': 'DEMO-EXECUTOR', 'policyRef': 'DEMO-POLICY'}).encode("utf-8")
request = urllib.request.Request(base + "/wcs/v1/execution-orders/DEMO-ID/dispatch", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wcs/v1/execution-orders/DEMO-ID/dispatch"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 202
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-EXE",
"taskId": "DEMO-TASK",
"status": "DISPATCHING",
"version": 3
}
400 · 401 · 403 · 429 · 503 · 404 · 409 · 422 →
application/problem+json
Sai route, executor không sẵn sàng hoặc safety không đạt: giữ chưa
dispatch; 202 không là hoàn thành.
Điều kiện lỗi và xử lý
Với dispatchExecutionOrder: 401/403 yêu cầu kiểm danh tính,
scope và site; không retry để vượt quyền. Request ghi phải giữ
key/body khi retry; khác body cần ý định mới sau khi đối soát.
GET /wcs/v1/execution-orders/{orderId}#
Đối soát thực thi
getExecutionOrder · WCS · wcs:read
Execution · lược đồ
cURL
Sao chép
curl --request GET \
"https://factoryflow-api.example.invalid/wcs/v1/execution-orders/DEMO-ID" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001"
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001'}
data = None
request = urllib.request.Request(base + "/wcs/v1/execution-orders/DEMO-ID", data=data, headers=headers, method="GET")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/wcs/v1/execution-orders/DEMO-ID"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.GET();
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 200
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-EXE",
"taskId": "DEMO-TASK",
"status": "EXECUTING",
"version": 4
}
400 · 401 · 403 · 429 · 503 · 404 → application/problem+json
Nếu UNKNOWN, tra mission/controller và callback; không tự đổi sang
FAILED.
Điều kiện lỗi và xử lý
Với getExecutionOrder: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Đối tượng không tìm thấy cần
kiểm ID và phạm vi; không suy là nhiệm vụ thất bại.
Tạo nhiệm vụ robot
createMission · Fleet · fleet:manage
Nội dung yêu cầu mẫu
{
"executionId": "DEMO-EXE",
"pickupPoint": "DEMO-A",
"dropoffPoint": "DEMO-B",
"fleetProfile": "DEMO-FLEET"
}
MissionRequest · lược đồ
Mission · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/fleet/v1/missions" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'executionId': 'DEMO-EXE', 'pickupPoint': 'DEMO-A', 'dropoffPoint': 'DEMO-B', 'fleetProfile': 'DEMO-FLEET'}).encode("utf-8")
request = urllib.request.Request(base + "/fleet/v1/missions", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/fleet/v1/missions"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 201
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-MISSION",
"status": "CREATED"
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
Execution đã có mission: đối soát ID cũ; không tạo lại vì response
bị mất.
Điều kiện lỗi và xử lý
Với createMission: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.
GET /fleet/v1/missions/{missionId}#
Tra cứu nhiệm vụ
getMission · Fleet · fleet:read
Mission · lược đồ
cURL
Sao chép
curl --request GET \
"https://factoryflow-api.example.invalid/fleet/v1/missions/DEMO-ID" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001"
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001'}
data = None
request = urllib.request.Request(base + "/fleet/v1/missions/DEMO-ID", data=data, headers=headers, method="GET")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/fleet/v1/missions/DEMO-ID"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.GET();
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 200
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-MISSION",
"status": "CREATED"
}
400 · 401 · 403 · 429 · 503 · 404 → application/problem+json
ID không thấy có thể do profile hoặc mapping; kiểm Fleet nguồn
trước phát nhiệm vụ khác.
Điều kiện lỗi và xử lý
Với getMission: 401/403 yêu cầu kiểm danh tính, scope và site;
không retry để vượt quyền. Đối tượng không tìm thấy cần kiểm ID
và phạm vi; không suy là nhiệm vụ thất bại.
POST /robot-cell/v1/cell-jobs#
Tạo công việc trạm robot
createCellJob · Cell ·
robot-cell:operate
Nội dung yêu cầu mẫu
{
"executionId": "DEMO-EXE",
"cellId": "DEMO-CELL",
"recipeId": "DEMO-RECIPE",
"recipeVersion": "1"
}
CellRequest · lược đồ
CellJob · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/robot-cell/v1/cell-jobs" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'executionId': 'DEMO-EXE', 'cellId': 'DEMO-CELL', 'recipeId': 'DEMO-RECIPE', 'recipeVersion': '1'}).encode("utf-8")
request = urllib.request.Request(base + "/robot-cell/v1/cell-jobs", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/robot-cell/v1/cell-jobs"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 201
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-JOB",
"status": "CREATED",
"recipeVersion": "1"
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
Recipe/program không khớp hoặc cell không ready: chặn job; kỹ sư
cell kiểm bản và mode.
Điều kiện lỗi và xử lý
Với createCellJob: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.
POST /devices/v1/devices/{deviceId}/commands#
Gửi ý định lệnh thiết bị
createDeviceCommand · Device ·
device:command
Nội dung yêu cầu mẫu
{
"commandType": "START_JOB",
"expectedVersion": 1,
"policyRef": "DEMO-POLICY"
}
CommandRequest · lược đồ
Command · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/devices/v1/devices/DEMO-ID/commands" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'commandType': 'START_JOB', 'expectedVersion': 1, 'policyRef': 'DEMO-POLICY'}).encode("utf-8")
request = urllib.request.Request(base + "/devices/v1/devices/DEMO-ID/commands", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/devices/v1/devices/DEMO-ID/commands"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 202
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-COMMAND",
"status": "CREATED"
}
400 · 401 · 403 · 429 · 503 · 404 · 409 · 422 →
application/problem+json
Lệnh ngoài allowlist hoặc interlock không đạt: từ chối; không gửi
raw command thay thế.
Điều kiện lỗi và xử lý
Với createDeviceCommand: 401/403 yêu cầu kiểm danh tính, scope
và site; không retry để vượt quyền. Request ghi phải giữ
key/body khi retry; khác body cần ý định mới sau khi đối soát.
POST /device-callback/v1/fleet-events#
Tiếp nhận phản hồi đội robot
receiveFleetEvent · Callback ·
fleet:event
Nội dung yêu cầu mẫu
{
"eventId": "DEMO-EVENT",
"correlationId": "00000000-0000-4000-8000-000000000001",
"entityId": "DEMO-MISSION",
"entityVersion": 9,
"eventType": "mission.status.changed",
"occurredAt": "2026-10-26T00:00:00Z",
"schemaVersion": "1.0",
"source": "DEMO-FLEET-ADAPTER",
"payload": {
"status": "COMPLETED",
"executionId": "DEMO-EXE"
}
}
Callback · lược đồ
Receipt · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/device-callback/v1/fleet-events" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'eventId': 'DEMO-EVENT', 'correlationId': '00000000-0000-4000-8000-000000000001', 'entityId': 'DEMO-MISSION', 'entityVersion': 9, 'eventType': 'mission.status.changed', 'occurredAt': '2026-10-26T00:00:00Z', 'schemaVersion': '1.0', 'source': 'DEMO-FLEET-ADAPTER', 'payload': {'status': 'COMPLETED', 'executionId': 'DEMO-EXE'}}).encode("utf-8")
request = urllib.request.Request(base + "/device-callback/v1/fleet-events", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/device-callback/v1/fleet-events"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 202
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-RECEIPT",
"status": "RECEIVED"
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
eventId trùng được khử trùng; entityVersion cũ được đối soát theo
contract, không ghi lùi trạng thái.
Điều kiện lỗi và xử lý
Với receiveFleetEvent: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.
POST /exceptions/v1/exceptions#
Mở ngoại lệ vận hành
raiseException · Exception ·
exception:create
Nội dung yêu cầu mẫu
{
"entityId": "DEMO-MISSION",
"reasonCode": "DEMO_TIMEOUT",
"evidenceRef": "DEMO-TRACE",
"ownerRef": "DEMO-OWNER"
}
ExceptionRequest · lược đồ
Exception · lược đồ
cURL
Sao chép
curl --request POST \
"https://factoryflow-api.example.invalid/exceptions/v1/exceptions" \
--header "Authorization: Bearer ${FACTORYFLOW_ACCESS_TOKEN}" \
--header "X-Tenant-Id: DEMO-TENANT" \
--header "X-Site-Id: DEMO-SITE" \
--header "X-Correlation-Id: 00000000-0000-4000-8000-000000000001" \
--header "X-Idempotency-Key: DEMO-KEY" \
--header "Content-Type: application/json" \
--data-binary @request.json
Python
Sao chép
import json, os, urllib.request
base = "https://factoryflow-api.example.invalid"
headers = {'Authorization': 'Bearer ' + os.environ['FACTORYFLOW_ACCESS_TOKEN'], 'X-Tenant-Id': 'DEMO-TENANT', 'X-Site-Id': 'DEMO-SITE', 'X-Correlation-Id': '00000000-0000-4000-8000-000000000001', 'X-Idempotency-Key': 'DEMO-KEY', 'Content-Type': 'application/json'}
data = json.dumps({'entityId': 'DEMO-MISSION', 'reasonCode': 'DEMO_TIMEOUT', 'evidenceRef': 'DEMO-TRACE', 'ownerRef': 'DEMO-OWNER'}).encode("utf-8")
request = urllib.request.Request(base + "/exceptions/v1/exceptions", data=data, headers=headers, method="POST")
# Không gửi request trong ví dụ offline.
Java
Sao chép
var builder = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://factoryflow-api.example.invalid/exceptions/v1/exceptions"))
.header("Authorization", "Bearer " + System.getenv("FACTORYFLOW_ACCESS_TOKEN"))
.header("X-Tenant-Id", "DEMO-TENANT")
.header("X-Site-Id", "DEMO-SITE")
.header("X-Correlation-Id", "00000000-0000-4000-8000-000000000001")
.header("Content-Type", "application/json")
.header("X-Idempotency-Key", "DEMO-KEY")
.POST(java.net.http.HttpRequest.BodyPublishers.ofFile(java.nio.file.Path.of("request.json")));
var request = builder.build();
// Không gửi trong ví dụ offline.
Xem phản hồi mẫu · 201
Dữ liệu tĩnh, không request nào được gửi.
{
"id": "DEMO-EXCEPTION",
"status": "CREATED"
}
400 · 401 · 403 · 429 · 503 · 409 · 422 → application/problem+json
reasonCode và đối tượng phải đủ ngữ cảnh; chuyển người xử lý khi
kết quả thực chưa rõ.
Điều kiện lỗi và xử lý
Với raiseException: 401/403 yêu cầu kiểm danh tính, scope và
site; không retry để vượt quyền. Request ghi phải giữ key/body
khi retry; khác body cần ý định mới sau khi đối soát.