Authoritative Tutorial: Jky Assembly/Disassembly Outbound Order Query Interface Field Handbook
What Problem This Interface Solves
In supply chain integration scenarios between Jky and ERP systems like Kingdee Cloud Flagship Edition, assembly/disassembly outbound orders are the key vouchers connecting inventory movements with financial accounting. This interface (erp.storage.goodsdocout.v2) filters assembly/disassembly-type outbounds with a fixed inouttype=207, incrementally pulls the master and detail rows by creation time, and feeds downstream assembly/disassembly order mapping, cost and batch tracing.
Interface Capability Overview
- Authentication: Jky Open Platform AppKey/AppSecret signature auth; AccessToken carried in request header.
- Request structure: POST form/JSON. Core parameters:
startDate,endDate,inouttype(fixed 207),pageIndex,pageSize(default 50),selelctFields(comma-joined). - Response structure: JSON object with
data.list(master array, each carryinggoodsDocDetailList) anddata.total. - Pagination / Incremental: Paging via
pageIndex/pageSize, default 50 per page; incremental cursor uses thegmtCreatewindow from{{LAST_SYNC_TIME}}to{{CURRENT_TIME}}. - Schedule: Production commonly uses
1-59/5 6-23 * * *, every 5 minutes from 06:00 to 23:00 daily.
Typical Field Mapping
| Field | Type | Meaning | Practical Notes |
|---|---|---|---|
| recId | string | Master unique ID in Jky | metadata id field; anchor for cross-system reconciliation |
| goodsdocNo | string | Outbound business code | metadata number field; bridge for business references |
| billNo | string | Related order no. (assembly/disassembly) | One-to-one with Kingdee assembly order no. for idempotent dedup |
| inouttype | string | Outbound type code | Always pass "207"; omitting it pulls the full set |
| inouttypeName | string | Display name | Use for logs/exceptions, not as a code |
| gmtCreate | string | Creation time | Incremental anchor; timezone +0800 |
| redStatus | string | Reversal status (1 blue / 2 reversed / 9 reversal) | Filter reversals downstream or write them back |
| financeBillStatus | string | Finance status (1/11/21/25/31) | Only 21/25 are bookable; add a conditional branch in the Qeasy field mapper |
| warehouseCode / warehouseName | string | Warehouse code / name | Names change; always use the code for cross-system mapping |
| companyCode / companyName | string | Company code / name | Codes are the stable key in multi-org scenarios |
| vendCustomerCode | string | BP code | Often null for internal assembly; tolerate null |
| goodsDocDetailList.recId | string | Detail row primary key | Key to idempotent write-back |
| goodsNo / skuId / skuBarcode | string | Material code / SKU ID / barcode | Prefer goodsNo for primary match; SKU for spec enrichment |
| batchNo / batchNumber | string | Batch no. / batch code | Critical for shelf-life industries; never drop |
| quantity / unitName | string | Quantity / unit | Apply unit conversion in Qeasy's mapper |
| estPrice / estCost / estTax / taxRate | string | Estimated price/cost/tax/tax rate | Use with trans* series; assembly usually uses est* |
| transHasTaxAmount / transNoTaxAmount | string | Transaction tax-included / tax-excluded amount | Bookable fields; cross-check with transTaxAmount |
| field1 | string | Master / detail custom fields | Reserved for customers; Qeasy can pass through |
How to Configure on Qeasy
On the Qeasy data integration platform, this interface is usually accessed via the "Jky Adapter + Query Strategy" combination:
- Adapter selection: Pick the built-in "Jky ERP Adapter" with
erp.storage.goodsdocout.v2. Fill in AppKey/AppSecret on the auth page; the platform auto-renews the token. - Request parameter wrapping: In the strategy canvas, hardcode
inouttype=207. BindstartDate/endDateto Qeasy's built-inLAST_SYNC_TIME/CURRENT_TIMEvariables.pageSizedefaults to 50;selelctFieldsis automatically trimmed by the platform's "Field Mapper" based on the fields actually referenced on the canvas, avoiding the overhead of pulling all columns. - Field Mapper: The platform auto-flattens
goodsDocDetailListinto a master-detail dual-stream. Master'srecId/goodsdocNoflows to the target header; detail rows'recId/goodsNo/quantity/batchNoflow to the target lines; customfield1~5go through the passthrough channel. - Dedup & idempotency: Write
recId + goodsDocDetailList.recIdas the idempotency key into Qeasy's "Primary Key Dedup" node to prevent duplicate writes. - Target = empty write: This is a pure-query strategy; configure the target side in Qeasy as "empty write", only landing data into the staging table for downstream consumers.
Cross-Project Practical Highlights
inouttypemust be fixed to 207: In multiple customer projects, omitting or mis-passing this field caused the interface to mix in sales outbounds / transfer outbounds, leading to wrong document types on the Kingdee side.- Incremental window keyed on
gmtCreate: Don't useinOutDate(business date). Cross-month adjustments or unapproval scenarios will lose data. Qeasy'sLAST_SYNC_TIMEdefaults togmtCreate— safe choice. - Dual anchor (primary key + doc no.) for dedup: Use
recIdfor idempotency,goodsdocNofor business reconciliation. The same applies to detail rows:goodsDocDetailList.recIdmust flow to the target. - Pick one of the two price sets:
est*(estimated) andtrans*(transaction) coexist. Assembly/disassembly typically usesest*; lock down one set in Qeasy's mapper to avoid cost volatility on the Kingdee side. - Reversal & finance status linkage:
redStatus=9(reversal) must trigger a reverse write-back downstream. Documents withfinanceBillStatus<21should not be used for booking — add a filter in the mapper. - Pagination 50 + 5-min schedule: One round every 5 minutes, 50 per page, stable for customers with under 10k daily documents. Qeasy auto-concurrent-paginates for burst backlogs — no manual tuning needed.
Pitfall Retrospective
- Missing
inouttype=207mixed in sales outbounds: A retail customer's first launch did not hardcodeinouttype, syncing sales outbounds into Kingdee assembly orders and generating massive wrong documents. Safe practice: hardcodeinouttypeas a constant in the Qeasy adapter; never expose it as a variable. - Using business date as incremental key lost data: A customer used
inOutDate; after an unapproval modified the business date, the next 7 days of data were all missed. Safe practice: always usegmtCreateas the incremental key — Qeasy defaults to this. - Detail row primary key not passed through caused duplicate writes: The target Kingdee assembly order did not persist Jky detail
recId, so subsequent re-pushes duplicated. Safe practice: always write detailrecIdback as a custom field on the target document. field1~5silently trimmed by Qeasy: An early platform version dropped custom fields not referenced on the canvas, causing customer extension data loss. Safe practice: enable "passthrough unreferenced fields" in the Qeasy adapter, or explicitly list them inselelctFields.- Timezone misalignment drifted the incremental window: A private deployment server was on UTC; when the +0800 business evening tick fired, trailing data was truncated. Safe practice: standardize Qeasy deployments on
Asia/Shanghaiand explicitly declaregmtCreateas +0800 in the adapter.
When to Use
Suitable for assembly/disassembly integration between Jky and a downstream ERP (typically Kingdee Cloud Flagship Edition) where incremental sync of inouttype=207 outbound master and detail is required. If the target side needs no write and only stock ledger reconciliation, this pure-query interface is sufficient; if writing back to Kingdee assembly/disassembly orders, pair it with downstream SYNC strategies.