数据转换与写入金蝶云星空的ETL实战案例

  • 轻易云集成顾问-何语琴
### 案例分享:金蝶云星空数据集成——收款单-新20231120-临时使用 在本次技术案例中,我们聚焦于如何高效实现“收款单-新20231120-临时使用”方案的系统对接和数据集成。该方案基于轻易云数据集成平台,目标是将业务系统中的收款单数据准确、及时地写入到金蝶云星空。 为满足快速大规模的数据处理需求,我们充分利用了平台支持的大量数据快速写入能力及统一API资产管理功能,通过executeBillQuery接口来获取需要集成的数据,并通过batchSave接口进行批量写入操作,从而确保了每个环节都能顺畅工作,高度契合企业实际应用场景。 **关键技术要点** 1. **高吞吐量的数据写入** 通过优化网络连接和并行处理机制,实现大量收款单数据快速、高效地导入至金蝶云星空。这一特性能显著提升整个业务流程的响应速度,确保关键财务信息能够实时更新。 2. **集中监控与告警系统** 在整个集成过程中,引入完善的监控和告警机制,不仅可以实时跟踪任务状态,还可在出现异常时即时报警,有助于维护人员迅速定位问题并采取措施,保障系统稳定运行。 3. **自定义转换逻辑适配** 集成过程涉及多种复杂业务规则,为此我们设计了一系列自定义转换逻辑,使得不同结构的数据能够灵活适配。同时,这些逻辑经过严密测试,以确保其对各类边缘情况均有良好兼容性。 4. **分页与限流策略** 针对executeBillQuery和batchSave接口调用频率较高的问题,我们应用分页查询及限流策略。这样不仅减轻了服务器压力,也有效避免了因过载引起的服务宕机或请求失败,提高整体可靠性。 5. **异常处理与重试机制** 系统不免会遇到各种类型的数据传输错误,为此我们构建了一套健壮的异常处理框架,包括但不限于重试机制。在捕获到接报错信息后,会自动触发重试动作,极大地提高成功率,同时降低人为干预成本。 通过以上几项技术要点,本案例展示了如何借助轻易云平台,在复杂、多变的企业环境中实现精准、高效、可靠的数据对接,并切实解决实际业务挑战。更详细的方法论及实施步骤将在下文进一步展开。 ![金蝶与WMS系统接口开发配置](https://pic.qeasy.cloud/D10.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口来获取收款单数据,并进行初步的数据加工。 #### 配置元数据 首先,我们需要配置元数据,以便正确地调用金蝶云星空的API。以下是关键的元数据配置: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FRECEIVEBILLENTRY_FEntryID", "pagination": { "pageSize": 500 }, "idCheck": true, "condition_bk": [ [ { "field": "field1", "logic": "eqv2", "value": null } ] ], "request": [ {"field":"FID","label":"实体主键","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FDOCUMENTSTATUS","label":"单据状态","type":"string","value":"FDOCUMENTSTATUS"}, {"field":"FCreatorId","label":"创建人","type":"string","value":"FCreatorId"}, {"field":"FAPPROVERID","label":"审核人","type":"string","value":"FAPPROVERID"}, {"field":"FCreateDate","label":"创建日期","type":"string","value":"FCreateDate"}, {"field":"FSETTLEORGID","label":"结算组织","type":"string","value":"FSETTLEORGID.FNumber"}, {"field":"FApproveDate","label":"审核日期","type":"string","value":"FApproveDate"}, {"field":"FSALEORGID","label":"销售组织","type":"string","value":"FSALEORGID.FNumber"}, {"field":"FEXCHANGETYPE","label":"汇率类型","type":"string","value":"FEXCHANGETYPE"} ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "2000"}, {"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='SKD03149266'or\nFBillNo='SKD03149267'or\nFBillNo='SKD03149268'or\nFBillNo='SKD03149269'or\nFBillNo='SKD03149270'or\nFBillNo='SKD03149271'or\nFBillNo='SKD03149272'or\nFBillNo='SKD03190935'or\nFBillNo='SKD03190936'or\nFBillNo='SKD03190937'or\nFBillNo='SKD03190938'or\nFBillNo='SKD03190939'or\nFBillNo='SKD03190940'or\nFBillNo='SKD03190941'or\nFBillNo='SKD03190942'or\nFBillNo='SKD03190943'or\nFBillNo='SKD03190944'or\nFBillNo='SKD03190945'or\nFBillNo='SKD03190946'or\nFBillNo='SKD03190947'or\nFBillNo='SKD03190948'or\nFBillNo='SKD03190949'or\nFBillNo='SKD03190950'or\nFBillNo='SKD03190951'or\nFBillNo='SKD03190952'or\nFBillNo='SKD03190953'or\n'... ] } ``` #### 调用API获取数据 在配置好元数据后,我们可以通过轻易云平台调用金蝶云星空的`executeBillQuery`接口。以下是一个示例请求: ```json { "_metadata_":{ "_api_":{ "_name_":"", "_version_":"", "_method_":"", "_url_":"", "_headers_":[] }, "_pagination_":{ "_pageSize_":"", "_currentPage_":"", "_totalPages_":"", "_totalRecords_":"", "_hasNextPage_":"", "_hasPreviousPage_" :"" } }, } ``` #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换。以下是一些常见的数据清洗与转换操作: 1. **字段映射**:将源系统字段映射到目标系统字段。例如,将`FID`映射到目标系统中的`EntityID`。 2. **数据格式转换**:将日期格式从`YYYY-MM-DD`转换为目标系统所需的格式。 3. **数据过滤**:根据业务需求过滤掉不需要的数据。例如,只保留状态为“已审核”的单据。 #### 示例代码 以下是一个示例代码片段,展示如何使用Python进行上述操作: ```python import requests import json # 配置请求头和URL headers = {'Content-Type': 'application/json'} url = 'https://api.kingdee.com/executeBillQuery' # 构建请求体 payload = { 'FormId': 'AR_RECEIVEBILL', 'FieldKeys': ','.join([f['value'] for f in metadata['request']]), 'FilterString': metadata['otherRequest'][3]['value'], 'Limit': metadata['otherRequest'][0]['value'], 'StartRow': metadata['otherRequest'][1]['value'] } # 发起POST请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与转换 cleaned_data = [] for record in data: cleaned_record = { 'EntityID': record[0], 'BillNumber': record[1], 'DocumentStatus': record[2], 'CreatorID': record[3], 'ApproverID': record[4], # 更多字段映射... } cleaned_data.append(cleaned_record) else: print(f'Error: {response.status_code}') ``` 以上代码展示了如何通过HTTP POST请求调用金蝶云星空API,并对返回的数据进行初步清洗和转换。 #### 总结 通过轻易云数据集成平台,我们可以高效地调用金蝶云星空的API,获取所需的业务数据,并进行必要的数据清洗和转换。这一步骤为后续的数据处理和分析奠定了坚实基础。在实际应用中,根据具体业务需求,可能还需要进一步优化和调整元数据配置及清洗逻辑。 ![如何对接钉钉API接口](https://pic.qeasy.cloud/S26.png~tplv-syqr462i7n-qeasy.image) ### 数据转换与写入金蝶云星空API接口的技术案例 在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨如何利用轻易云数据集成平台实现这一过程。 #### 元数据配置解析 元数据配置是实现数据转换与写入的核心。以下是关键字段和操作的详细解析: - **API接口信息**: ```json {"api":"batchSave","method":"POST","idCheck":true} ``` 我们使用的是`batchSave` API,采用POST方法进行数据提交,并启用了ID检查功能。 - **操作配置**: ```json "operation":{"method":"merge","field":"FBillTypeID,FBillNo,FDATE,FPAYORGI","bodyName":"details","header":["FBillNo","FSETTLEORGID","FDATE","FCURRENCYID","FBillTypeID","FCONTACTUNITTYPE","FCONTACTUNIT","FPAYUNITTYPE","FPAYUNIT","FBUSINESSTYPE","FPAYORGID","FSETTLECUR"],"body":["FSETTLETYPEID","FRECTOTALAMOUNTFOR","FACCOUNTID","FPURPOSEID","FRECEIVEITEMTYPE","FSALEORDERNO"]} ``` 操作方法为`merge`,合并字段包括`FBillTypeID`, `FBillNo`, `FDATE`, `FPAYORGI`。请求体名称为`details`,头部字段和体部字段分别定义了具体的数据映射关系。 - **请求字段**: ```json "request":[{"field":"FBillNo",...},{"field":"FSETTLEORGID",...},...] ``` 请求字段定义了每个字段在请求中的具体配置,包括字段名、标签、类型、描述、值以及解析器等。例如: ```json {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{FBillNo}"} ``` 单据编号字段直接从源数据中获取对应值。 #### 数据转换细节 1. **单据编号(FBillNo)**: - 类型:字符串 - 描述:单据编号 - 值:直接从源数据中获取 `{FBillNo}` 2. **结算组织(FSETTLEORGID)**: - 类型:字符串 - 描述:结算组织 - 值:固定值 `114` - 映射方向:正向映射 - 映射配置:`6355fe20c4a6d536d27cd8dc` - 转换器:使用 `ConvertObjectParser` 将值转换为金蝶云星空所需格式 3. **币别(FCURRENCYID)**: - 类型:字符串 - 描述:币别 - 值:固定值 `PRE001` - 转换器:使用 `ConvertObjectParser` 4. **业务日期(FDATE)**: - 类型:字符串 - 描述:业务日期 - 值:直接从源数据中获取 `{FDATE}` 5. **单据类型(FBillTypeID)**: - 类型:字符串 - 描述:单据类型 - 值:固定值 `SKDLX01_SYS` - 转换器:使用 `ConvertObjectParser` 6. **往来单位类型(FCONTACTUNITTYPE)**和**往来单位(FCONTACTUNIT)**: - 往来单位类型直接从源数据中获取 `{FCONTACTUNITTYPE}` - 往来单位使用固定值 `PDD15` 并通过 `ConvertObjectParser` 转换 7. **付款单位类型(FPAYUNITTYPE)**和**付款单位(FPAYUNIT)**: - 类似于往来单位,分别从源数据中获取 `{FPAYUNITTYPE}` 和 `{FPAYUNIT}`,并通过相应的转换器处理 8. **收款单明细(FRECEIVEBILLENTRY)**: 明细部分包含多个子字段,如结算方式、应收金额、我方银行账号等,每个子字段都有对应的配置。例如: ```json {"field":"FACCOUNTID", "label":"我方银行账号", "type":"string", "describe":"我方银行账号", "parser":{"name":"ConvertObjectParser", "params":"FNumber"}, "value":"{FACCOUNTID}", "parent":"FRECEIVEBILLENTRY"} ``` 我方银行账号通过 `ConvertObjectParser` 转换,并从源数据中获取 `{FACCOUNTID}`。 #### 请求其他参数 - 表单Id (`FormId`) 必须填写金蝶的表单 ID,例如 `AR_RECEIVEBILL` - 执行操作 (`Operation`) 固定为 `BatchSave` - 提交并审核 (`IsAutoSubmitAndAudit`) 默认设置为 false,不自动提交审核 - 验证基础资料 (`IsVerifyBaseDataField`) 默认设置为 false,不验证基础资料有效性 #### 实际应用案例 假设我们有一条源平台的数据如下: ```json { "FBillNo": "20231120", "FDATE": "2023-11-20", "FCONTACTUNITTYPE": "Customer", "FPAYUNITTYPE": "Company", "FPAYUNIT": "XYZ Ltd.", ... } ``` 通过上述元数据配置和ETL过程,我们可以将其成功转换并写入到金蝶云星空系统中。请求体示例如下: ```json { "FormId": "AR_RECEIVEBILL", "Operation": "BatchSave", "Model": { ... // 根据元数据配置生成的具体请求内容 ... }, ... } ``` 以上就是利用轻易云数据集成平台实现ETL转换并写入金蝶云星空API接口的技术案例,通过详细解析每个步骤和字段配置,实现了高效的数据集成与处理。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/T11.png~tplv-syqr462i7n-qeasy.image)