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

  • 轻易云集成顾问-曾平安
### 吉客云数据集成到金蝶云星空案例分享:吉客云其他出库(调拨经销商)对接直接调拨 在实际的系统对接项目中,如何高效、准确地将吉客云的数据无缝传输到金蝶云星空,一直是企业信息化过程中面临的重要挑战之一。本篇文章将详细探讨一个具体的对接方案——"吉客云其他出库(调拨经销商)对接直接调拨",该方案成功实现了从数据抓取到批量写入的一系列关键步骤。 #### 确保集成吉客云数据不漏单 为了保证在整个集成过程中数据不遗漏,我们设计了一套可靠的数据抓取和监控机制。通过调用API `erp.storage.goodsdocout` 定时获取吉客云中的相关出库记录,并实时监控请求结果,对每一条返回的数据进行精确校验。同时,通过增量同步技术,仅处理自上次同步以来的新变更,避免重复处理已同步的数据。 #### 大量数据快速写入到金蝶云星空 面对大规模数据传输需求,我们采用了金蝶云提供的`batchSave`接口,实现高效的数据批量写入。在具体实现中,将多条记录合并为一次批量操作,从而显著提高了系统吞吐率。此外,通过异步处理与多线程技术进一步加速数据库操作,确保及时响应业务需求。 #### 处理分页和限流问题 在调用吉客云API时,常会遇到分页返回及限流限制。我们通过合理设置分页参数以及最大限度利用额定访问频率来解决这一问题。例如,根据实际业务场景动态调整每页记录数,同时针对限流响应建立重试机制,以确保所有需要传输的数据都能成功获取。 #### 数据格式差异处理 由于不同系统之间可能存在字段命名或结构上的差异,在实践中我们通过映射表的方式进行灵活转换。这不仅包括纯粹的字段匹配,也涵盖复杂逻辑下的值转换,以适应两方系统各自特有的约束条件。例如,在字段映射过程中结合正则表达式以及函数运算等手段,使得最终提交至金蝶云星空的数据格式完全符合其要求。 总之,本案例展示了一种行之有效的方法来应对跨平台、跨系统之间复杂数据集成任务,这也为类似项目提供了宝贵借鉴。后续部分将深入介绍具体实施细节,包括日志管理、异常处理与自动重试等方面内容,让整个流程更加透明、安全且易于维护。 ![如何开发企业微信API接口](https://pic.qeasy.cloud/D31.png~tplv-syqr462i7n-qeasy.image) ### 调用吉客云接口erp.storage.goodsdocout获取并加工数据的技术案例 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用吉客云接口`erp.storage.goodsdocout`,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置元数据以便正确调用吉客云的API接口。以下是元数据配置的关键部分: ```json { "api": "erp.storage.goodsdocout", "method": "POST", "number": "goodsdocNo", "id": "recId", "pagination": { "pageSize": 50 }, "idCheck": true, "condition": [ [{"field":"inOutReason","logic":"like","value":"直营仓调出到经销仓"}], [{"field":"inOutReason","logic":"like","value":"猫超商家仓发货"}] ], "request": [ {"field":"pageIndex","label":"分页页码","type":"string"}, {"field":"pageSize","label":"分页页数","type":"string","value":"50"}, {"field":"goodsDocNo","label":"出库单号","type":"string"}, {"field":"startDate","label":"创建时间的起始时间","type":"string"}, {"field":"endDate","label":"创建时间的结束时间","type":"string"}, {"field":"inouttype","label":"类型","type":"string", "describe": "...", "value": "204"}, {"field":"sourceBillNo","label":"来源单号","type":"string"}, {"field":"warehouseCode","label":"仓库编号","type":"string"}, {"field":"vendCode","label":"供应商编号(往来单位)","type":"string"}, {"field":"billNo","label":"上游单据号(关联单号)","type":"string"}, {"field":"userName","label":"创建人名称","type":"string"}, {"field":"gmtModifiedStart","label":"主表更新时间起始", "type": "string", "value": "{{LAST_SYNC_TIME|datetime}}"}, {"field": "gmtModifiedEnd", "label": "主表更新时间截至", "type": "string", "value": "{{CURRENT_TIME|datetime}}"} ] } ``` #### 数据请求与清洗 在配置好元数据后,我们通过轻易云平台发起HTTP POST请求,调用`erp.storage.goodsdocout`接口。请求参数包括分页信息、出库单号、创建时间范围、类型等。这些参数确保我们能够精确地获取所需的数据。 例如,请求体可能如下: ```json { "pageIndex": 1, "pageSize": 50, "startDate": "2023-01-01T00:00:00Z", "endDate": "2023-12-31T23:59:59Z", "inouttype": "204", ... } ``` #### 数据转换与写入 在成功获取数据后,需要对数据进行清洗和转换,以便后续处理和存储。以下是一些常见的数据清洗操作: 1. **字段映射**:将API返回的数据字段映射到目标系统所需的字段。例如,将`goodsDocNo`映射为目标系统中的`documentNumber`。 2. **数据格式转换**:将日期字符串转换为标准日期格式,或将数值字段从字符串转换为数值类型。 3. **过滤无效数据**:根据业务规则过滤掉不符合条件的数据,例如删除缺少关键字段的数据记录。 示例代码(伪代码): ```python def clean_data(raw_data): cleaned_data = [] for record in raw_data: if 'goodsDocNo' in record and 'recId' in record: cleaned_record = { 'documentNumber': record['goodsDocNo'], 'recordId': record['recId'], 'createdTime': parse_date(record['startDate']), ... } cleaned_data.append(cleaned_record) return cleaned_data ``` #### 实时监控与日志记录 为了确保数据集成过程的透明度和可靠性,我们需要实时监控API调用和数据处理状态,并记录日志。轻易云平台提供了完善的监控和日志功能,可以帮助我们快速定位和解决问题。 例如,可以设置告警机制,当API调用失败或返回异常数据时,立即通知相关人员进行处理。 ```json { "monitoringEnabled": true, ... } ``` 通过以上步骤,我们可以高效地调用吉客云接口`erp.storage.goodsdocout`,并对获取的数据进行清洗和转换,为后续的数据处理打下坚实基础。这一过程不仅提高了业务透明度,还显著提升了工作效率。 ![如何开发企业微信API接口](https://pic.qeasy.cloud/S16.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现金蝶云星空API接口的数据转换与写入 在数据集成的生命周期中,ETL(Extract, Transform, Load)过程是将源平台的数据转换为目标平台可接受格式的关键步骤。本文将详细探讨如何通过轻易云数据集成平台,将吉客云其他出库(调拨经销商)的数据转换并写入金蝶云星空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":"{goodsdocNo}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"ZJDB01_SYS"}, {"field":"FStockOrgId","label":"调入库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"103"}, {"field":"FSettleOrgId","label":"结算组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"下拉列表","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value": "_function FROM_UNIXTIME( ( {gmtModified} / 1000 ) ,'%Y-%m-%d %T' )"}, {"field":"FStockOutOrgId","label":"调出库存组织","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value": "103"}, {"field": "FOwnerTypeOutIdHead", "label": "调出货主类型", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "BD_OwnerOrg"}, {"field": "FTransferDirect", "label": "调拨方向", "type": "string", "describe": "基础资料", "value": "GENERAL"}, {"field": "FBizType", "label": "业务类型", "type": "string", "describe": "", value: NORMAL}, {"field": FTransferBizType, label: 调拨类型, type: string, describe: 多类别基础资料列表, parser: { name: ConvertObjectParser, params: FNumber }, value: InnerOrgTransfer }, {"field" : FNote, label : 备注, type : string, describe : 多行文本, value : {inOutReason}}, { field: FBillEntry, label: 明细信息, type: array, children: [ { field: FMaterialId, label: 物料编码, type: string, describe: 基础资料, parser: { name: ConvertObjectParser, params: FNumber }, value: {{goodsDocDetailList.goodsNo}}, parent: FEntity }, { field: FUnitID, label : 单位 , type : string , describe : 基础资料 , parser : { name : ConvertObjectParser , params : FNumber } , value : _findCollection find FPurchaseUnitId_FNumber from 44da707b-4d02-3e20-ad97-fdd69ff7a37d where FNumber={{goodsDocDetailList.goodsNo}}, parent : FEntity }, { field : FQty , label : 实发数量 , type : string , describe : 数量 , value : {{goodsDocDetailList.quantity}} , parent : FEntity }, { field : FLot , label : 批号 , type : string , describe : 数量 , value : {{goodsDocDetailList.batchNo}} , parent : FEntity , parser:{ name:"ConvertObjectParser" ,"params" :"FNumber"}}, { field:FProduceDate,label:"生产日期",type:"string",describe:"数量",value:"_function FROM_UNIXTIME( ( {productionDate} / 1000 ) ,' %Y-%m-%d %T' ) ",parent:"FEntity"}, { field:"FSrcStockId" ,"label" :"调出仓库" ,"type" :"string" ,"describe" :"基础资料" ,"parser":{"name" :"ConvertObjectParser" ,"params" :"FNumber"},"value" :"{{warehouseCode}}" ,"parent" :"FEntity"}, { field:"FDestStockId" ,"label" :"调入仓库" ,"type" :"string" ,"describe" :"维度关联字段" ,"parser":{"name" :"ConvertObjectParser" ,"params" :"FNumber"},"value"_function case when '{inOutReason}' like '%猫超商家仓发货%' then '10DS' else '02DS' end ","parent ":"FEntity"} ], value:"goodsDocDetailList" } ], 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:"", value:false }, { field:"Operation", label:"", type:"", value:"Save" } ] } ``` #### 数据请求与清洗 在ETL过程的第一步,我们已经从吉客云获取了原始数据,并进行了必要的清洗。接下来,我们需要将这些清洗后的数据进行转换,以符合金蝶云星空API接口的要求。 #### 数据转换与写入 1. **字段映射与转换**: - `FBillNo` 映射到 `{goodsdocNo}`,表示单据编号。 - `FBillTypeID` 固定值 `ZJDB01_SYS`,通过 `ConvertObjectParser` 转换为目标系统识别的格式。 - `FStockOrgId` 固定值 `103`,同样通过 `ConvertObjectParser` 转换。 - `FSaleOrgId`, `FSettleOrgId` 等字段需要根据具体业务逻辑进行动态赋值,并通过相应的解析器进行格式转换。 2. **日期格式化**: - 日期字段 `FDate` 使用 `_function FROM_UNIXTIME( ( {gmtModified} / 1000 ) ,' %Y-%m-%d %T' )` 将 Unix 时间戳转换为标准日期时间格式。 3. **数组处理**: - 明细信息 `FBillEntry` 是一个数组,包含多个子字段,如物料编码、单位、实发数量等。这些子字段需要逐一映射和转换。 - 使用模板字符串,如 `{{goodsDocDetailList.goodsNo}}` 来动态获取数组中的每个元素,并进行相应的解析和赋值。 4. **复杂逻辑处理**: - 调入仓库字段 `FDestStockId` 根据条件表达式 `_function case when '{inOutReason}' like '%猫超商家仓发货%' then '10DS' else '02DS' end` 动态赋值。 5. **其他请求参数**: - 表单ID `FormId` 设置为 `"STK_TransferDirect"`。 - 自动提交并审核设置为 `true`。 - 验证基础资料有效性设置为 `false`。 #### API调用 最终配置完成后,通过 HTTP POST 请求调用金蝶云星空的 `batchSave` API 接口,将转换后的数据写入目标系统。请求体中包含所有映射和转换后的字段及其对应值。 ```http POST /k3cloud/api/batchSave HTTP/1.1 Host: your-k3cloud-server.com Content-Type: application/json { //... JSON payload as per the metadata configuration } ``` 通过以上步骤,我们成功地将吉客云的数据经过 ETL 转换后,写入到金蝶云星空系统,实现了不同系统间的数据无缝对接。这不仅提高了数据处理效率,也确保了数据的一致性和准确性。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T9.png~tplv-syqr462i7n-qeasy.image)