轻松实现吉客云与金蝶云星空的数据对接和转换

  • 轻易云集成顾问-孙传友
### 吉客云数据集成到金蝶云星空案例分享 在企业信息化的管理过程中,如何实现各个系统之间的数据对接与流转是一个重要课题。在本技术案例中,我们将详细探讨如何利用轻易云数据集成平台,实现吉客云中的组装拆卸单无缝集成到金蝶云星空的其他出库单上。 #### 数据获取与处理 首先,通过调用吉客云提供的API `erp.storage.goodsdocout.v2`接口来获取需要处理的数据。在这一阶段,为确保不漏单,需要实现定时可靠地抓取吉客云接口的数据,并且实时监控数据流程和状态。通过巧妙设置分页和限流机制,有效解决大批量数据读写的问题。 ```shell curl -X POST https://api.jike.com/erp/storage/goodsdocout/v2 \ -H 'Content-Type: application/json' \ -d '{"startTime": "2023-10-01T00:00:00", "endTime": "2023-10-31T23:59:59"}' ``` #### 数据格式转换及映射 由于吉客云和金蝶云星空在数据格式上的差异,对所抓取到的数据进行适当的字段映射和转换至关重要。例如,将从吉客云获取到的数据格式按照金蝶要求规范化: ```json { "sourceSystem": "JikeYun", "dataList": [ { "itemCode": "{商品编号}", "quantity": "{数量}", ... } ] } ``` 这里我们使用轻易平台自带的可视化工具,对不同字段进行一一匹配,确保数据信息得以正确传递。这一步骤能保证所有传输过程更加无误、紧密衔接,提高工作效率。 #### 数据写入与异常处理 完成以上步骤后,将整理好的数据调用金蝶API `batchSave` 进行入库操作。同时引入了错误重试机制,以便在遇见网络故障或其它不可预见问题时自动调度重试任务,从而保证关键业务流程不中断。 ```shell curl -X POST https://api.kingdee.com/batchSave \ -H 'Content-Type: application/json' \ -d @transformed_data.json ``` 此外,在整个过程中实施全面日志记录,使得每条操作都具备追溯性,这对于后期运维以及异常情况排查有极大的帮助。最后,通过定制化配置,实现了针对性更强、更精准的数据对接效果。 ![数据集成平台API接口配置](https://pic.qeasy.cloud/D12.png~tplv-syqr462i7n-qeasy.image) ### 调用吉客云接口erp.storage.goodsdocout.v2获取并加工数据 在数据集成生命周期的第一步,我们需要调用源系统吉客云的接口`erp.storage.goodsdocout.v2`来获取数据,并进行初步的加工处理。本文将详细探讨如何配置和使用该接口,以确保数据的准确性和完整性。 #### 接口配置 根据元数据配置,我们需要向吉客云发送一个POST请求,具体参数如下: - **api**: `erp.storage.goodsdocout.v2` - **method**: `POST` - **effect**: `QUERY` - **number**: `goodsdocNo` - **id**: `recId` - **idCheck**: `true` 请求参数包括分页信息、出入库类型、选择字段以及时间范围等。以下是请求参数的详细配置: ```json { "pageIndex": "{PAGINATION_START_PAGE}", "pageSize": "{PAGINATION_PAGE_SIZE}", "inouttype": "207", "selelctFields": "recId,goodsdocNo,billNo,inOutDate,gmtCreate,inouttype,inouttypeName,vendCustomerCode,vendCustomerName,currencyCode,currencyRate,userName,warehouseCode,warehouseName,comment,memo,logisticName,logisticNo,companyId,companyName,logisticType,logisticCode,inOutReason,sourceBillNo,channelId,channelCode,channelName,redStatus,field1,field2,field3,field4,field5,financeBillStatus,applyCompanyId,applyCompanyName,applyCompanyCode,applyDepartId,applyDepartName,departCode,applyUserId,applyUserName,outBillNo,gmtModified,...", "gmtModifiedStart": "{{LAST_SYNC_TIME|datetime}}", "gmtModifiedEnd": "{{CURRENT_TIME|datetime}}" } ``` 其他必要的请求参数包括方法名称、应用编号、版本号、返回格式、时间戳、业务参数和签名等: ```json { "method": "erp.storage.goodsdocout.v2", "appkey": "", "version": "v1.0", "contenttype": "json", "timestamp": "", "bizcontent": "", "sign": "" } ``` #### 数据请求与清洗 在发送请求后,吉客云会返回一个包含多个字段的数据集。为了确保数据的准确性和一致性,我们需要对返回的数据进行清洗和初步处理。 1. **字段映射与转换**:根据业务需求,将返回的数据字段映射到目标系统所需的字段。例如,将`goodsdocNo`映射为目标系统中的订单编号。 2. **数据过滤**:根据特定条件过滤不需要的数据。例如,只保留出入库类型为207(组装拆卸出库)的记录。 3. **格式化处理**:对日期、金额等字段进行格式化处理,确保符合目标系统的要求。 #### 示例代码 以下是一个示例代码片段,用于发送请求并处理返回的数据: ```python import requests import json from datetime import datetime # 配置请求参数 payload = { "pageIndex": 1, "pageSize": 100, "inouttype": "207", "selelctFields": "...", # 列表太长省略 "gmtModifiedStart": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "gmtModifiedEnd": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), # otherRequest parameters "method": "erp.storage.goodsdocout.v2", "appkey": "<your_app_key>", "version": "v1.0", "contenttype": "json", # timestamp and sign should be generated dynamically } # 发起POST请求 response = requests.post("https://api.jikexyun.com/erp/storage/goodsdocout/v2", data=json.dumps(payload)) data = response.json() # 数据清洗与转换 cleaned_data = [] for record in data['result']: cleaned_record = { '订单编号': record['goodsdocNo'], '客户名称': record['vendCustomerName'], '仓库名称': record['warehouseName'], '出库日期': record['inOutDate'], # 更多字段映射... } cleaned_data.append(cleaned_record) # 输出清洗后的数据 print(json.dumps(cleaned_data, indent=4)) ``` 通过上述步骤,我们可以成功调用吉客云接口获取所需的数据,并进行初步的清洗和加工,为后续的数据转换与写入做好准备。这一过程不仅提高了数据处理的效率,也确保了数据的一致性和准确性。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S21.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口 在数据集成的过程中,将源平台的数据转换为目标平台所能接收的格式是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将吉客云的组装拆卸单数据转换为金蝶云星空API接口所能接收的其他出库单格式,并最终写入目标平台。 #### 元数据配置解析 在进行ETL转换之前,我们需要理解和配置元数据。以下是元数据配置的详细解析: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{goodsdocNo}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","value":"QTCKD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"GENERAL"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{inOutDate}"}, {"field":"FDeptId","label":"领料部门","type":"string","describe":"基础资料","value":"02","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FNote","label":"备注","type":"string","describe":"多行文本","value":"组装拆卸"}, { "field": "FEntity", "label": "明细信息", "type": "array", "describe": "111", "value": "goodsDocDetailList", "children": [ {"field": "FMaterialId", "label": "物料编码", "type": "string", "value": "{{goodsDocDetailList.goodsNo}}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FQty", "label": "数量", "type": "string", "value": "{{goodsDocDetailList.quantity}}"}, {"field": "FStockId", "label": "仓库", "type": "string", "value": "{{goodsDocDetailList.warehouseCode}}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FEntryNote", "label": "备注", "type": "string", "value": "{{goodsDocDetailList.rowRemark}}"}, {"field": "FOwnerId", "label": "货主", "type": "string", "value": "100", "parser":{"name": ConvertObjectParser, params: FNumber}}, {"field": FLot, label: FLot, type: string, value: _function IF('{{goodsDocDetailList.batchNo}}'<>'DEFAULT','{{goodsDocDetailList.batchNo}}',NULL), parser:{name: ConvertObjectParser, params: FNumber}} ] } ], otherRequest: [ { field: FormId, label: FormId, type: string, describe: 必须填写金蝶的表单ID如:PUR_PurchaseOrder, value: STK_MisDelivery }, { field: IsAutoSubmitAndAudit, label: IsAutoSubmitAndAudit, type: bool, value: true }, { field: IsVerifyBaseDataField, label: IsVerifyBaseDataField, type: bool, describe: 是否验证所有的基础资料有效性,布尔类,默认false(非必录), value: false }, { field: Operation, label: Operation, type: string, value: Save } ], operation:{ rowsKey:"array", rows:"1", method:"batchArraySave" } } ``` #### 数据字段解析与转换 1. **基本字段映射**: - `FBillNo`:映射到源数据中的`goodsdocNo`,表示单据编号。 - `FBillTypeID`:固定值`QTCKD01_SYS`,通过`ConvertObjectParser`进行格式转换。 - `FStockOrgId`:固定值`100`,同样通过`ConvertObjectParser`进行格式转换。 - `FStockDirect`:固定值`GENERAL`,表示库存方向。 - `FDate`:映射到源数据中的`inOutDate`,表示日期。 - `FDeptId`: 固定值 `02`, 表示领料部门,通过 `ConvertObjectParser`. 2. **明细信息字段映射**: - `FEntity`: 明细信息字段是一个数组,包含多个子字段,每个子字段对应源数据中的一个属性。 - `FMaterialId`: 映射到明细列表中的物料编码,通过 `ConvertObjectParser`. - `FQty`: 映射到明细列表中的数量. - `FStockId`: 映射到明细列表中的仓库编码,通过 `ConvertObjectParser`. - `FLot`: 批次号,如果批次号不等于 'DEFAULT' 则使用批次号,否则为 NULL. 3. **其他请求参数**: - `FormId`: 固定值为 `STK_MisDelivery`, 表示表单ID. - `IsAutoSubmitAndAudit`: 固定值为 `true`, 表示自动提交和审核. - `IsVerifyBaseDataField`: 固定值为 `false`, 表示是否验证所有基础资料有效性. #### API接口调用 在完成元数据配置后,我们需要通过API接口将处理后的数据写入金蝶云星空。具体步骤如下: 1. **构建请求体**: 根据元数据配置构建请求体,将源平台的数据按照目标平台所需格式进行转换。 2. **发送HTTP请求**: 使用POST方法将构建好的请求体发送至金蝶云星空的API接口。确保设置正确的头部信息,如Content-Type等。 3. **处理响应**: 接收并处理API响应,根据响应结果判断操作是否成功,并记录日志以便后续追踪和排错。 以下是一个简化的HTTP请求示例: ```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 content: {response.content}") ``` 通过以上步骤,我们可以实现从吉客云到金蝶云星空的数据无缝对接,并确保每个环节都透明可控。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/T9.png~tplv-syqr462i7n-qeasy.image)