Overseas Warehouse Stocking Order to Kingdee Stepwise Transfer-Out: A Practical Configuration on Qeasy
What This Strategy Solves
A cross-border retail company keeps its overseas warehouse operations in Lingxing ERP while finance and inventory ledger live in Kingdee Cloud. Every morning the operations team approves a batch of "overseas warehouse stocking orders" that need to become corresponding "stepwise transfer-out documents" in Kingdee as inventory transfer vouchers. We use the Qeasy Data Integration Platform to own this link: the source side pulls data incrementally by create_time, the target side calls batchSave to commit documents in batch. The result is no manual re-entry and matched inventory figures on both sides.
Data Flow and Field Mapping
The whole chain is one-way B_TO_A: Lingxing ERP (source) → Qeasy middle layer → Kingdee Cloud (target).
The source uses a list-type query API for overseas warehouse inbound orders, sliced by create_time_from / create_time_to. The document key is overseas_order_no, and pagination uses page and page_size with a default of 20. The middle layer maps source fields into Kingdee's Model structure and hands them to the target's batchSave.
Key field mapping table:
| Business meaning | Source (Lingxing ERP) | Target (Kingdee Cloud) |
|---|---|---|
| Document number | overseas_order_no | FBillNo |
| Outgoing owner | (source org context) | FOwnerIdHead |
| Incoming owner | (source org context) | FOwnerTypeInIdHead |
| Document type | — | FBillTypeID (constant FBDC01_SYS) |
| Transfer type | — | FTransferBizType (constant InnerOrgTransfer) |
| Owner type | — | FOwnerTypeIdHead (constant BD_OwnerOrg) |
| Query window | create_time_from / create_time_to | — |
| Pagination | page / page_size | — |
| Date type | date_type (delivery_time) | — |
Constant fields (document type, transfer type, owner type) do not need to be fetched every run. Write them as constants in the middle layer so each schedule does not re-parse them.
How to Configure on Qeasy
When we use Qeasy for this, we split configuration into three actions:
- Source fetcher: choose WebAPI protocol, POST method, set effect to QUERY, keep
buildModeloff, and turnautoFillResponseon so the platform unfolds the response automatically. In the request body, bindcreate_time_fromto{{LAST_SYNC_TIME|datetime}}andcreate_time_toto{{CURRENT_TIME|datetime}}. - Middle-layer mapping: in Qeasy's field mapping canvas, drag source fields to target fields, keep
idCheckon for idempotency onoverseas_order_no, and write constants for fixed-value fields. - Target writer: also WebAPI, POST method, effect set to EXECUTE, calling
batchSaveto submit theModelarray in one shot.
We prefer to manage code mapping in Qeasy's dedicated mapping module, for example Lingxing warehouse ID ↔ Kingdee inventory org, and outgoing/incoming owner IDs ↔ Kingdee org master keys. This "centralized code mapping" pattern is common among Qeasy customers, so adding new orgs later does not require touching the flow diagram.
Implementation Steps
We typically roll out in three phases:
- Step 1: align the incremental start point. Set the source crontab to
10:55daily and the target crontab to12:55, leaving a two-hour buffer. Before the first batch, run a one-off full backfill and pinLAST_SYNC_TIMEto a business-confirmed historical point to avoid missing documents. - Step 2: trigger full load. Push all historical
overseas_order_nointo Kingdee as a baseline, then switch to daily incremental. - Step 3: schedule frequency. Run daily in production, with Qeasy's built-in retry and alerting. If volumes are high you can switch to hourly, but overseas warehouse stocking orders are usually approved in daytime batches, so daily is enough.
Many Qeasy customers follow the "incremental and full dual-track" pattern: daily incremental by create_time, plus a compensation task that uses idCheck for idempotent overwrites. It is stable and supports backfill.
Pitfall Recap
- Shipping without aligning the incremental start point: source
create_time_fromdefaults to 0, so Kingdee will receive all history in one go. The safe approach is full backfill first, then pointLAST_SYNC_TIMEat the backfill completion time. - Hard-coding page size to 1000 triggers rate limits: the source API comment says default 1000, but cross-border overnight batches will hit throttling. Start at 20 and grow gradually once stable.
- Constant fields re-fetched every request: document type and transfer type pulled from the source every run, polluting Kingdee if the source semantics change. Best practice is to keep constants in the middle layer.
- Header and body submitted together make failure hard to localize:
batchSavesubmits the whole document; if one line fails, the whole batch fails. In Qeasy, process header and body in stages — write the header first to getFID, then write the body referencing it — to shrink the retry granularity. This is the second common pattern among Qeasy customers. - Timezone and date format: source
create_timeuses local-time strings; passing them through to Kingdee directly shifts the day. Normalize to ISO8601 in the middle layer.
Where This Applies and Where It Does Not
Applies: cross-border retail/manufacturing companies where overseas stocking approval lives in Lingxing and the inventory ledger lives in Kingdee, and a daily transform from stocking order to transfer voucher is needed. Does not apply: scenarios requiring real-time (minute-level) inventory sync, or two-way reconciliation where the source needs Kingdee document status written back — those should be a separate strategy.