### Ioan_新借款单(费用申请单)V4.0:钉钉数据集成到金蝶云星空的技术实现
在实际业务环境中,如何高效地将钉钉中的各类申请表、审批记录等数据集成到企业内部系统,如金蝶云星空,是每个信息化管理团队急需解决的问题。本文将详细探讨Ioan_新借款单(费用申请单)V4.0方案的具体实施过程,包括API接口调用、数据转换和异常处理等关键技术要点。
首先,我们使用了钉钉的数据获取API `v1.0/yida/processes/instances` 定时可靠地抓取最新的申请单据,通过轻易云数据集成平台支持自定义的数据转换逻辑,将这些原始数据进行标准化处理。由于不同系统间存在格式差异,通过平台提供的可视化设计工具,直接在界面上配置并映射两者之间的数据结构,使得复杂的数据转换操作直观且易于管理。
为确保大量数据能够快速和无遗漏地写入金蝶云星空,我们利用其批量写入API `batchSave` 实现高吞吐量的数据写入能力;这一性能特性不仅提升了整体处理速度,同时保证了业务连续性。此外,为应对钉钉接口可能出现的分页及限流问题,实现了一套完整的分页抓取与重试机制,以确保所有需要同步的信息都能准确无误地传输至目标系统。
实时监控是另一个至关重要的环节。通过集中监控和告警系统,我们能够实时跟踪每次任务执行状态,一旦发现异常情况,立即发出告警信息并启动错误重试机制。这种做法有效避免因临时故障造成的数据丢失或重复,提高整个流程运行的稳定性和可靠性。同时,对于非预期类型或内容格式不符的数据,可以通过事前自定义规则进行质量检测,并自动筛查掉问题条目,从源头上保障最终进入金蝶云星空数据库中的信息准确度。
本篇文章开端即从技术细节切入,为您剖析如何通过优化配对及流线型操作,在短时间内完成两个大型企业应用之间高效安全、灵活可拓展的数据整合任务。接下来我们会逐步深入分析具体步骤,以便更好理解全流程中涉及到的重要技术实现与最佳实践。
![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/D26.png~tplv-syqr462i7n-qeasy.image)
### 调用钉钉接口获取并加工数据
在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`v1.0/yida/processes/instances`来获取并加工数据。
#### API 接口配置
首先,我们需要了解API接口的基本配置。根据提供的元数据配置,API接口采用POST方法,主要字段如下:
- `api`: `v1.0/yida/processes/instances`
- `method`: `POST`
- `number`: `title`
- `id`: `processInstanceId`
- `idCheck`: true
请求参数包含分页信息、应用ID、用户ID、语言、表单ID等。具体字段如下:
```json
[
{"field":"pageNumber","label":"分页页码","type":"string","describe":"分页页码","value":"{PAGINATION_START_PAGE}"},
{"field":"pageSize","label":"分页大小","type":"string","describe":"分页大小","value":"{PAGINATION_PAGE_SIZE}"},
{"field":"appType","label":"应用ID","type":"string","describe":"应用ID","value":"APP_WTSCMZ1WOOHGIM5N28BQ"},
{"field":"systemToken","label":"应用秘钥","type":"string","describe":"应用秘钥","value":"IS866HB1DXJ8ODN3EXSVD750RBTK2X72R8MELL4"},
{"field":"userId","label":"用户的userid","type":"string","describe":"用户的userid","value":"16000443318138909"},
{"field":"language","label":"语言","type":"string","describe":"语言,取值:zh_CN:中文(默认值)en_US:英文"},
{"field":"formUuid","label":"表单ID","type":"string","describe":"表单ID","value":"FORM-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF"},
{"label": "条件", "field": "searchFieldJson", "type": "object", "children": [
{"parent": "searchFieldJson", "label": "流水号", "field": "serialNumberField_lgek80ou", "type": "string"}
]},
{"field": "originatorId", "label": "根据流程发起人工号查询", "type": "string", "describe": "根据流程发起人工号查询"},
{"field": "createFromTimeGMT", "label": "创建时间起始值", "type": "string", "describe": "创建时间起始值",
"value": "_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')"},
{"field": "createToTimeGMT", "label": "创建时间终止值", "type": "string",
"describe": "创建时间终止值",
"value": "{{CURRENT_TIME|datetime}}"},
{"field": "modifiedFromTimeGMT",
"label":
...
```
#### 数据请求与清洗
在调用API获取数据时,需要特别注意以下几个关键点:
1. **分页处理**:通过`pageNumber`和`pageSize`字段控制每次请求的数据量,确保能够处理大规模数据。
2. **时间过滤**:使用`createFromTimeGMT`和`createToTimeGMT`字段过滤指定时间范围内的数据。这里使用了函数 `_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')` 来动态计算起始时间。
3. **状态过滤**:通过`instanceStatus`和`approvedResult`字段过滤已完成且审批通过的实例。
#### 数据转换与写入
在获取到原始数据后,需要对其进行必要的清洗和转换,以便后续写入目标系统。以下是一些常见的数据清洗操作:
1. **字段映射**:将源系统中的字段映射到目标系统所需的字段。例如,将钉钉中的`processInstanceId`映射为目标系统中的唯一标识符。
2. **格式转换**:将日期、金额等字段转换为目标系统所需的格式。例如,将日期格式从"yyyy-MM-dd HH:mm:ss"转换为"MM/dd/yyyy"。
3. **数据过滤**:根据业务需求过滤掉不必要的数据。例如,只保留审批通过的记录。
#### 实际案例
假设我们需要集成一个新借款单(费用申请单),以下是具体步骤:
1. **配置API请求参数**:
```json
{
...
{"field": "formUuid",
...
}
```
2. **调用API获取数据**:
```python
import requests
url = 'https://oapi.dingtalk.com/v1.0/yida/processes/instances'
headers = {'Content-Type': 'application/json'}
payload = {
...
'formUuid': 'FORM-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF',
...
}
response = requests.post(url, json=payload, headers=headers)
data = response.json()
```
3. **清洗和转换数据**:
```python
cleaned_data = []
for item in data['data']:
cleaned_item = {
'id': item['processInstanceId'],
'title': item['title'],
...
}
cleaned_data.append(cleaned_item)
```
4. **写入目标系统**:
```python
target_url = 'https://target-system/api/write'
for item in cleaned_data:
response = requests.post(target_url, json=item, headers=headers)
if response.status_code != 200:
print(f'Failed to write item {item["id"]}')
```
通过上述步骤,我们实现了从钉钉获取新借款单(费用申请单)并将其写入目标系统的全过程。这一过程不仅提高了数据处理效率,还确保了数据的一致性和准确性。
![如何对接企业微信API接口](https://pic.qeasy.cloud/S14.png~tplv-syqr462i7n-qeasy.image)
### 使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口
在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能够接收的格式。本文将详细探讨如何通过轻易云数据集成平台,将源数据转换为金蝶云星空API接口所需的格式,并最终写入目标平台。
#### 配置元数据与API接口
在轻易云数据集成平台中,我们使用以下元数据配置来实现与金蝶云星空API接口的对接:
```json
{
"api": "batchSave",
"method": "POST",
"idCheck": true,
"operation": {
"method": "batchArraySave",
"rows": 1,
"rowsKey": "array"
},
"request": [
{"field":"FBillNo","label":"单据编号","type":"string","value":"{serialNumberField_lgek80ou}(FYSQ)"},
{"field":"FDate","label":"日期","type":"string","value":"_function FROM_UNIXTIME( ( {dateField_lgfwstn8} \/ 1000 ) ,'%Y-%m-%d' )"},
{"field":"FOrgID","label":"申请组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end"},
{"field":"FStaffID","label":"申请人","type":"string","parser":{"name":"ConvertObjectParser","params":"FSTAFFNUMBER"},"value":"{textField_lhh040dd}"},
{"field":"FDeptID","label":"申请部门","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{tableField_lgek80p9.textField_lgfwstkz}}"},
{"field":"FReason","label":"事由","type":"string","value":"{textareaField_lgfwstli}"},
{"field":"FCurrencyID","label":"币别","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"PRE001"},
{"field":"FSettleTypeID","label":"结算方式","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"JSFS04_SYS"},
{"field":"FPayOrgID","label":"付款组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{textField_lgfwstmo}"},
{"field\":\"FCostOrgID\",\"label\":\"费用承担组织\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstky}}\"},
{"field\":\"FCostDeptID\",\"label\":\"费用承担部门\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstkz}}\"},
{"field\":\"FIsBorrow\",\"label\":\"申请借款\",\"type\":\"string\",\"value\":\"true\"},
{"field\":\"FTOCONTACTUNITTYPE\",\"label\":\"往来单位类型\",\"type\":\"string\",\"value\":\"BD_Empinfo\"},
{"field\":\"FTOCONTACTUNIT\",\"label\":\"往来单位\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{textField_lhh040dd}\"},
{"field\":\"FLocCurrencyID\",\"label\":\"本位币\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"PRE001\"},
{"field\": \" FExchangeRate \", \" label \": \" 汇率 \", \" type \": \" string \", \" value \": \" 1 \"},
{"field\": \" FExchangeTypeID \", \" label \": \" 汇率类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": \" HLTX01_SYS \" },
{"field\": \" FBillTypeID \", \" label \": \" 单据类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": `` FYSQ001_SYS `` },
{`` field``:````FBankName``,`` label``:````银行名称``,`` type``:`` `` string ``, `` value ``: `` { select Field _lg fwstmq } `` },
{ `` field ``: `` FBankAcctName ``, `` label ``: `` 账户名 ``, `` type ``: `` string ``, `` value ``: `` { select Field _lg fwstmp } `` },
{ `` field ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``
{``
{``
{``
{``
{``
{``
{``
{``
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
```
#### 数据转换与写入过程
1. **单据编号(FBillNo)**:使用 `{serialNumberField_lgek80ou}` 字段生成唯一的单据编号,并附加后缀“(FYSQ)”。
2. **日期(FDate)**:通过 `_function FROM_UNIXTIME( ( {dateField_lgfwstn8} / 1000 ) ,'%Y-%m-%d' )` 将 Unix 时间戳转换为标准日期格式。
3. **申请组织(FOrgID)**:根据 `{selectField_lgfwstml}` 的值选择相应的组织编码,使用条件表达式 `_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end`。
4. **申请人(FStaffID)**:直接映射 `{textField_lhh040dd}` 字段值,并通过 ConvertObjectParser 转换为金蝶系统识别的员工编号。
5. **申请部门(FDeptID)**:同样使用 ConvertObjectParser,将 `{tableField_lgek80p9.textField_lgfwstkz}` 转换为金蝶系统中的部门编号。
6. **事由(FReason)**:简单映射 `{textareaField_lgfwstli}` 字段值。
7. **币别、结算方式、付款组织、费用承担组织和部门等字段**:这些字段均通过 ConvertObjectParser 转换为金蝶系统中的相应编码,如 PRE001、JSFS04_SYS 等。
8. **明细字段处理**:对于数组类型的明细字段,如费用项目(FExpenseItemID)、费用承担部门(FEntryCostDeptID)、金额(FOrgAmount)、备注(FRemark),我们使用嵌套结构进行处理,确保每个子字段都能正确映射和转换。
#### 提交与审核
最后,我们通过设置以下参数实现自动提交并审核:
```json
{
"FormId": "ER_ExpenseRequest",
"Operation": "BatchSave",
"IsAutoSubmitAndAudit": true,
"IsVerifyBaseDataField": false
}
```
这些配置确保了数据在写入金蝶云星空后能够自动提交并进行审核,从而简化了流程,提高了效率。
通过上述步骤,我们成功地将源平台的数据转换为金蝶云星空API接口所需的格式,并顺利写入目标平台。这一过程充分展示了轻易云数据集成平台在ETL转换和异构系统集成中的强大能力。
![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/T18.png~tplv-syqr462i7n-qeasy.image)