现代企业数据集成案例:吉客云到用友BIP系统的数据流转

  • 轻易云集成顾问-吕修远
### 吉客云到用友BIP数据集成案例分享:调拨入库与其他入库对接方案 在现代企业的数字化运营中,数据的高效传输和及时处理至关重要。本文将介绍通过轻易云平台实现吉客云数据无缝集成到用友BIP系统中的一个具体实例:从吉客云获取“调拨入库”数据并写入到用友BIP的“YS-其他入库”。 为了确保这一过程高效而可靠地完成,我们采用了一系列技术手段与最佳实践。 首先,我们利用了轻易云平台的可视化数据流设计工具,创建了一个名为“吉客云-调拨入库--->YS-其他入库-ok”的集成方案。这一方案不仅在界面上清晰展现了每个流程步骤,还使得操作和维护变得更加直观。 在具体实施过程中,通过调用吉客云提供的数据接口`erp.storage.goodsdocin.v2`,我们定时抓取最新的调拨入库数据,为后续处理奠定基础。鉴于大批量的数据需要被迅速且准确地传输至用友BIP系统,我们进一步优化了吞吐量,并合理设定分页机制以应对限流问题。 针对不同系统之间可能存在的数据格式差异,通过自定义的数据转换逻辑,对获取的数据进行了必要调整。例如,在字段映射和类型转换方面做了一些优化,使其符合用友BIP要求。同时,为保证写入过程顺利进行,每条记录都被精确地关联到了指定API `/yonbip/scm/othinrecord/single/save` 中。 实时监控和日志记录也是过程中不可或缺的一环。监控系统不仅能够及时发现潜在问题,还能快速定位并解决异常情况,从而保障整个数据流动的可靠性。此外,引人注目的集中告警功能,也让任何意外状况能第一时间得到反馈并采取相应措施。 综上所述,本次集成案例充分利用了轻易云平台卓越的数据管理能力,以及丰富灵活的问题解决机制,实现了跨系统间高效、透明、高质量的数据交换。接下来,将详细讲解不同阶段实施细节及相关代码示例,以便读者深入理解整个流程及关键技术点。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/D24.png~tplv-syqr462i7n-qeasy.image) ### 调用吉客云接口获取并加工数据 在数据集成生命周期的第一步,我们需要调用源系统吉客云的接口 `erp.storage.goodsdocin.v2` 来获取并加工数据。本文将详细探讨如何配置和调用该接口,并对返回的数据进行处理。 #### 接口配置与调用 首先,我们需要配置元数据,以便正确地调用吉客云的接口。以下是元数据配置的详细信息: ```json { "api": "erp.storage.goodsdocin.v2", "effect": "QUERY", "method": "POST", "number": "goodsdocNo", "id": "goodsdocNo", "idCheck": true, "request": [ {"field": "pageIndex", "label": "分页页码", "type": "string"}, {"field": "pageSize", "label": "分页页数", "type": "string", "value":"50"}, {"field": "goodsDocNo", "label": "入库单号", "type": "string"}, {"field": "startDate", "label": "创建时间的起始时间", "type":"string", "value":"{{LAST_SYNC_TIME|datetime}}"}, {"field": "endDate", "label":"创建时间的结束时间","type":"string", "value":"{{CURRENT_TIME|datetime}}"}, {"field":"inouttype","label":"入库类型","type":"string","describe": "入库类型(100-期初库存 101-采购入库 102-调拨入库 103-盘盈入库 104-其他入库 105-销售退货 106-完工入库 107-组装拆卸入库 108-翻新入库 109-报废入库 110-残次品入库111-成本调整 112-即采即入113-退料入库114-调拨退回115-维修返厂返还)","value":"102"}, {"field":"warehouseId","label":"仓库ID","type":"string"}, {"field":"warehouseCode","label":"仓库编号","type":"string"}, {"field":"vendId","label":"供应商ID(往来单位)","type":"string"}, {"field":"vendCode","label":"供应商编号(往来单位)","type":"string"}, {"field":"billNo","label":"上游单据号(关联单号)","type":"string"}, {"field":"userName","label":"创建人名称","type":"string"}, {"field":"gmtModifiedStart","label":"主表更新时间起始","type": "string"}, {"field":"gmtModifiedEnd","label":"主表更新时间截至","type": "string"}, {"field":"selelctFields","label": "返回参数","type": "string", "value": "goodsdocNo,inOutDate,userName,gmtCreate,inouttype,vendCustomerCode,warehouseCode,warehouseName,inOutReason,redStatus,financeBillStatus,goodsDocDetailList.goodsNo,goodsDocDetailList.quantity,goodsDocDetailList,goodsDocDetailList.transHasTaxPrice,goodsDocDetailList.serialNo"} ], autoFillResponse: true, condition_bk: [[{"field": warehouseCode,"logic": neqv2,"value": 03}]] } ``` #### 请求参数解析 1. **分页参数**: - `pageIndex`: 分页页码。 - `pageSize`: 分页页数,默认值为50。 2. **时间参数**: - `startDate`: 创建时间的起始时间,使用占位符 `{{LAST_SYNC_TIME|datetime}}` 动态获取上次同步时间。 - `endDate`: 创建时间的结束时间,使用占位符 `{{CURRENT_TIME|datetime}}` 动态获取当前时间。 3. **过滤条件**: - `inouttype`: 入库类型,固定值为102(调拨入库)。 - `warehouseCode`: 仓库编号,排除编号为03的仓库。 4. **返回字段**: - 配置了多个字段以确保返回的数据包含必要的信息,例如:`goodsdocNo`, `inOutDate`, `userName`, `gmtCreate`, 等等。 #### 数据请求与清洗 在完成接口配置后,我们通过POST请求调用该接口,并获取返回的数据。以下是一个示例请求: ```json { "pageIndex": 1, "pageSize": 50, // 动态生成 "startDate": "{{LAST_SYNC_TIME|datetime}}", // 动态生成 "endDate": "{{CURRENT_TIME|datetime}}", // 固定值 “inouttype”: “102” } ``` #### 数据清洗与转换 在获取到原始数据后,需要对其进行清洗和转换,以便后续处理和写入目标系统。以下是一些常见的数据清洗步骤: 1. **字段映射**:将原始数据字段映射到目标系统所需字段。例如,将 `goodsdocNo` 映射到目标系统中的相应字段。 2. **数据格式转换**:将日期格式从字符串转换为标准日期格式,确保一致性。 3. **过滤无效数据**:根据业务规则过滤掉不符合条件的数据,例如剔除仓库编号为03的数据。 #### 示例代码 以下是一个简单的Python示例代码,用于调用接口并处理返回的数据: ```python import requests import json from datetime import datetime # 配置请求URL和头部信息 url = 'https://api.jikexyun.com/erp.storage.goodsdocin.v2' headers = {'Content-Type': 'application/json'} # 构建请求体 payload = { 'pageIndex': '1', 'pageSize': '50', 'startDate': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'endDate': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'inouttype': '102' } # 发起POST请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与转换 cleaned_data = [] for item in data['data']: if item['warehouseCode'] != '03': cleaned_item = { 'document_number': item['goodsdocNo'], 'date': item['inOutDate'], 'creator': item['userName'], # 更多字段映射... } cleaned_data.append(cleaned_item) else: print(f'Error: {response.status_code}') # 输出清洗后的数据 print(json.dumps(cleaned_data, indent=4)) ``` 通过以上步骤,我们成功地调用了吉客云接口,获取并加工了所需的数据,为后续的数据写入和处理打下了坚实基础。这一过程展示了如何利用轻易云平台提供的元数据配置,实现高效、透明的数据集成。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/S7.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入用友BIPAPI接口 在数据集成生命周期的第二步,我们需要将源平台的数据进行ETL(提取、转换、加载)处理,并将其转换为目标平台——用友BIPAPI接口所能接收的格式,最终写入目标平台。以下是具体的技术实现过程。 #### 数据请求与清洗 首先,我们从源平台(如吉客云)获取原始数据。这些数据通常是未经处理的,需要进行清洗和预处理。清洗步骤包括去除无效数据、填补缺失值以及标准化字段格式等。 #### 数据转换与写入 接下来,我们进入关键的ETL转换阶段。我们需要将清洗后的数据按照用友BIPAPI接口的要求进行格式转换,并通过POST请求将其写入目标平台。以下是详细的元数据配置及其应用示例。 ##### 元数据配置解析 根据提供的元数据配置,我们需要构建一个POST请求,将数据写入用友BIPAPI接口。以下是主要字段及其含义: - **needCalcLines**: 表体行计算标识,默认传`false`,表示不对子表进行二次计算。 - **code**: 单据编号,需根据系统编码规则配置。 - **org**: 库存组织,传入id或code。 - **accountOrg**: 会计主体,与库存组织相同。 - **vouchdate**: 单据日期,时间戳格式。 - **bustype**: 交易类型,这里固定为`JKY002`。 - **warehouse**: 仓库,传入id或code。 - **department**: 部门,传入id或code。 - **operator**: 业务员,传入id或code。 - **memo**: 备注,可填写单据编号等信息。 - **_status**: 操作标识,这里固定为`Insert`表示新增操作。 子表字段(othInRecords)包括: - **rowno**: 行号 - **product**: 物料,传入id或code - **productsku**: 物料SKU - **batchno**: 批次号,根据条件判断是否填写 - **contactsQuantity, contactsPieces, qty, subQty**: 数量相关字段 - **unit, stockUnitId**: 主计量单位和库存单位 - **invExchRate**: 库存换算率 - **natUnitPrice, natMoney**: 单价和金额 - **goodsposition**: 货位 - **isSerialNoManage, isBatchManage, isExpiryDateManage**: 管理标识 - **memo**: 子表备注 - **_status**: 子表操作标识 孙表字段(othInRecordsSNs)包括: - **id, sn, _status, pubts** ##### 示例代码实现 以下是一个示例代码片段,用于构建并发送POST请求,将转换后的数据写入用友BIPAPI接口: ```python import requests # 构建请求头 headers = { 'Content-Type': 'application/json' } # 构建请求体 payload = { "needCalcLines": "false", "code": "QTRK0000001", "org": "wzyqzn", "accountOrg": "wzyqzn", "vouchdate": "2021-03-05", "bustype": "JKY002", "warehouse": "ck01", "department": "dept01", "operator": "operator_01", "memo": "QTRK0000001", "_status": "Insert", "othInRecords": [ { "rowno": 1, "product": "PD0817000001", "productsku": "PD08170000010004", "batchno": "", ... "_status": "Insert" } # 更多子表记录... ], ... } # 发送POST请求 response = requests.post( url='https://api.yonyou.com/yonbip/scm/othinrecord/single/save', headers=headers, json=payload ) # 检查响应状态码及内容 if response.status_code == 200: print("Data successfully written to YonYou BIP API") else: print(f"Failed to write data. Status code: {response.status_code}, Response content: {response.content}") ``` 在这个示例中,我们使用Python编程语言,通过requests库发送HTTP POST请求,将预处理后的数据按照元数据配置要求构建成JSON格式,并发送至用友BIPAPI接口。 #### 注意事项 1. 确保所有必填字段均已正确填写,如单据编号、库存组织、会计主体等。 2. 根据业务需求调整子表和孙表的数据结构,以确保数据的一致性和完整性。 3. 实时监控请求响应状态码和内容,以便及时发现并解决可能出现的问题。 通过上述步骤,我们可以高效地完成从源平台到目标平台的数据ETL转换和写入过程,实现不同系统间的数据无缝对接。 ![如何开发金蝶云星空API接口](https://pic.qeasy.cloud/T7.png~tplv-syqr462i7n-qeasy.image)