从聚水潭到金蝶云星空:ETL过程中的数据转换与写入

  • 轻易云集成顾问-姚缘
### 采购退料单同步:从聚水潭到金蝶云星空的高效集成技术方案 在本案例中,我们探讨了如何将聚水潭仓储系统的数据精准集成到金蝶云星空账务管理平台,特别是针对采购退料单的同步过程。我们利用轻易云数据集成平台,以其强大的全生命周期管理和可视化操作界面,实现快速、稳定且透明的数据对接。 首先,为确保从聚水潭获取的数据不漏单,我们调取了其提供的API接口`/open/purchaseout/query`,并结合轻易云的平台特性,对数据抓取频率进行了精细配置,通过定时任务可靠地提取实时更新的信息。此外,在处理大量数据和分页限流问题时,我们采用批量处理策略,有效提高了数据传输效率,同时避免服务器压力过大。 在写入层面,金蝶云星空的API `batchSave` 提供了批量保存功能,但为了确保输入的数据格式与其要求完全匹配,我们实现了一套灵活的定制化映射规则。这不仅包括字段名称转换,还涵盖复杂的数据类型变换,使得多种格式差异及编码问题得到妥善解决。 另外,对于对接过程中可能出现的异常状况,例如网络波动或接口响应超时等不确定因素,我们设计了一整套错误重试机制。一旦发生错误,系统能够自动检测并重新尝试提交,从而保证最终数据的一致性和完整性。同时,通过实时监控与日志记录,我们可以随时追踪每一个步骤,并迅速定位及排查故障,大幅提升运维效率。 综上所述,本次采购退料单同步项目充分体现了高效、安全、可靠的数据对接方案,不仅满足业务需求,更为后续扩展提供坚实基础。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/D34.png~tplv-syqr462i7n-qeasy.image) ### 调用聚水潭接口/open/purchaseout/query获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用聚水潭接口`/open/purchaseout/query`来获取采购退料单数据,并对其进行初步加工。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。根据提供的元数据配置,我们将使用POST方法请求`/open/purchaseout/query`接口。以下是具体的请求参数配置: - **page_index**: 开始页码,默认为1。 - **page_size**: 每页条数,默认为50。 - **modified_begin**: 修改开始时间,使用变量`{{LAST_SYNC_TIME|datetime}}`动态获取上次同步时间。 - **modified_end**: 修改结束时间,使用变量`{{CURRENT_TIME|datetime}}`动态获取当前时间。 - **status**: 单据状态,固定为"Confirmed"。 请求示例如下: ```json { "page_index": "1", "page_size": "50", "modified_begin": "{{LAST_SYNC_TIME|datetime}}", "modified_end": "{{CURRENT_TIME|datetime}}", "status": "Confirmed" } ``` #### 数据过滤与条件设置 为了确保数据的准确性和相关性,我们还需要设置过滤条件。在本案例中,我们排除了仓库名称为“致轩辅料仓库主仓”的记录。具体条件配置如下: ```json { "field": "warehouse", "logic": "neqv2", "value": "致轩辅料仓库主仓" } ``` #### 异常处理与补偿机制 在实际操作中,可能会遇到各种异常情况,例如网络故障或接口超时等。因此,我们需要设置异常处理和补偿机制。根据元数据配置,我们可以通过定时任务(crontab)来实现补偿机制。例如,每天23:20执行一次补偿任务,请求过去三天的数据: ```json { "crontab": "20 23 * * *", "takeOverRequest": [ { "field": "modified_begin", "label": "修改开始时间", "type": "string", "is_required": false, "describe": "修改起始时间,和结束时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空", "value": "{{DAYS_AGO_3|datetime}}" } ] } ``` #### 数据加工与转换 获取到原始数据后,需要对其进行初步加工和转换,以便后续写入目标系统。在这个过程中,可以利用轻易云平台提供的可视化工具,对数据进行清洗、格式转换等操作。例如,将日期格式统一转换为ISO标准格式,将金额字段保留两位小数等。 以下是一个简单的数据转换示例: ```json { "transformations": [ { "field": "date", "operation": "formatDate", "params": { "inputFormat": "yyyy-MM-dd HH:mm:ss", "outputFormat": "yyyy-MM-dd'T'HH:mm:ss'Z'" } }, { "field": "amount", "operation": "round", "params": { "decimals": 2 } } ] } ``` 通过上述步骤,我们可以高效地调用聚水潭接口获取采购退料单数据,并对其进行必要的加工处理,为后续的数据写入和分析打下坚实基础。 ![如何对接钉钉API接口](https://pic.qeasy.cloud/S8.png~tplv-syqr462i7n-qeasy.image) ### 采购退料单同步至金蝶云星空API接口的ETL转换 在数据集成的生命周期中,将源平台的数据转换为目标平台可接收的格式是关键步骤。本文将详细探讨如何利用轻易云数据集成平台,将采购退料单的数据通过ETL(提取、转换、加载)过程,转换并写入金蝶云星空API接口。 #### 数据请求与清洗 首先,从源系统提取采购退料单的数据,并进行必要的清洗和预处理。这一步骤确保数据质量,为后续的ETL过程奠定基础。假设我们已经完成了这一步,并获得了结构化的源数据。 #### 数据转换与写入 接下来,我们进入数据转换与写入阶段。以下是元数据配置,用于将清洗后的数据转换为金蝶云星空API接口所需的格式,并通过`batchSave`方法写入目标平台。 ##### 元数据配置解析 ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ {"label":"单据类型","field":"FBILLTYPEID","type":"string","value":"TLD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FStockOrgId","label":"退料组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{io_id}"}, {"field":"FDate","label":"退料日期","type":"string","describe":"日期","value":"{io_date}"}, {"field":"FSupplierID","label":"供应商","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{seller_id}"}, {"field":"FMRTYPE","label":"退料类型","type":"string","describe":"下拉列表","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"B"}, {"field":"FMRDeptId","label":"退料部门","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FDESCRIPTION","label":"备注","type": "string", "describe": "多行文本", "value": "{remark}"}, {"field": "FSettleOrgId", "label": "结算组织", "type": "string", "describe": "组织", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "100"}, {"field": "FSettleCurrId", "label": "结算币别", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "PRE001"}, {"field": "FPayOrgId", "label": "付款组织", "type": "string", "describe": "组织", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "100"}, {"field": "FOwnerTypeIdHead", "label": "货主类型", "type": "string", "describe": "多类别基础资料列表", "value": "BD_OwnerOrg"}, {"field": "FOwnerIdHead", "label": 货主, type: string, describe: 多类别基础资料, parser: {name: ConvertObjectParser, params: FNumber}, value: 100}, { field: FPURMRBENTRY, label: 明细信息, type: array, describe: 明细信息, children: [ { field: FMATERIALID, label: 物料编码, type: string, describe: 基础资料, parser:{ name: ConvertObjectParser, params:FNumber}, value:"{{items.i_id}}", parent:"FPURMRBENTRY"}, { field: FRMREALQTY, label: 实退数量, type:string, describe: 数量,value:"{{items.qty}}", parent:"FPURMRBENTRY"}, { field:FSTOCKID,label:"仓库",type:string,describe:"基础资料",parser:{name:"ConvertObjectParser",params:"FNumber"},value:"CK",parent:"FPURMRBENTRY"}, { field:FNOTE,label:"备注",type:string,describe:"文本",parent:"FPURMRBENTRY"}, { field:FPrice,label:"单价",type:string,describe:"单价",parent:"FPURMRBENTRY"}, { field:FGiveAway,label:"是否赠品",type:string,describe:"复选框",parent:"FPURMRBENTRY"}, { field:FOWNERTYPEID,label:"货主类型",type:"string",describe:"多类别基础资料列表",value:"BD_OwnerOrg",parent:"FPURMRBENTRY"}, { field:FOWNERID,label:"货主",type:"string",describe:"多类别基础资料",parser:{name:"ConvertObjectParser",params:"FNumber"},value:"100",parent:"FPURMRBENTRY"}, { field:FENTRYTAXRATE,label:"税率",type:"string",describe:"小数",parent:"FPURMRBENTRY"}, { field:FTAXPRICE,label:含税单价,type:字符串,描述:单价,值:{{items.cost_price}},父母:FPURMRBENTRY} ], value:items }, { field: F_VPPH_LargeText, label: 聚水潭备注, type: 字符串, value:{remark} }, { field: FBusinessType, label:业务类型, type:字符串, value:CG } ], otherRequest:[ { field:“FormId”, label:“业务对象表单Id”, type:“字符串”, describe:“必须填写金蝶的表单ID如:PUR_PurchaseOrder”, value:“PUR_MRB” }, { field:“Operation”, label:“执行操作”, type:“字符串”, value:“批量保存” }, { field:“IsAutoSubmitAndAudit”, label:“提交并审核”, type:“布尔型”, value:“假” }, { field:“IsVerifyBaseDataField”, label:“验证基本数据字段”, type:“布尔型”, describe:“是否验证所有基本数据的有效性,布尔型,默认false(非必录)”, value:“true” }, { field:“SubSystemId”, label:“系统模块”, type:“字符串”, describe:“默认仓库模块”, value:“21” } ] } ``` ##### 核心字段解析 1. **FBILLTYPEID** - 单据类型,通过`ConvertObjectParser`解析为金蝶系统识别的编码。 2. **FStockOrgId** - 退料组织,同样通过`ConvertObjectParser`解析。 3. **FBillNo** - 单据编号,直接映射源系统中的`io_id`。 4. **FSupplierID** - 供应商,通过`ConvertObjectParser`解析为供应商编码。 5. **FMRTYPE** - 退料类型,通过固定值`B`表示。 6. **FPURMRBENTRY** - 明细信息,包括物料编码、实退数量、仓库等子字段,每个子字段都通过相应的解析器进行处理。 ##### 数据转换示例 假设从源系统提取的数据如下: ```json { io_id: 'RT20231001', io_date:'2023-10-01', seller_id:'SUP123', items:[ { i_id:'MAT001', qty:'10', cost_price:'100' } ], remark:'测试备注' } ``` 根据元数据配置,上述源数据将被转换为如下格式,并通过POST请求发送至金蝶云星空API接口: ```json { FormId:'PUR_MRB', Operation:'batchSave', IsAutoSubmitAndAudit:false, IsVerifyBaseDataField:true, SubSystemId:'21', Model:{ FBILLTYPEID:{ FNumber:'TLD01_SYS' }, FStockOrgId:{ FNumber:'100' }, FBillNo:'RT20231001', FDate:'2023-10-01', FSupplierID:{ FNumber:'SUP123' }, FMRTYPE:{ FNumber:'B' }, FPURMRBENTRY:[ { FMATERIALID:{ FNumber:'MAT001' }, FRMREALQTY:'10', FTAXPRICE:'100' } ], FDESCRIPTION:'测试备注' } } ``` #### 实际应用中的注意事项 1. **字段匹配与映射** - 确保所有字段都准确映射到目标平台所需格式。 2. **解析器配置** - 使用合适的解析器(如`ConvertObjectParser`)来处理复杂的数据转换需求。 3. **错误处理与日志记录** - 实时监控和记录每次请求和响应,以便快速定位和解决问题。 通过上述步骤和配置,我们可以高效地将采购退料单的数据从源系统转换并写入到金蝶云星空,实现不同系统间的数据无缝对接。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/T14.png~tplv-syqr462i7n-qeasy.image)