轻易云ETL:将金蝶入库单数据高效写入旺店通

  • 轻易云集成顾问-叶威宏
### 标准-金蝶-其他入库单——>旺店通-自流转入(外仓调整)数据集成案例分析 在企业信息系统集成过程中,高效而准确的数据对接是关键。本技术案例将详细分享如何通过轻易云数据集成平台,实现金蝶云星空与旺店通·旗舰版之间的入库单数据无缝对接及自流转入(外仓调整)功能。 在该方案中,我们通过调用金蝶云星空API接口`executeBillQuery`来获取相关的入库单数据,并利用轻易云平台特有的数据处理与监控能力,确保每一条记录均被精准捕获且不漏单。特别是在高并发场景下,有效解决了分页和限流问题,为后续批量写入旺店通·旗舰版提供了坚实基础。对于大量订单的快速写入,我们使用了旺店通·旗舰版的API `wms.outer.OuterIn.createOrder`,结合定制化的数据映射,提高操作效率和可靠性。 同时,通过在轻易云平台配置实时监控和日志记录功能,可以全程跟踪每一条数据从抓取到写入的状态,并实现异常处理与错误重试机制,大幅提升整体系统的稳定性和可维护性。这些措施不仅保障了业务连续性,也为日后的运维工作带来了极大便利。 本案例所采用的方法论和技术手段,对于其他类似场景下的数据集成都具有较高参考价值,也是我们探索优化系统间互联互通的一次重要实践。 ![用友与MES系统接口开发配置](https://pic.qeasy.cloud/D31.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口来获取并加工数据。 #### 接口配置与请求参数 首先,我们需要配置接口的元数据。根据提供的元数据配置,我们可以看到该接口使用POST方法进行调用,主要用于查询(effect为QUERY)。以下是请求参数的详细配置: ```json { "api": "executeBillQuery", "effect": "QUERY", "method": "POST", "number": "FBillNo", "id": "FEntity_FEntryID", "name": "FBillNo", "idCheck": true, "request": [ {"field": "FEntity_FEntryID", "label": "FEntryID", "type": "string", "describe": "FEntryID", "value": "FEntity_FEntryID"}, {"field": "FID", "label": "实体主键", "type": "string", "describe": "实体主键", "value": "FID"}, {"field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "FBillNo"}, {"field": "FDocumentStatus", "label": "单据状态", "type": "string", "describe": "单据状态", "value":"FDocumentStatus"}, {"field":"FStockOrgId_FNumber","label":"库存组织","type":"string","describe":"库存组织","value":"FStockOrgId.FNumber"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"FDate"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","value":"FBillTypeID.FNumber"}, {"field":"FSUPPLIERID_FNumber","label":"供应商","type":"string","describe":"供应商","value":"FSUPPLIERID.FNumber"}, {"field":"FNOTE","label":"备注","type":"string","describe":"备注","value":"FNOTE"}, {"field":"FMATERIALID_FNumber","label":"物料编码","type":"string","describe":"物料编码","value": "FMATERIALID.FNumber"}, {"field":"FSTOCKID","label":"收货仓库","type":"string","describe": "收货仓库","value": "FSTOCKID.FNumber"}, {"field": "FQty","label": "实收数量","type": "string","describe": "实收数量","value": "FQty"}, {"field": "FPrice","label": "成本价","type": "string","describe": "成本价","value": "FPrice"}, {"field": "FAmount","label": "总成本","type": "string","describe": 总成本,""value: FAmount}, {"field: FBOMID,""label: BOM版本,""type: string,""describe: BOM版本,""value: FBOMID}, {"field: 生产日期,""label: 生产日期,""type: 字符串,""描述: 生产日期,""值: 生产日期}, {"字段:有效期至, 标签:有效期至, 类型:字符串, 描述:有效期至, 值:有效期至}, {"字段:FMTONO, 标签:计划跟踪号, 类型:字符串, 描述:计划跟踪号, 值:FMTONO}, {"字段:项目编号, 标签:项目编号, 类型:字符串, 描述:项目编号, 值:项目编号}, {"字段:库存状态, 标签:库存状态, 类型:字符串, 描述:库存状态, 值:库存状态}, ``` #### 请求示例 为了更好地理解如何调用该接口,我们来看一个具体的请求示例。假设我们需要查询特定条件下的数据,可以构造如下请求体: ```json { "_FormId_ ": "_STK_MISCELLANEOUS_ ", "_FieldKeys_ ": "_ FEntity_FEntryID, FBillNo, FDocumentStatus, FStockOrgId.FNumber, FDate, FBillTypeID.FNumber, FSUPPLIERID.FNumber, FNOTE, FMATERIALID.FNumber, FSTOCKID.FNumber, FQty, FPrice, FAmount _ ", "_FilterString_ ": "_ FApproveDate>='2024-08-05 17:30:00' and FStockOrgId.FNumber='101' and FSTOCKID.F_TBIK_Assistant_qtr = '自流转仓' and FBillTypeID.FNUMBER in ('QTRKD01_SYS') _ ", "_Limit_ ": "_100_ ", "_StartRow_ ": "_0_ " } ``` 上述请求体中,我们指定了需要查询的字段、过滤条件以及分页参数。这样可以确保我们只获取到符合条件的数据,并且避免一次性返回过多数据导致性能问题。 #### 数据处理与清洗 在获取到原始数据后,我们需要对其进行清洗和加工。这一步骤通常包括以下几个方面: 1. **字段映射**: 将源系统中的字段映射到目标系统所需的字段。例如,将`FBillNo`映射为目标系统中的订单编号。 2. **数据转换**: 根据业务需求对某些字段进行转换,例如将日期格式从`YYYY-MM-DD`转换为`MM/DD/YYYY`。 3. **过滤无效数据**: 去除不符合业务规则的数据,例如状态为“已取消”的订单。 以下是一个简单的数据处理示例: ```python def process_data(raw_data): processed_data = [] for entry in raw_data: if entry['FDocumentStatus'] != 'C': processed_entry = { 'order_no': entry['FBillNo'], 'date': convert_date_format(entry['FDate']), 'supplier': entry['FSUPPLIERID_FNumber'], 'total_cost': float(entry['FAmount']), # 更多字段映射... } processed_data.append(processed_entry) return processed_data def convert_date_format(date_str): from datetime import datetime date_obj = datetime.strptime(date_str, '%Y-%m-%d') return date_obj.strftime('%m/%d/%Y') ``` 通过上述代码,我们可以将原始数据中的订单编号、日期、供应商和总成本等信息提取并转换为目标格式。 #### 总结 通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,我们能够高效地获取源系统中的数据,并对其进行清洗和加工。这一步骤不仅确保了数据的一致性和准确性,还为后续的数据转换与写入奠定了坚实基础。在实际应用中,根据具体业务需求调整和优化这些步骤,将进一步提升整体集成效率。 ![系统集成平台API接口配置](https://pic.qeasy.cloud/S17.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:ETL转换与写入旺店通·旗舰版API接口 在数据集成的生命周期中,ETL(Extract, Transform, Load)转换是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并转为目标平台旺店通·旗舰版API接口所能够接收的格式,最终写入目标平台。 #### API接口配置与元数据解析 在本案例中,我们需要将标准-金蝶-其他入库单的数据转换并写入到旺店通·旗舰版。我们使用的API接口是`wms.outer.OuterIn.createOrder`,其请求方法为`POST`。以下是该API接口的元数据配置: ```json { "api": "wms.outer.OuterIn.createOrder", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "order", "label": "单据头", "type": "object", "children": [ {"field": "order_no", "label": "外部单号", "type": "string", "value": "{FBillNo}"}, {"field": "warehouse_no", "label": "仓库编号", "type": "string", "value": "{FSTOCKID}"}, {"field": "reason", "label": "出库原因", "type": "string", "value": "{F_TBIK_RKLX}"}, {"field": "remark", "label": "备注", "type": "string", "value": "{FNOTE}"} ] }, { "field": "order_details", "label": "单据明细", "type": "array", ... }, {"field":"is_check","label":"是否审核","type":"bool","value":"true"} ], ... } ``` #### 数据清洗与转换 1. **数据提取**:从源系统(金蝶)中提取原始数据,包括单据头和单据明细部分。 2. **数据清洗**:确保提取的数据无误,并按照目标系统(旺店通)的要求进行必要的清洗。例如,确保所有字段都有值,且值符合预期格式。 3. **数据转换**: - 单据头部分: - `order_no` 对应 `{FBillNo}` - `warehouse_no` 对应 `{FSTOCKID}` - `reason` 对应 `{F_TBIK_RKLX}` - `remark` 对应 `{FNOTE}` - 单据明细部分: - `spec_no` 对应 `{FMATERIALID_FNumber}` - `num` 对应 `{FQty}` - `remark` 对应 `{FEntryNote}` #### 数据写入 在完成上述步骤后,我们将清洗和转换后的数据通过API接口写入到旺店通·旗舰版。以下是一个示例请求体: ```json { "order": { ... }, ... } ``` #### 实际操作步骤 1. **配置请求参数**:根据元数据配置文件,设置请求参数。 2. **调用API接口**:使用HTTP POST方法,将请求体发送到目标API接口。 3. **处理响应结果**:检查响应结果,确保数据成功写入。如果出现错误,根据错误信息进行调试和修正。 通过上述步骤,我们可以实现从金蝶到旺店通的数据无缝对接。这不仅提升了业务效率,还确保了数据的一致性和准确性。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T27.png~tplv-syqr462i7n-qeasy.image)