轻松搞定多系统数据对接:小满OKKICRM与用友U8的ETL转换

  • 轻易云集成顾问-张妍琪
### 小满OKKICRM数据集成到用友U8-凯迪森案例分享 在企业信息化过程中,实现不同系统之间的数据对接是提高运营效率的关键之一。本案例聚焦于如何利用轻易云数据集成平台,将小满OKKICRM系统中的销售订单数据无缝对接至用友U8-凯迪森。方案名称为“销售订单对接小满=>U8”。以下将详细解析此过程中的技术实现及相关挑战。 #### 集成需求与背景 为了确保小满OKKICRM中的所有销售订单能够及时、准确地同步到用友U8-凯迪森,我们需要解决如下几个技术问题: 1. **减少漏单风险**:如何确保每一条订单都能成功传输并写入目标系统。 2. **大量数据快速处理**:如何高效抓取和写入大批量数据,避免因延迟导致业务滞后。 3. **定时可靠的数据抓取**:通过调度任务定期从小满OKKICRM接口拉取最新的订单数据,并进行预处理。 4. **分页与限流管理**:应对API接口调用中可能遇到的分页和限流问题,保证稳定性。 5. **格式差异转换**:处理两个系统间存在的数据格式差异,并完成必要的数据映射和转换。 #### 技术实现概述 在整个实施过程中,我们主要使用了两个API接口: - 从小满OKKICRM获取订单列表的API: `/v1/invoices/order/list` - 向用友U8-凯迪森提交新的销售订单的API: `api/SalesOrder/Add` 为了实现上述功能,首先我们通过定时器模块,每隔一定时间调用`/v1/invoices/order/list`接口,读取最新的销售订单。这一步骤需要特别注意的是如何设计分页逻辑以有效获取所有待处理的数据,以及采用合适的方法来规避API限流带来的影响。 其次,当我们成功获取到这些原始数据后,需要进行格式转换。例如,小满OKKICRM返回的是JSON对象,而用友U8则要求特定字段形式输入。因此,我们创建了一个自定义映射规则,将原始JSON对象转换为符合目标系统要求的数据结构。在完成这一切之后,再通过HTTP POST请求,将整理后的新销售订单传递给`api/SalesOrder/Add` API,实现最终写入操作。 最后,通过实时监控机制记录下每个环节的数据状态,包括成功或失败日志,以便追踪异常情况,并设计了错误重试机制。当一次操作失败时,可以重新尝试相同步骤,最大限度降低遗漏风险,提高整体流程可靠性。 下一节将深入具体探讨各个模块细节,包括代码示 ![如何对接金蝶云星空API接口](https://pic.qeasy.cloud/D15.png~tplv-syqr462i7n-qeasy.image) ### 调用小满OKKICRM接口/v1/invoices/order/list获取并加工数据 在数据集成生命周期的第一步中,调用源系统接口以获取原始数据是至关重要的。本文将详细探讨如何通过轻易云数据集成平台调用小满OKKICRM的`/v1/invoices/order/list`接口,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置API接口的元数据,以便轻易云平台能够正确地请求和处理数据。以下是该接口的元数据配置: ```json { "api": "/v1/invoices/order/list", "method": "GET", "number": "name", "id": "order_id", "request": [ {"field": "start_time", "label": "时间查询范围:开始日期", "type": "string", "describe": "时间查询范围:开始日期", "value": "{{LAST_SYNC_TIME|datetime}}"}, {"field": "end_time", "label": "时间查询范围:结束日期", "type": "string", "describe": "时间查询范围:结束日期", "value": "{{CURRENT_TIME|datetime}}"}, {"field": "start_index", "label": "第几页,默认 = 1", "type": "number", "describe": "第几页,默认 = 1", "value":"1"}, {"field": "count", "label": "每页记录数,默认 = 10", "type":"number","describe":"每页记录数,默认 = 10","value":"10"}, {"field":"removed","label":"默认值: 0,设置=1时查询已删除的数据列表","type":"number","describe":"默认值: 0,设置=1时查询已删除的数据列表"}, {"field":"approval","label":"默认值: 0,设置=1时查询通过审批的数据列表","type":"number","describe":"默认值: 0,设置=1时查询通过审批的数据列表","value":"1"}, {"field":"status","label":"默认值: 0,设置对应的状态值可以查询相关状态的数据列表,支持以半角逗号分割的多个状态值","type":"string","describe":"默认值: 0,设置对应的状态值可以查询相关状态的数据列表,支持以半角逗号分割的多个状态值"} ], "otherRequest":[ {"field":"info_api","label":"详情接口","type":"string","value":"/v1/invoices/order/info"}, {"field":"info_key","label":"详情主键","type":"string","value":"order_id"} ] } ``` #### 参数说明 - `start_time` 和 `end_time` 用于定义数据同步的时间范围。我们使用动态参数 `{{LAST_SYNC_TIME|datetime}}` 和 `{{CURRENT_TIME|datetime}}` 来确保每次请求都能获取到最新的数据。 - `start_index` 和 `count` 用于分页控制。初始请求从第一页开始,每页获取10条记录。 - `removed`, `approval`, 和 `status` 是可选参数,用于过滤特定条件下的数据。例如,我们可以通过设置 `approval=1` 来只获取已审批通过的订单。 #### 数据请求与清洗 在完成API调用配置后,我们需要实际发起请求并处理返回的数据。以下是一个示例代码片段,用于演示如何在轻易云平台上实现这一过程: ```python import requests import json # 定义API URL和请求参数 api_url = 'https://api.xiaoman.com/v1/invoices/order/list' params = { 'start_time': '2023-01-01T00:00:00', 'end_time': '2023-01-31T23:59:59', 'start_index': 1, 'count': 10, 'approval': 1 } # 发起GET请求 response = requests.get(api_url, params=params) data = response.json() # 数据清洗与转换 cleaned_data = [] for order in data['orders']: cleaned_order = { 'order_id': order['order_id'], 'customer_name': order['customer']['name'], 'total_amount': float(order['total_amount']), # 添加更多需要清洗和转换的字段 } cleaned_data.append(cleaned_order) # 输出清洗后的数据 print(json.dumps(cleaned_data, indent=2)) ``` #### 数据转换与写入 在完成数据清洗后,我们可以将其转换为目标系统所需的格式,并写入目标数据库或系统。在这个案例中,我们假设目标系统是U8 ERP系统,因此需要将订单数据转换为U8所需的格式。 ```python # 示例:将清洗后的数据转换为U8格式 u8_data = [] for order in cleaned_data: u8_order = { '单据编号': order['order_id'], '客户名称': order['customer_name'], '总金额': order['total_amount'], # 添加更多U8所需字段 } u8_data.append(u8_order) # 写入U8系统(假设有一个函数write_to_u8_system) write_to_u8_system(u8_data) ``` 通过上述步骤,我们实现了从小满OKKICRM接口获取销售订单数据、进行清洗与转换,并最终写入目标系统U8。这一过程展示了轻易云平台在异构系统集成中的强大能力,使得不同系统间的数据对接变得高效且透明。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/S11.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台ETL转换:销售订单对接用友U8-凯迪森API接口 在使用轻易云数据集成平台进行数据集成时,第二步是将已经集成的源平台数据进行ETL转换,使其符合目标平台的API接口要求。本文将详细探讨如何将销售订单数据从小满系统转换为用友U8-凯迪森API接口所能接收的格式,并最终写入目标平台。 #### API接口元数据配置解析 根据提供的元数据配置,我们需要将销售订单信息通过POST方法发送到`api/SalesOrder/Add`接口。以下是关键字段及其对应的转换逻辑: 1. **cSoCode(销售订单号)** - 类型:string - 来源:{order_no} - 描述:直接从源系统获取订单号。 2. **cDefine1(客户订单号)** - 类型:string - 来源:{name} - 描述:直接从源系统获取客户订单号。 3. **dSoDate(订单日期)** - 类型:string - 来源:{account_date} - 描述:直接从源系统获取订单日期。 4. **cCusCode(客户编码)** - 类型:string - 来源:_findCollection find serial_id from 9f68b1db-1741-336d-869e-7123c93347ed where company_id={company_id} - 描述:通过查找集合来获取客户编码。 5. **cMaker(制单人)** - 类型:string - 来源:{{users.nickname}} - 描述:通过用户昵称获取制单人信息。 6. **cPersonCode(业务员编码)** - 类型:string - 来源:_findCollection find cPersonCode from b6a5ade7-7329-3a32-b4ba-aad75f701b4a where cPersonName={{users.nickname}} - 描述:通过查找集合来获取业务员编码。 7. **iTaxRate(税率)** - 类型:string - 来源:_function '{{税率}}'*100 - 描述:税率乘以100,转换为百分比格式。 8. **cDepCode(部门编码)** - 类型:string - 来源:_findCollection find cDepCode from b6a5ade7-7329-3a32-b4ba-aad75f701b4a where cPersonName={{users.nickname}} - 描述:通过查找集合来获取部门编码。 9. **cSTCode(销售类型编码)** - 类型:string - 来源:{{销售类型}} - 描述:直接从源系统获取销售类型编码。 10. **cCusName(客户名称)** - 类型:string - 来源:{company_name} - 描述:直接从源系统获取客户名称。 11. **cExchName(币别名称)** - 类型:string - 来源:{newcurrency} - 描述:直接从源系统获取币别名称。 12. **iExchRate(汇率)** - 类型:string - 来源:_function {exchange_rate}\/100 - 描述: 汇率除以100,转换为小数格式。 13. **dPreMoDateBT、dPreDateBT(预完工日期、预发货日期)** - 类型: string - 来源: {shipment_deadline_remark} - 描述: 直接从源系统获取预完工和预发货日期。 14. **bMustBook(必有定金)** – 类型: string – 来源: _function CASE '{{10453937747141}}' WHEN '是' THEN '1' ELSE '0' END – 描述: 根据条件判断是否有定金,返回相应值。 15. **fBookRatio、fBookSum、fBookNatSum(定金比例、定金原币金额、定金本币金额)** – 类型: string – 来源: {{10453950811508}}, {{10453955343615}}, _function '{{10453955343615}}'*('{exchange_rate}'\/100) – 描述: 从源系统获取定金相关信息,并根据汇率计算本币金额。 #### 子字段配置解析 对于嵌套在data字段中的子字段,我们需要处理每个产品行的信息: 1. **iRowNo(单据行号)、cInvCode(存货编码)、iQuantity(订单数量)、iTaxUnitPrice(原币销售单价)、iSum(原币销售金额)、iTaxRate(税率)、iUnitPrice(原币无税单价)、iMoney(原币无税金额)、iTax(原币税额)、iNatUnitPrice(本币无税单价)、iNatMoney(本币无税金额)、iNatSum(本币价税合计)、iNatTax(本币税额)、bGift(是否赠品)** 这些子字段涉及复杂的计算和逻辑处理,例如: - `iQuantity` 从 `{{product_list.count}}` 获取。 - `iTaxUnitPrice` 使用 `_function ROUND({{product_list.unit_price}},4)` 进行四舍五入处理。 - `iSum` 使用 `_function ROUND('{{product_list.unit_price}}'*'{{product_list.count}}',2)` 计算总金额。 - `bGift` 使用 `_function case '{{product_list.unit_price}}' when '0' then true else false end` 判断是否为赠品。 #### 数据写入目标平台 完成上述字段和子字段的ETL转换后,通过POST请求将整理好的JSON数据发送至用友U8-凯迪森API接口,实现数据写入目标平台。这样确保了不同系统间的数据无缝对接,并保证了数据的一致性和准确性。 ![轻易云数据集成平台金蝶集成接口配置](https://pic.qeasy.cloud/T25.png~tplv-syqr462i7n-qeasy.image)