利用轻易云平台实现金蝶云星空API的数据写入

  • 轻易云集成顾问-林峰
### 标准应付单-采购退料单(虚拟组织)数据集成方案:金蝶云星空到金蝶云星空 在复杂的企业资源管理系统中,数据的无缝对接与集成常常面临多重挑战。本文将围绕一个具体案例,介绍如何使用高效的数据集成平台,将金蝶云星空中的标准应付单和采购退料单数据成功地对接并写入另一个金蝶云星空系统。 该方案主要通过executeBillQueryAPI接口抓取金蝶云星空中的原始数据,并使用batchSaveAPI接口将处理后的数据写入目标系统。在实际操作中,一方面我们需要确保大量数据能够快速而不遗漏地进行传输和存储;另一方面,还需实时监控整个流程以迅速发现并解决潜在的问题。以下是一些关键技术要点及解决方案: 首先,通过集中监控和告警系统,我们可以实时跟踪每个数据集成任务的状态和性能。这不仅提升了整体运作效率,还大大减少了由于异常情况导致的业务中断风险。同时,自定义的数据转换逻辑也是这个项目成功的重要因素之一。针对不同业务需求,灵活调整转换规则,使源系统与目标系统间的数据格式差异得到有效处理。 其次,在批量操作过程中,高吞吐量的数据写入能力尤为重要。利用轻易云提供的平台特性,大规模、连续性的交易记录能够被迅速且可靠地从源端转移至目标端,这极大压缩了传统手工导入所需的大量时间。此外,定时抓取机制也保障了新生成或更新的记录能够被及时捕捉到,不会出现漏单现象。 最后,为提高整体稳定性,对分页查询以及限流策略进行了优化设置。这些措施既防止了因超量请求导致网络拥堵,又保证了每次读取操作都能顺利完成。当面对特殊情形如API响应慢或出错时,引入错误重试机制,可自动重新发起请求直至问题得以解决为止,从而达到一气呵成、不留死角的软件运行效果。 总之,通过巧妙结合各种技术手段,此案例充分展示出如何实现复杂环境下两个ERP系统之间高级别、高精度的数据交互。如果您正在研究类似项目,希望这一经验分享能为您的工作提供实质参考价值。 ![钉钉与ERP系统接口开发配置](https://pic.qeasy.cloud/D35.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,以获取标准应付单-采购退料单(虚拟组织)的相关数据,并进行初步加工。 #### 接口配置与调用 首先,我们需要配置接口的元数据,以确保能够正确调用并解析返回的数据。以下是元数据配置的关键部分: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FEntityDetail_FEntryID", "pagination": { "pageSize": 500 }, "idCheck": true, "request": [ {"field":"FID","label":"实体主键","type":"String","describe":"实体主键","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"String","describe":"单据编号","value":"FBillNo"}, {"field":"FDOCUMENTSTATUS","label":"单据状态","type":"String","describe":"单据状态","value":"FDOCUMENTSTATUS"}, {"field":"FRelateHadPayAmount","label":"表头基本 - 付(退)款单的关联金额","type":"String","describe":"表头基本 - 付(退)款单的关联金额","value":"FRelateHadPayAmount"}, {"field":"FDATE","label":"业务日期","type":"String","describe":"业务日期","value":"FDATE"}, {"field":"FSETTLEORGID_FNumber","label":"结算组织","type":"String","describe":"结算组织","value":"FSETTLEORGID.FNumber"}, // ...其他字段省略 ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"}, {"field": "TopRowCount", "label": "返回总行数", "type": "int", "describe": "金蝶的查询分页参数"}, {"field": "FilterString", "label": "过滤条件", "type": "string", "describe": "示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=", "value": "(FBillNo = 'AP00024640' )and FPriceQty <'0'" }, {"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "describe": "金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber", "parser": {"name": "ArrayToString", "params": "," } }, {"field": "FormId", "label": "业务对象表单Id", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": "AP_Payable" } ] } ``` #### 数据请求与清洗 在配置好元数据后,我们可以通过轻易云平台发送POST请求到金蝶云星空接口`executeBillQuery`。请求体包含了我们需要查询的数据字段和过滤条件。例如: ```json { "_FormId_":"", "_FieldKeys_":"", "_FilterString_":"", } ``` 响应结果将包含我们所需的数据字段,例如`FBillNo`、`FDOCUMENTSTATUS`、`FDATE`等。接下来,我们需要对这些原始数据进行清洗和转换,以便后续处理。 #### 数据转换与写入 在获取到原始数据后,我们需要对其进行必要的转换。例如,将日期字段从字符串格式转换为标准日期格式,或者将货币金额字段进行汇率换算等。以下是一个简单的数据转换示例: ```python import json from datetime import datetime def transform_data(raw_data): transformed_data = [] for record in raw_data: transformed_record = { 'BillNo': record['FBillNo'], 'DocumentStatus': record['FDOCUMENTSTATUS'], 'Date': datetime.strptime(record['FDATE'], '%Y-%m-%d'), 'Amount': float(record['FRelateHadPayAmount']), # ...其他字段转换 } transformed_data.append(transformed_record) return transformed_data # 假设raw_data是从API响应中获取到的原始数据 raw_data = json.loads(api_response) cleaned_data = transform_data(raw_data) ``` #### 实践案例 假设我们需要获取所有状态为“已审核”的采购退料单,并且这些单据是在2023年1月1日之后创建的。我们可以设置如下过滤条件: ```json { "_FilterString_":"", } ``` 然后,通过轻易云平台发送请求并处理响应数据: ```python # 设置过滤条件和分页参数 filter_string = "(FDOCUMENTSTATUS = 'C') and (FDATE >= '2023-01-01')" pagination_params = { 'Limit': 500, 'StartRow': 0, } # 构建请求体 request_body = { '_FormId_':'AP_Payable', '_FieldKeys_':'FBillNo,FDOCUMENTSTATUS,FDATE,FRelateHadPayAmount', '_FilterString_':filter_string, } # 调用API并处理响应 response = requests.post(api_url, json=request_body) raw_data = response.json() cleaned_data = transform_data(raw_data) # 将清洗后的数据写入目标系统或数据库 write_to_target_system(cleaned_data) ``` 通过以上步骤,我们实现了从金蝶云星空获取采购退料单数据,并对其进行了初步清洗和转换,为后续的数据处理奠定了基础。这一过程展示了如何利用轻易云平台高效地进行异构系统间的数据集成。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/S25.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并将其转为目标平台所能够接收的格式。本文将详细探讨如何使用轻易云数据集成平台,将标准应付单-采购退料单的数据转换为金蝶云星空API接口所能接受的格式,并最终写入目标平台。 #### 元数据配置解析 我们将基于以下元数据配置进行ETL转换和写入操作: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo,FDATE,FSupplierID_FName", "bodyName": "details", "header": ["FBillNo", "FDATE", "FSupplierID_FName", "FStockOrgId_FNumber"], "body": ["FMATERIALID_FNumber", "FPriceQty", "FPrice", "FOWNERID", "FOWNERTYPEID", "FTaxPrice", "FALLAMOUNTFOR_D", "FDISCOUNTAMOUNTFOR"] }, ... } ``` #### 接口请求结构 1. **请求头部(Header)字段**: - `FBillNo`: 单据编号 - `FDATE`: 日期 - `FSupplierID_FName`: 供应商名称 - `FStockOrgId_FNumber`: 库存组织编码 2. **请求体(Body)字段**: - `FMATERIALID_FNumber`: 物料编码 - `FPriceQty`: 数量 - `FPrice`: 单价 - `FOWNERID`: 货主ID - `FOWNERTYPEID`: 货主类型ID - `FTaxPrice`: 含税单价 - `FALLAMOUNTFOR_D`: 总金额(含税) - `FDISCOUNTAMOUNTFOR`: 折扣额 #### 数据转换逻辑 1. **单据类型和业务类型**: ```json { "label": "单据类型", "field": "FBillTypeID", ... "value": "TLD01_SYS" }, { ... "field": "FBusinessType", ... "value": "CG" } ``` 2. **组织信息**: ```json { ... "field": ["FStockOrgId", ...], ... "value": ["125", ...] } ``` 3. **基础资料和日期**: ```json { ... "field": ["FBillNo", ...], ... "value": ["{FBillNo}", ...] }, { ... "field": ["FDate"], ... "value": ["{FDATE}"] } ``` 4. **明细信息**: 明细信息需要处理数组结构,每一项都包含多个字段: ```json { ... field: 'FPURMRBENTRY', label: '明细信息', type: 'array', children: [ { field: 'FMATERIALID', label: '物料编码', value: '{{details.FMATERIALID_FNumber}}' }, { field: 'FRMREALQTY', label: '实退数量', value: '_function {{details.FPriceQty}}*(-1)' }, ... ] } ``` #### API调用示例 在完成上述元数据配置后,我们可以构建最终的API请求。假设我们有以下源数据: ```json { FBillNo: 'AP00023771', FDATE: '2023-10-01', FSupplierID_FName: '虚拟组织', details: [ { FMATERIALID_FNumber: 'MAT001', FPriceQty: 10, FPrice: 100, FTaxPrice: 113, FALLAMOUNTFOR_D: 1130, FDISCOUNTAMOUNTFOR: 0, FIsFree: false } ] } ``` 根据上述元数据配置,生成的API请求如下: ```json { api: 'batchSave', method: 'POST', idCheck: true, operation: { ... }, request: [ { field: 'FBillTypeID', value: 'TLD01_SYS' }, { field: 'FBusinessType', value: 'CG' }, { field: 'FBillNo', value: 'AP00023771' }, { field: 'FDate', value: '2023-10-01' }, { field: 'FSupplierID', value:'虚拟组织' }, { field:'FPURMRBENTRY', value:[ { FMATERIALID:'MAT001', FRMREALQTY:-10, FSTOCKID:'CK001', FPrice:'100', FTAXPRICE:'113', FALLAMOUNT:-1130, FGIVEAWAY:false, FDISCOUNT:'0'} ]} ], otherRequest:[...] } ``` 通过以上步骤,我们成功地将源平台的数据转换为金蝶云星空API接口所能接受的格式,并准备好进行写入操作。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/T26.png~tplv-syqr462i7n-qeasy.image)