轻易云数据集成案例:差旅费报销数据ETL及写入金蝶云平台

  • 轻易云集成顾问-钟家寿
### FD001-差旅费报销申请 泛微=>金蝶--498:系统对接集成技术案例 在企业的日常运作中,差旅费报销流程是一个相当重要且复杂的环节。为了提升效率并确保数据准确性,我们实施了泛微OA-Http与金蝶云星空的数据集成方案,这一过程得益于轻易云数据集成平台的强大功能支持。本次案例重点分享FD001解决方案——“差旅费报销申请 泛微=>金蝶--498”的具体技术细节和实现方法。 **1. 数据获取** 首先,通过调用泛微OA-Http接口`/api/workflow/paService/getWorkflowRequest`进行数据抓取。为保证数据不漏单,我们设置了定时任务,定期可靠地从泛微OA获取差旅费报销申请相关数据。同时,需要处理分页及限流问题,以应对大量请求可能带来的性能挑战。 **2. 数据转换与格式适配** 由于泛微OA-Http与金蝶云星空之间存在数据结构上的不一致,我们利用轻易云平台提供的自定义转换逻辑模块,对原始数据进行清洗、整理和映射。这一步骤至关重要,有助于后续的数据无缝写入操作。在这里,需特别注意字段名称、类型及层级关系等方面的一致性要求。 **3. 数据导入** 通过调用金蝶云星空API `batchSave` 完成批量写入操作。这一过程中,高吞吐量的数据写入能力得到了充分发挥,使得大量差旅费用报销信息能够快速而有效地进入到ERP系统中。此外,为确保每条记录都被成功处理并存储,还配置了完善的异常处理机制和错误重试策略。 **4. 实时监控与质量保障** 整个集成过程实时监控着,每一个步骤都有详细日志记录,并及时发出告警通知。在遇到任何潜在问题时,可以迅速定位和修正,从而保障整体系统稳定运行。另外,通过内置的数据质量检测工具,实现对传输过程中出现异常或错误信息的即时处理以及纠正,为业务部门提供高度可信赖的数据支持。 上述这些关键步骤构建起了一套完整且高效的跨系统差旅费报销业务流程集成方案,从源头抓取、转换适配再到最终导入,全方位保障了企业财务管理中的准确性和及时性。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/D10.png~tplv-syqr462i7n-qeasy.image) ### 调用泛微OA-Http接口获取并加工数据的技术案例 在数据集成生命周期的第一步,调用源系统接口获取数据是至关重要的。本文将详细探讨如何通过轻易云数据集成平台调用泛微OA-Http接口`/api/workflow/paService/getWorkflowRequest`来获取差旅费报销申请的数据,并进行初步加工。 #### 接口调用配置 首先,我们需要配置元数据以便正确调用泛微OA-Http接口。以下是我们使用的元数据配置: ```json { "api": "/api/workflow/paService/getWorkflowRequest", "effect": "QUERY", "method": "GET", "number": "requestId", "id": "requestId", "name": "id", "idCheck": true, "request": [ { "field": "workflowId", "label": "e9流程id", "type": "string", "value": "498" }, { "field": "workflowIdList", "label": "workflowIdList中间方案ID", "type": "string", "value": "2356388e-8c49-35b3-bb7e-1eca1a8617d5" } ], "autoFillResponse": true } ``` #### 元数据解析 1. **API路径**:`/api/workflow/paService/getWorkflowRequest` - 此路径用于访问泛微OA系统中的特定工作流请求。 2. **请求方式**:`GET` - 我们使用HTTP GET方法来获取数据。 3. **请求参数**: - `workflowId`: 对应的e9流程ID,值为`498`。 - `workflowIdList`: 中间方案ID,值为`2356388e-8c49-35b3-bb7e-1eca1a8617d5`。 4. **自动填充响应**:设置为`true`,表示系统会自动处理并填充返回的数据。 #### 实际操作步骤 1. **配置API调用** 在轻易云平台上,我们首先需要配置API调用。根据元数据配置,我们在平台上创建一个新的API调用任务,填写相应的API路径和请求参数。 2. **发送请求** 配置完成后,发送HTTP GET请求到泛微OA系统。由于我们已经在元数据中定义了必要的参数,因此系统会自动将这些参数包含在请求URL中。例如: ``` GET /api/workflow/paService/getWorkflowRequest?workflowId=498&workflowIdList=2356388e-8c49-35b3-bb7e-1eca1a8617d5 ``` 3. **处理响应** 接收到响应后,轻易云平台会根据配置自动填充和处理返回的数据。假设返回的数据格式如下: ```json { "requestId": 12345, "status": "approved", ... } ``` 4. **数据清洗与转换** 在接收到原始数据后,需要对其进行清洗和转换,以便后续写入目标系统(如金蝶)。例如,我们可能需要提取特定字段、转换日期格式或进行单位换算等操作。 #### 数据清洗示例 假设我们需要提取并转换以下字段: - `requestId`: 请求ID - `status`: 请求状态 我们可以编写一个简单的数据清洗脚本: ```python def clean_data(raw_data): cleaned_data = {} cleaned_data['request_id'] = raw_data.get('requestId') cleaned_data['status'] = raw_data.get('status').upper() # 转换状态为大写 return cleaned_data # 示例原始数据 raw_data = { 'requestId': 12345, 'status': 'approved' } # 清洗后的数据 cleaned_data = clean_data(raw_data) print(cleaned_data) ``` 输出结果: ```json { 'request_id': 12345, 'status': 'APPROVED' } ``` 通过上述步骤,我们成功地从泛微OA系统获取了差旅费报销申请的数据,并进行了初步的清洗和转换,为后续的数据写入做好了准备。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/S18.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将差旅费报销申请数据转换并写入金蝶云星空 在数据集成过程中,将源平台的数据转换为目标平台能够接收的格式是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将泛微的差旅费报销申请数据进行ETL转换,并通过金蝶云星空API接口写入目标平台。 #### 配置API接口 首先,我们需要配置金蝶云星空的API接口。根据提供的元数据配置,目标API为`batchSave`,请求方法为`POST`。以下是关键字段的配置细节: 1. **单据类型 (FBillTypeID)** - 类型:字符串 - 描述:单据类型 - 示例值:QTYFD01_SYS - 解析器:ConvertObjectParser,参数为FNumber 2. **单据编号 (FBillNo)** - 类型:字符串 - 描述:单据编号 3. **业务日期 (FDATE)** - 类型:字符串 - 描述:业务日期 - 示例值:{{workflowMainTableInfo.sqrq}} 4. **往来单位类型 (FCONTACTUNITTYPE)** - 类型:字符串 - 描述:往来单位类型 - 示例值:BD_Empinfo 5. **往来单位 (FCONTACTUNIT)** - 类型:字符串 - 描述:往来单位 - 解析器:ConvertObjectParser,参数为FNumber - 示例值:_findCollection find workcode from c0198816-9822-38f3-b995-fc700a9925e7 where id={{workflowMainTableInfo.skmc_FV}} #### 数据清洗与转换 在数据清洗与转换阶段,需要对源数据进行解析和格式化,以满足目标系统的要求。以下是一些关键字段的处理逻辑: 1. **币别 (FCURRENCYID)** - 使用`ConvertObjectParser`解析器,将币别代码转换为目标系统识别的格式。 ```json { "field": "FCURRENCYID", "label": "币别", "type": "string", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "_findCollection find FNumber from 5740d4e3-ebe8-3548-9635-f35e1fdc983b where FCODE={{workflowMainTableInfo.bb1}}" } ``` 2. **结算组织、采购组织、付款组织 (FSETTLEORGID, FPURCHASEORGID, FPAYORGID)** - 这些字段都需要使用相同的解析器和映射逻辑。 ```json { "field": "FSETTLEORGID", "label": "结算组织", "type": "string", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "{{workflowMainTableInfo.sqgs}}", "mapping": { "target": "65af7024d24198113013f21e", "direction": "positive" } } ``` 3. **费用项目编码 (FCOSTID)** ```json { "field": "FCOSTID", "label": "费用项目编码", "type": "string", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "_findCollection find FNumber from a3c8a497-8be0-36b3-956c-94619b971636 where FName={{detail_0.fyxmzl}}" } ``` 4. **发票类型 (FINVOICETYPE)** ```json { "field": "FINVOICETYPE", "label": "发票类型", "type": "string", // 根据税率条件判断发票类型,6%或13%为增值税专用发票,其余为普通发票。 // 这里使用_function进行条件判断。 // 示例值:"{{detail_0.sl}}" 为税率字段。 // 返回 '1' 表示增值税专用发票,'0' 表示普通发票。 // 使用 IF 函数进行条件判断。 // 替换示例值中的 '%' 符号以便于计算。 // 输出结果作为 FINVOICETYPE 字段的值。 // 最终生成 JSON 配置如下: value: "_function IF(('{{detail_0.sl}}'='6%') or ('{{detail_0.sl}}'='13%'),'1','0')" } ``` 5. **不含税金额 (FNOTAXAMOUNTFOR)** ```json { field: 'FNOTAXAMOUNTFOR', label: '不含税金额', type: 'string', describe: '总金额', // 使用_function函数计算不含税金额。 // 示例值:"{{detail_0.hj}}" 为含税总金额字段。 // 替换示例值中的 '%' 符号以便于计算。 // 将含税总金额除以(1+税率),并保留两位小数。 // 输出结果作为 FNOTAXAMOUNTFOR 字段的值。 // 最终生成 JSON 配置如下: value: "_function round('{{detail_0.hj}}'\/(1+(REPLACE('{{detail_0.sl}}','%','')*0.01)),2)" } ``` #### 写入目标平台 完成数据清洗与转换后,通过调用金蝶云星空API接口将数据写入目标系统。以下是完整的请求结构: ```json { api: 'batchSave', effect: 'EXECUTE', method: 'POST', idCheck: true, operation: { rowsKey: 'array', rows: 1, method: 'batchArraySave' }, request: [ { field: 'FBillTypeID', label: '单据类型', type: 'string', value: 'QTYFD01_SYS' }, { field: 'FBillNo', label: '单据编号', type: 'string' }, { field: 'FDATE', label: '业务日期', type: 'string', value: '{{workflowMainTableInfo.sqrq}}' }, { field: 'FCONTACTUNITTYPE', label: '往来单位类型', type: 'string', value: 'BD_Empinfo' }, { field: 'FCONTACTUNIT', label: '往来单位', type: 'string', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:'_findCollection find workcode from c0198816-9822-38f3-b995-fc700a9925e7 where id={{workflowMainTableInfo.skmc_FV}}'}, { field:'FCURRENCYID', label:'币别', type:'string', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:'_findCollection find FNumber from 5740d4e3-ebe8-3548-9635-f35e1fdc983b where FCODE={{workflowMainTableInfo.bb1}}'}, { field:'FSETTLEORGID', label:'结算组织', type:'string', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:'{{workflowMainTableInfo.sqgs}}'}, { field:'FPURCHASEORGID', label:'采购组织', type:'string', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:'{{workflowMainTableInfo.sqgs}}'}, { field:'FPAYORGID', label:'付款组织', type:'string', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:"{{workflowMainTableInfo.sqgs}}" }, { field:"FPURCHASEDEPTID",label:"采购部门",type:"string",value:"{{workflowMainTableInfo.sqbm_FV}}",parser:{name:"ConvertObjectParser",params:"FNumber"}}, { field:"FPURCHASEDEPTID",label:"采购部门",type:"string",value:"{{workflowMainTableInfo.sqbm_FV}}",parser:{name:"ConvertObjectParser",params:"FNumber"}}, { field:"FPURCHASEDEPTID",label:"采购部门",type:"string",value:"{{workflowMainTableInfo.sqbm_FV}}",parser:{name:"ConvertObjectParser",params:"FNumber"}}, { field:"FPURCHASEDEPTID",label:"采购部门",type:"string",value:"{{workflowMainTableInfo.sqbm_FV}}",parser:{name:"ConvertObjectParser",params:"FNumber"}}, { field:"FPURCHASEDEPTID",label:"采购部门",type:"string",value:"{{workflowMainTableInfo.sqbm_FV}}",parser:{name:"ConvertObjectParser",params:"FNumber"}}, ], } ``` 通过上述配置和处理逻辑,我们可以确保源平台的数据经过清洗和转换后,能够成功写入金蝶云星空系统。这一过程不仅提高了数据处理效率,还保证了数据的一致性和准确性。 ![钉钉与WMS系统接口开发配置](https://pic.qeasy.cloud/T11.png~tplv-syqr462i7n-qeasy.image)