借助轻易云平台完成ETL转换并写入金蝶云星空的技术实践

  • 轻易云集成顾问-孙传友
### 聚水潭盘盈单对接金蝶其他入库单ok 数据集成在企业信息系统协同工作中起着关键作用,特别是在涉及多平台的数据传输时。本文分享一个实际案例:如何通过轻易云数据集成平台,将聚水潭的盘盈单精准对接到金蝶云星空的其他入库单。 为了实现这一目标,我们需要确保几个关键技术点: 1. **可靠抓取聚水潭接口数据:** 使用聚水潭提供的 `inventory.count.query` API 定时获取最新的盘盈数据信息。此API允许我们查询特定时间段内所有新增或更新过的数据记录,保证不遗漏任何重要数据。 2. **处理分页和限流问题:** 由于 `inventory.count.query` API 返回的数据可能非常庞大,所以需要进行分页处理,并遵守API调用频率限制,以免触发限流机制。这一步骤至关重要,以确保稳定、高效地获取全部必要数据。 3. **大量数据快速写入到金蝶云星空:** 获取到完整、正确的盘盈记录后,需要通过金蝶云星空提供的 `batchSave` API 批量写入这些数据。批量操作能够显著提升系统性能与运行效率,但同时也要求我们细致检查每一条记录是否符合输入规范。 4. **处理数据格式差异:** 聚水潭与金蝶云星空之间的数据结构存在差异,我们必须进行详细分析并实施相应转换,使得跨平台传输过程中保持一致性和准确性。例如,对日期格式、数值单位等字段进行标准化转换,是避免潜在错误的重要环节。 5. **异常处理及重试机制:** 在整个对接流程中,不可避免会遇到网络故障、服务器响应超时等异常情况。因此,设计一个健壮的错误检测及重试机制尤为必要,这样可以保证即使部分上传失败,也能自动重新尝试直至成功,同时有效日志记录便于后续审计跟踪和问题排查。 本文将详细讲解这些步骤中的每个技术要点,展示如何利用高效可靠的方法,实现从聚水潭到金蝶云星空完美无缝的数据集成。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/D36.png~tplv-syqr462i7n-qeasy.image) ### 调用聚水潭接口inventory.count.query获取并加工数据的技术案例 在数据集成过程中,调用源系统的API接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用聚水潭的`inventory.count.query`接口,获取盘盈单数据并进行初步加工。 #### 接口调用配置 首先,我们需要配置元数据,以便正确调用聚水潭的`inventory.count.query`接口。以下是元数据配置的详细说明: ```json { "api": "inventory.count.query", "method": "POST", "number": "io_id", "id": "io_id", "idCheck": true, "condition": [ [{"field":"items.qty","logic":"gt","value":0}], [{"field":"batch.qty","logic":"gt","value":0}] ], "request": [ {"field":"page_index","label":"开始页码","type":"string","describe":"第几页,从第一页开始,默认1"}, {"field":"page_size","label":"每页条数","type":"string","describe":"每页多少条,默认30,最大50"}, {"field":"modified_begin","label":"修改开始时间","type":"string","describe":"修改起始时间,和结束时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空", "value":"{{LAST_SYNC_TIME|datetime}}"}, {"field":"modified_end","label":"修改结束时间","type":"string","describe":"修改结束时间,和起始时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空", "value":"{{CURRENT_TIME|datetime}}"}, {"field":"io_ids","label":"盘点单号","type":"string","describe":"指定盘点单号,多个用逗号分隔,最多50,和时间段不能同时为空"}, {"field":"status","label":"单据状态","type":"string","describe":"单据状态,Confirmed=生效,WaitConfirm待审核,Creating=草拟,Archive=归档,Cancelled=作废", "value": "Confirmed"} ] } ``` #### 请求参数解析 1. **page_index**: 开始页码,从第一页开始。 2. **page_size**: 每页条数,默认30条记录。 3. **modified_begin**: 修改开始时间,用于限定查询范围。 4. **modified_end**: 修改结束时间,与修改开始时间共同使用。 5. **io_ids**: 指定盘点单号,可以指定多个,用逗号分隔。 6. **status**: 单据状态,此处我们只查询已生效的单据(Confirmed)。 #### 数据请求与清洗 在调用接口时,我们需要构建请求体,并根据元数据中的条件对返回的数据进行初步清洗。以下是一个示例请求体: ```json { "page_index": "1", "page_size": "30", "modified_begin": "{{LAST_SYNC_TIME|datetime}}", "modified_end": "{{CURRENT_TIME|datetime}}", "status": "Confirmed" } ``` 通过POST方法发送请求后,我们会收到一组盘盈单数据。为了确保数据质量,我们需要根据条件对数据进行过滤。例如,只保留`items.qty`和`batch.qty`大于0的记录。 #### 数据转换与写入 在清洗完毕后,需要将数据转换为目标系统所需的格式,并写入目标系统。在这个案例中,我们假设目标系统为金蝶其他入库单。以下是一个简单的数据转换示例: ```python def transform_data(data): transformed_data = [] for record in data: if record['items']['qty'] > 0 and record['batch']['qty'] > 0: transformed_record = { 'entry_id': record['io_id'], 'product_code': record['items']['product_code'], 'quantity': record['items']['qty'], 'batch_number': record['batch']['batch_no'] } transformed_data.append(transformed_record) return transformed_data ``` 通过上述代码,我们将聚水潭的数据转换为金蝶系统所需的格式。 #### 实践中的注意事项 1. **分页处理**:由于每次请求只能返回有限数量的数据,需要实现分页逻辑以获取所有符合条件的数据。 2. **异常处理**:在实际操作中,需要处理可能出现的网络异常、接口错误等情况,以确保数据集成过程的稳定性。 3. **实时监控**:利用轻易云平台提供的实时监控功能,可以及时发现并解决数据流动中的问题,提高整体效率。 通过以上步骤,我们成功地调用了聚水潭的`inventory.count.query`接口,并对获取的数据进行了初步加工,为后续的数据转换与写入打下了坚实基础。这一过程展示了轻易云平台在异构系统集成中的强大能力和灵活性。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/S12.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在数据集成生命周期的第二步,我们将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨这一过程中涉及的技术细节和元数据配置。 #### 元数据配置解析 我们使用的元数据配置如下: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{io_id}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"PYQTRKD"}, {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"GENERAL"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{io_date}"}, {"field":"FOwnerTypeIdHead","label":"货主类型","type":"string","describe":"多类别基础资料列表","value":"BD_OwnerOrg"}, {"field":"FOwnerIdHead","label":"货主","type":"string","describe":"多类别基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value": "_findCollection find F_HZ_OrgId_Fnumber from 0cba013f-c6e7-3826-bf89-bb0b11e996e1 where FNumber={{items.sku_id}}"}, {"field":"FNOTE","label":"备注","type": "string", "describe": "多行文本", "value": "{remark}"}, { "field": "FEntity", "label": "明细信息", "type": "array", "children": [ {"field": "FMATERIALID", "label": "物料编码", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "{{items.sku_id}}", "parent": "FEntity" }, {"field": "FSTOCKID", "label": "收货仓库", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "{wms_co_id}", parent: " FEntity" }, {"field": "FSTOCKSTATUSID", label: " 库存状态", type: " string", value: KCZT01_SYS, parser:{ name: ConvertObjectParser, params: FNumber } }, {"field": FLOT, label: 批号, type: string, describe: 批次, value: {{items.batch_id}}, parent: FEntity, parser:{ name: ConvertObjectParser, params: FNumber } }, {"field": FPRODUCEDATE, label: 生产日期, type: string, describe: 批次, value: {{items.product_date}}, parent: FEntity }, {"field": FEXPIRYDATE, label: 有效期至, type: string, describe: 批次, value: {{items.expiration_date}}, parent:" FEntity }, {" field:FQty,label:实收数量,type:string,describe:数量,value:{{items.qty}},parent:FEntity}, {" field:FPrice,label:成本价,type:string,describe:单价,parent:FEntity}, {" field:FEntryNote,label:备注,type:string,describe:多行文本,parent:FEntity}, {" field:FOWNERTYPEID,label:货主类型,type:string,value:BD_OwnerOrg}, {" field:FOWNERID,label:货主,type:string,value:_findCollection find F_HZ_OrgId_Fnumber from 0cba013f-c6e7-3826-bf89-bb0b11e996e1 where FNumber={{items.sku_id}},parser:{name:ConvertObjectParser,params:FNumber}} ], value:"items" } ], otherRequest:[ {" field:"FormId,label:"业务对象表单Id,type:"string,describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder,value:"STK_MISCELLANEOUS}, {" field:IsVerifyBaseDataField,label:"验证基础资料,type:"bool,describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录),value:true}, {" field:Operation,label:"执行的操作,type:"string,value:"Save}, {" field:IsAutoSubmitAndAudit,label:"提交并审核,type:"bool,value:false} ] } ``` #### 技术实现步骤 1. **API接口调用配置**: - `api`字段指定了调用的API接口为`batchSave`。 - `method`字段指定了HTTP请求方法为`POST`。 - `idCheck`字段设置为`true`,确保每条记录都有唯一标识。 2. **操作参数设置**: - `operation`字段中定义了批量保存操作,使用了`batchArraySave`方法。 - `rowsKey`和`rows`分别指定了数组键和行数。 3. **请求参数映射**: - 请求参数通过`request`数组进行定义,每个字段都包含具体的信息,如字段名称、标签、类型、描述和取值方式等。 - 特别注意的是部分字段使用了解析器(如:`ConvertObjectParser`),用于将特定格式的数据转换为目标系统可识别的格式。例如: ```json { "field": "FBillTypeID", label:"单据类型", type:"string", describe:"单据类型", parser:{"name:"ConvertObjectParser",params:"FNumber"}, value:"PYQTRKD" } ``` 4. **嵌套数组处理**: - 对于复杂的数据结构,如明细信息(`FEntity`),使用嵌套数组来表示。每个子项也包含类似的字段配置,并且可以继续嵌套其他子项。 5. **其他请求参数**: - `otherRequest`数组中定义了一些额外的请求参数,如业务对象表单ID(FormId)、是否验证基础资料(IsVerifyBaseDataField)、执行操作(Operation)以及是否自动提交并审核(IsAutoSubmitAndAudit)。 #### 数据转换与写入示例 假设我们有以下源数据需要转换并写入金蝶云星空: ```json { io_id: 'PI20231001', io_date: '2023-10-01', remark: '盘盈入库', items:[ { sku_id:'SKU12345', batch_id:'BATCH001', product_date:'2023-09-15', expiration_date:'2024-09-15', qty:'100' } ], wms_co_id:'WH001' } ``` 根据上述元数据配置,该源数据将被转换为以下格式: ```json { FormId: 'STK_MISCELLANEOUS', IsVerifyBaseDataField:true, Operation:'Save', IsAutoSubmitAndAudit:false, Model:{ FBillNo:'PI20231001', FBillTypeID:{'FNumber':'PYQTRKD'}, FStockOrgId:{'FNumber':'100'}, FStockDirect:'GENERAL', FDate:'2023-10-01', FOwnerTypeIdHead:'BD_OwnerOrg', FOwnerIdHead:{'FNumber':'_findCollection find F_HZ_OrgId_Fnumber from 0cba013f-c6e7-3826-bf89-bb0b11e996e1 where FNumber=SKU12345'}, NOTE:'盘盈入库', Entity:[ { FMATERIALID:{'FNumber':'SKU12345'}, STOCKID:{'FNumber':'WH001'}, STOCKSTATUSID:{'FNumber':'KCZT01_SYS'}, LOT:{'FNumber':'BATCH001'}, PRODUCEDATE:'2023-09-15', EXPIRYDATE:'2024-09-15', Qty:'100' } ] } } ``` 通过轻易云的数据集成平台,这些转换后的数据将通过API接口发送到金蝶云星空,实现无缝对接和写入。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/T2.png~tplv-syqr462i7n-qeasy.image)