使用轻易云实现数据写入金蝶云星辰V2API的ETL过程

  • 轻易云集成顾问-何语琴
### 汤臣倍健营销云数据集成到金蝶云星辰V2案例分享 在现代企业的信息化建设中,系统之间的集成与对接已经成为必不可少的一环。本文将聚焦于汤臣倍健营销云(以下简称“汤臣倍健”)的数据如何高效、准确地集成到金蝶云星辰V2(以下简称“金蝶”)。我们选取了一个实际运行的方案——退货入库-(Life-Space)厦门众之健,为您详细解析这一过程。 为了确保整个数据集成过程中的稳定性和可靠性,我们采用了一系列先进技术手段,包括API接口调用、高效的数据写入、多层次的异常处理机制等。在此过程中,汤臣倍健提供了用于查询退货订单的API:/erp/api/order/query/saleReturnOrder,而金蝶则提供了用于写入销售进项单据的数据接口:/jdy/v2/scm/sal_in_bound。这两个核心接口分别负责获取源头数据与目标系统的数据写入。 首先,我们需要解决的问题是**如何确保从汤臣倍健获取的数据不漏单且及时**。为此,我们通过定时任务脚本,定期调用`/erp/api/order/query/saleReturnOrder`接口进行数据抓取,并配合分页和限流策略来处理大量数据。此外,为防止意外情况导致数据丢失或重复,我们引入了请求日志记录和重试机制,对每次请求返回结果进行验证与确认,以确保所有待转移的数据均被完整且准确地获取。 其次,在将这些数据传输到金蝶之前,还需应对不同系统间存在的**数据格式差异问题**。对此,我们编制了一套转换规则,将从汤臣倍健获得的JSON格式订单信息映射并转换为符合金碟要求的对象结构。这一步骤不仅涉及字段名及值类型之间的一一对应,更涵盖复杂规则下多层嵌套结构体间属性关系调整。 最后,当完成上述准备后,大量退货订单需要快速而成功地批量写入至金碟。因此,每条已适配好内容—单位退货明细通过调用其专用导入口径 `/jdy/v2/scm/sal_in_bound`, 按指定频率分批同步,并结合相应错误码返回说明, 实现场景错位智能纠偏操作乃至追溯原始出发点根本源真凭实证力行二進制档案再填充式. 综上所述,通过以上步骤可以实现可靠有效率滴水不漏般把控住返还统谈客逻辑变线全过程体验如丝般顺滑整洁无瑕疵. 后续文章里 ![用友与SCM系统接口开发配置](https://pic.qeasy.cloud/D33.png~tplv-syqr462i7n-qeasy.image) ### 调用汤臣倍健营销云接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用汤臣倍健营销云的`/erp/api/order/query/saleReturnOrder`接口,获取并加工退货入库相关的数据。 #### 接口配置与请求参数 首先,我们需要配置元数据,以便正确调用该API接口。以下是元数据配置的详细信息: ```json { "api": "/erp/api/order/query/saleReturnOrder", "effect": "QUERY", "method": "POST", "number": "number", "id": "id", "idCheck": true, "request": [ {"field":"tenantId","label":"经销商id","type":"string","describe":"经销商id(必填,营销云id)如:34cc4109705e4c058b7b3b0352e57d31","value":"xxx"}, {"field":"yxyNumber","label":"营销云销售订单号","type":"string","describe":"如:YD1215710122031701,传此参数时,其他时间状态等条件无效"}, {"field":"number","label":"系统订单号","type":"string","describe":"如:XOUT0000000293,传此参数时,其他时间状态等条件无效"}, {"field":"status","label":"订单状态","type":"string","describe":"0:未审核 1:已审核(已出库)","value":"1"}, {"field":"beginTime","label":"开始时间","type":"string","describe":"timeType为空或者0,基于创建时间查询,timeType为1,基于更新时间查询,格式:0000-00-00或0000-00-00 00:00:00,如果不传单号此字段必填","value":"{{LAST_SYNC_TIME|datetime}}"}, {"field":"endTime","label":"结束时间","type":"string","describe":"timeType为空或者0,基于创建时间查询,timeType为1,基于更新时间查询,格式:0000-00-00或0000-00-00 00:00:00,如果不传单号此字段必填","value":"{{CURRENT_TIME|datetime}}"}, {"field":"pageNo","label":"页码","type":"string","describe":"默认1","value":"1"}, {"field":"pageSize","label":"每页条数","type":"string","describe":"默认30","value":"30"}, {"field":"timeType","label":"时间段标志","type":"string","describe":"查询时间段标识,0:创建时间(默认),1:最后更新时间","value":"1"} ], "autoFillResponse": true } ``` #### 请求参数解析 1. **tenantId**: 经销商ID,这是一个必填项,用于标识具体的经销商。 2. **yxyNumber**: 营销云销售订单号,当传递此参数时,其它时间和状态条件将失效。 3. **number**: 系统订单号,当传递此参数时,其它时间和状态条件将失效。 4. **status**: 订单状态,此处我们设置为“已审核”(值为1)。 5. **beginTime**和**endTime**: 时间范围,用于指定查询的起止时间。如果不传递订单号,这两个字段是必填项。 6. **pageNo**和**pageSize**: 分页参数,用于控制每次请求返回的数据量。 7. **timeType**: 时间段标志,用于指定查询基于创建时间还是最后更新时间。 #### 数据请求与清洗 在发送请求之前,我们需要确保所有必要的参数都已正确设置。以下是一个示例请求: ```json { "tenantId": "34cc4109705e4c058b7b3b0352e57d31", "status": "1", "beginTime": "{{LAST_SYNC_TIME|datetime}}", "endTime": "{{CURRENT_TIME|datetime}}", "pageNo": "1", "pageSize": "30", "timeType": "1" } ``` 发送POST请求后,我们将接收到包含退货入库信息的响应数据。为了确保数据质量,我们需要对返回的数据进行清洗和验证。例如: - 检查每条记录是否包含必要的字段,如`number`和`id`。 - 验证日期格式是否正确,并转换为标准格式。 - 去除重复记录或无效数据。 #### 数据转换与写入 在完成数据清洗后,我们可以进行下一步的数据转换与写入操作。这一步通常包括: - 将清洗后的数据映射到目标系统所需的数据结构。 - 根据业务需求进行必要的数据转换,如单位换算、字段合并等。 - 最终,将处理好的数据写入目标数据库或系统中。 通过上述步骤,我们可以高效地从汤臣倍健营销云获取退货入库数据,并进行相应的处理,为后续业务流程提供可靠的数据支持。 ![金蝶与WMS系统接口开发配置](https://pic.qeasy.cloud/S24.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现退货入库数据写入金蝶云星辰V2API接口 在数据集成过程中,ETL(Extract, Transform, Load)是关键的一步。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行转换,并最终写入金蝶云星辰V2API接口。 #### 数据请求与清洗 在开始进行ETL转换之前,我们首先需要确保从源系统获取的数据是准确且完整的。这一步通常包括对原始数据的清洗和预处理,以便后续的转换操作能够顺利进行。 #### 数据转换与写入 接下来,我们将重点关注如何将清洗后的数据转换为金蝶云星辰V2API接口所能接受的格式,并最终写入目标平台。以下是元数据配置的详细解析及其应用。 ##### 元数据配置解析 ```json { "api": "/jdy/v2/scm/sal_in_bound", "effect": "EXECUTE", "method": "POST", "number": "id", "id": "id", "name": "id", "idCheck": true, "request": [ {"field":"bill_source","label":"来源","type":"string","value":"ISV"}, {"field":"bill_date","label":"出库日期","type":"string","describe":"出库日期,格式:2019-01-01","value":"{{auditTime|date}}"}, {"field":"customer_id","label":"客户","type":"string","describe":"客户","value":"_findCollection find id from 617d3b33-162f-3e9f-be59-14e1953bc4a0 where number={extCusCode}"}, {"field":"remark","label":"单据备注","type":"string","describe":"上传的附件url","value":"{remark}-来自营销云-{number}"}, {"field":"contact_address","label":"联系信息-详细地址","type":"string","describe":"联系信息-详细地址","value":"{shippingAddress}"}, {"field":"contact_linkman","label":"联系信息-联系人","type":"string","describe":"联系信息-联系人","value":"{contacts}"}, {"field":"contact_phone","label":"联系信息-联系方式","type":"string","describe":"联系信息-联系方式","value":"{phone}"}, {"field":"custom_field","label":"自定义字段","type":"object", "children":[{"field": "custom_field__1__28jianb2nq7c6u", "label": "备注", "type": "string", "value": "{remark}"}]}, { "field": "material_entity", "label": "商品分录", "type": "array", "describe": "商品分录", "value": "itemList", "children": [ {"field": "material_id", "label": "商品id", "type": "string", "describe": "商品id", "value": "_findCollection find id from 72029be6-c558-39a7-8084-4b75796fcba1 where number={{itemList.materialNumber}}" }, {"field": "stock_id", "label": "仓库id", "type": string, "describe": 仓库id, "value: 1277528293792323584" }, {"field: qty, "label: 数量, "type: int, "describe: 数量, "value: {{itemList.opernumber}}" }, {"field: tax_price, "label: 含税单价, "type: int, "describe: 含税单价, "value: {{itemList.taxunitprice}}" }, {"field: discount2, "label: 折扣, "type: string, "value: _findCollection find clevel_discount from 617d3b33-162f-3e9f-be59-14e1953bc4a0 where number={{itemList.extCusCode}}" }, {"field: is_free, "label: 是否赠品, "type: bool, "describe: 是否赠品, "value: false" }, {"field: unit_id, "label: 单位id, "type:string, "describe:单位id, value:_findCollection find base_unit_id from 72029be6-c558-39a7-8084-4b75796fcba1 where number={{itemList.materialNumber}} }, {"field:batch_no, label:批次号, type:string, describe:批次号, value:{{itemList._Flot}} }, {“ field:comment, label:行备注, type:string, describe:行备注, value:{{itemList.remark}} }, {“ field:kf_date, label:生产日期, type:string, describe:生产日期, value:{{itemList._Fmfg}} }, {“ field:valid_date, label:有效日期, type:string, describe:有效日期, value:“ {{itemList._Fexp}} }, {“ field:kf_period label保质期天数 type:string describe保质期天数 value730 } {“ field:kf_type label保质期类型 type:string describe保质期类型,1天,2月,3年 value1 } ] } ] } ``` ##### 配置解读与应用 1. **基础字段配置** - `bill_source`: 固定值为`ISV`,表示来源。 - `bill_date`: 使用模板变量`{{auditTime|date}}`来动态填充出库日期。 - `customer_id`: 利用`_findCollection`函数从指定集合中查找客户ID。 - `remark`: 动态生成备注内容,包括上传附件URL及来源信息。 - `contact_address`, `contact_linkman`, `contact_phone`: 分别对应详细地址、联系人和联系方式,这些字段直接从源数据中获取。 2. **自定义字段** - `custom_field`: 包含一个子字段`custom_field__1__28jianb2nq7c6u`,用于存储备注信息。 3. **商品分录** - `material_entity`: 是一个数组类型字段,包含多个子字段,用于描述每个商品条目。 - `material_id`: 使用`_findCollection`函数根据物料编号查找物料ID。 - `stock_id`: 固定值为`1277528293792323584`,表示仓库ID。 - `qty`, `tax_price`, `discount2`, `is_free`, `unit_id`, `batch_no`, `comment`, `kf_date`, `valid_date`, `kf_period`, `kf_type`: 分别对应数量、含税单价、折扣、是否赠品、单位ID、批次号、行备注、生产日期、有效日期、保质期天数和保质期类型。这些字段大多使用模板变量动态填充。 ##### 数据写入 配置完成后,通过POST请求将转换后的数据发送到金蝶云星辰V2API接口。具体实现如下: ```python import requests url = 'https://api.kingdee.com/jdy/v2/scm/sal_in_bound' headers = {'Content-Type': 'application/json'} data = { # 根据元数据配置生成的数据结构 } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print("Data successfully written to Kingdee Cloud.") else: print(f"Failed to write data. Status code: {response.status_code}") ``` 通过上述步骤,我们成功地将源平台的数据经过ETL转换后写入到金蝶云星辰V2API接口,实现了不同系统间的数据无缝对接。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/T7.png~tplv-syqr462i7n-qeasy.image)