数据转换与写入金蝶云星空API接口的技术案例解析

  • 轻易云集成顾问-潘裕
### 旺店通·企业奇门数据集成至金蝶云星空:调拨单案例解析 在处理复杂的跨平台数据集成任务时,保证数据一致性和高效传输是关键。本文将聚焦于一个具体的系统对接集成案例,即将旺店通·企业奇门的数据顺利集成到金蝶云星空——尤以“调拨单”的对接为例,来详细探讨技术实现过程。 #### 1. 数据抓取与接口调用 首先,我们利用旺店通·企业奇门提供的API `wdt.stock.transfer.query` 从其系统中定时可靠地抓取调拨单数据。为了确保不漏单,我们实现了分页策略,并结合接口限流机制,以应对大规模请求时可能遇到的流控问题。 ```python # 调用界面示例代码(伪代码) params = { 'page_no': page_number, 'page_size': 100, } response = wdt_api_call('wdt.stock.transfer.query', params) data_list = response['data'] ``` #### 2. 数据格式转换与映射 由于旺店通·企业奇门和金蝶云星空之间采用的数据格式存在差异,需要进行适当的数据转换和映射。例如,对日期格式、数值精度等细节都进行了特别处理,以满足目标系统要求。 ```python # 简化版数据映射示例(伪代码) for item in data_list: mapped_item = { 'outerTransferOrderNo': item['transfer_order_no'], 'quantity': float(item['qty']), # 更多字段映射... } formatted_data.append(mapped_item) ``` #### 3. 批量写入及异常处理 经过清洗和转换后,将结构化的调拨单批量写入到金蝶云星空。我们使用的是其提供的API `batchSave` 来执行此操作,同时设计了完善的错误重试机制,以确保即使在网络抖动或服务故障情况下,也能自动恢复提交事务,避免重复发送或丢失重要业务信息。 ```python try: write_response = kingdee_api_call('batchSave', formatted_data) except Exception as e: log_error(e, formatted_data) retry_write_to_kingdee(formatted_data) ``` 通过这种严谨而灵活的方法,不仅可以有效提升处理效率,还能够保障数据的一致性及准确性。在整个过程中,我们不仅实时监控各个环节,还保持详细日志记录,为后续运维工作提供可靠依据。这正是本次集成项目成功实施的重要技术基础部分。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/D38.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口 `wdt.stock.transfer.query` 获取调拨单数据,并进行初步的数据加工。 #### 接口调用配置 首先,我们需要配置元数据,以便正确地调用 `wdt.stock.transfer.query` 接口。以下是关键的元数据配置: ```json { "api": "wdt.stock.transfer.query", "method": "POST", "number": "transfer_no", "id": "transfer_id", "pagination": { "pageSize": 100 }, "idCheck": true, "condition": [ [ {"field":"type","logic":"eqv2","value":"1"}, {"field":"mode","logic":"eqv2","value":"0"}, {"field":"to_warehouse_no","logic":"like","value":"JS"} ], [ {"field":"type","logic":"eqv2","value":"1"}, {"field":"mode","logic":"eqv2","value":"2"}, {"field":"to_warehouse_no","logic":"like","value":"JS"} ] ], "request": [ { "field": "start_time", "label": "开始时间", "type": "datetime", "describe": "增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{LAST_SYNC_TIME|datetime}}" }, { "field": "end_time", "label": "结束时间", "type": "datetime", "describe": "增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{CURRENT_TIME|datetime}}" }, { "field": "from_warehouse_no", "label": "源仓库", "type": "string", "describe": 用于获取指定仓库单据数据信息(不支持一次推送多个仓库编号)" }, { ... ``` #### 请求参数解析 - **start_time** 和 **end_time**:用于增量获取数据,分别表示开始和结束时间。格式为 `yyyy-MM-dd HH:mm:ss`。 - **from_warehouse_no** 和 **to_warehouse_no**:分别代表源仓库和目标仓库的唯一编码,用于区分不同仓库。 - **status**:调拨单状态,这里设置为 `90` 表示调拨完成。 - **type** 和 **mode**:分别表示调拨类型和调拨模式,这里我们设置了两种模式(0和2),均为调拨类型1。 #### 数据请求与清洗 在调用接口后,我们会得到一个包含多个调拨单信息的响应。为了确保数据的准确性和一致性,需要对返回的数据进行清洗和初步处理。 ```python def clean_data(response): cleaned_data = [] for item in response['data']: if item['status'] == '90': # 确保只处理已完成的调拨单 cleaned_data.append({ 'transfer_id': item['transfer_id'], 'transfer_no': item['transfer_no'], 'from_warehouse': item['from_warehouse_no'], 'to_warehouse': item['to_warehouse_no'], 'status': item['status'], 'created_at': item['created_at'] }) return cleaned_data ``` #### 分页处理 由于接口返回的数据可能非常庞大,我们需要进行分页处理。元数据中的分页配置如下: ```json { ... otherRequest: [ { field: 'page_size', label: '分页大小', type: 'string', describe: '每页返回的数据条数', value: '{PAGINATION_PAGE_SIZE}' }, { field: 'page_no', label: '页号', type: 'string', describe: '不传值默认从0页开始', value: '{PAGINATION_START_PAGE}' } ] } ``` 在实际实现中,可以通过循环来逐页获取数据: ```python def fetch_all_data(): page_no = 0 all_data = [] while True: response = call_api(page_size=100, page_no=page_no) if not response['data']: break cleaned_data = clean_data(response) all_data.extend(cleaned_data) page_no += 1 return all_data ``` #### 数据转换与写入 在完成数据请求与清洗后,我们可以将清洗后的数据转换为目标系统所需的格式,并写入到金蝶JS系统中。这一步骤涉及到具体业务逻辑的实现,如字段映射、格式转换等。 ```python def transform_and_write(data): transformed_data = [] for item in data: transformed_item = { 'ID': item['transfer_id'], 'Number': item['transfer_no'], ... } transformed_data.append(transformed_item) write_to_js(transformed_data) ``` 通过以上步骤,我们实现了从旺店通·企业奇门接口获取并加工调拨单数据的全过程。这一过程不仅保证了数据的一致性和准确性,还提高了业务处理效率。 ![钉钉与MES系统接口开发配置](https://pic.qeasy.cloud/S28.png~tplv-syqr462i7n-qeasy.image) ### 数据转换与写入金蝶云星空API接口的技术案例 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。本文将详细探讨如何通过轻易云数据集成平台实现这一过程。 #### 配置元数据 首先,我们需要配置元数据,以确保数据能够正确地从源平台(如旺店通)转换并写入到金蝶云星空。以下是我们使用的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 20, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{transfer_no}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","value":"_function case when '{from_warehouse_no}' like '%JS%' then 'ZJDB09_SYS' when '{to_warehouse_no}' like '%JS%' then 'ZJDB07_SYS' else 'DPDB' end"}, {"field":"FBizType","label":"业务类型","type":"string","describe":"下拉列表","value":"NORMAL"}, {"field":"FTransferDirect","label":"调拨方向","type":"string","describe":"下拉列表","value":"GENERAL"}, {"field":"FTransferBizType","label":"调拨类型","type":"string","describe":"下拉列表","value":"ZJDB07_SYS"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织"}, {"field":"FSettleOrgId","label":"结算组织","type":"string","describe":"组织"}, {"field":"FStockOutOrgId","label":"调出库存组织","type":"string","describe":"组织", "value": "100"}, {"field": "FOwnerTypeOutIdHead", "label": "调出货主类型", "type": "string", "describe": "多类别基础资料列表", "value": "BD_OwnerOrg"}, {"field": "FOwnerOutIdHead", "label": "调出货主", "type": "string", "describe": "多类别基础资料", "value": "100"}, {"field": "FStockOrgId", "label": "调入库存组织", "type": "string", describe: 组织, value: 100}, {"field": FSETTLECURRID, label: 结算币别, type: string, describe: 基础资料}, {"field": FDate, label: 日期, type: string, describe: 日期, value: {modified}}, {"field": FNote, label: 备注, type: string, describe: 多行文本}, {"field":{"FBillEntry":{"children":[{"FMaterialId":{"parser":{"name":"ConvertObjectParser","params":"FNumber"},"parent":"FBillEntry"}},{"FQty":{"parent":"FBillEntry"}},{"FSrcStockId":{"parent":"FBillEntry"}},{"FDestStockId":{"parent":"FBillEntry"}},{"FNoteEntry":{"parent":"FBillEntry"}},{"FISFREE":{"parent":"FBillEntry"}},{"FDestStockStatusId":{"parser":{"name":"ConvertObjectParser","params":"FNumber"}}}]}}} ], otherRequest:[ { field:"FormId", label:"业务对象表单Id", type:"string", describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder", value:"STK_TransferDirect"}, { field:"IsAutoSubmitAndAudit", label:"提交并审核", type:"bool", value:true}, { field:"IsVerifyBaseDataField", label:"验证基础资料", type:"bool", describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)",value:false}, { field:"Operation",label:"执行的操作",type:"string",value:"Save"} ] } ``` #### 数据转换 在数据转换过程中,我们需要根据源平台的数据格式,将其转换为金蝶云星空API能够接受的格式。以下是关键字段及其对应关系: - `FBillNo`:单据编号,对应于源平台的`transfer_no`。 - `FBillTypeID`:单据类型,根据`from_warehouse_no`和`to_warehouse_no`进行条件判断。 - `FSaleOrgId`、`FSettleOrgId`、`FStockOutOrgId`等字段都需要通过特定解析器进行转换,以匹配金蝶系统中的编码。 #### 写入目标平台 完成数据转换后,我们使用配置好的API接口将数据写入金蝶云星空。具体步骤如下: 1. **构建请求体**:根据元数据配置,构建符合金蝶云星空API要求的请求体。 2. **发送请求**:通过HTTP POST方法,将构建好的请求体发送至金蝶云星空API接口。 3. **处理响应**:接收并处理API返回的响应信息,确保数据成功写入,并根据需要进行错误处理和日志记录。 以下是一个示例代码片段,用于发送请求: ```python import requests import json url = 'https://api.kingdee.com/batchSave' headers = {'Content-Type': 'application/json'} data = { # 根据元数据配置构建的数据 } response = requests.post(url, headers=headers, data=json.dumps(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}, Response: {response.text}") ``` 通过上述步骤,我们可以实现从旺店通到金蝶云星空的数据无缝对接,有效地完成了ETL过程中的转换与写入工作。这不仅提高了业务流程的自动化程度,也确保了数据的一致性和准确性。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T30.png~tplv-syqr462i7n-qeasy.image)