轻松实现吉客云与金蝶云星空的数据对接和转换

  • 轻易云集成顾问-孙传友

吉客云数据集成到金蝶云星空案例分享

在企业信息化的管理过程中,如何实现各个系统之间的数据对接与流转是一个重要课题。在本技术案例中,我们将详细探讨如何利用轻易云数据集成平台,实现吉客云中的组装拆卸单无缝集成到金蝶云星空的其他出库单上。

数据获取与处理

首先,通过调用吉客云提供的API erp.storage.goodsdocout.v2接口来获取需要处理的数据。在这一阶段,为确保不漏单,需要实现定时可靠地抓取吉客云接口的数据,并且实时监控数据流程和状态。通过巧妙设置分页和限流机制,有效解决大批量数据读写的问题。

curl -X POST https://api.jike.com/erp/storage/goodsdocout/v2 \
-H 'Content-Type: application/json' \
-d '{"startTime": "2023-10-01T00:00:00", "endTime": "2023-10-31T23:59:59"}'

数据格式转换及映射

由于吉客云和金蝶云星空在数据格式上的差异,对所抓取到的数据进行适当的字段映射和转换至关重要。例如,将从吉客云获取到的数据格式按照金蝶要求规范化:

{
    "sourceSystem": "JikeYun",
    "dataList": [
        {
            "itemCode": "{商品编号}",
            "quantity": "{数量}",
            ...
        }
    ]
}

这里我们使用轻易平台自带的可视化工具,对不同字段进行一一匹配,确保数据信息得以正确传递。这一步骤能保证所有传输过程更加无误、紧密衔接,提高工作效率。

数据写入与异常处理

完成以上步骤后,将整理好的数据调用金蝶API batchSave 进行入库操作。同时引入了错误重试机制,以便在遇见网络故障或其它不可预见问题时自动调度重试任务,从而保证关键业务流程不中断。

curl -X POST https://api.kingdee.com/batchSave \
-H 'Content-Type: application/json' \
-d @transformed_data.json

此外,在整个过程中实施全面日志记录,使得每条操作都具备追溯性,这对于后期运维以及异常情况排查有极大的帮助。最后,通过定制化配置,实现了针对性更强、更精准的数据对接效果。 数据集成平台API接口配置

调用吉客云接口erp.storage.goodsdocout.v2获取并加工数据

在数据集成生命周期的第一步,我们需要调用源系统吉客云的接口erp.storage.goodsdocout.v2来获取数据,并进行初步的加工处理。本文将详细探讨如何配置和使用该接口,以确保数据的准确性和完整性。

接口配置

根据元数据配置,我们需要向吉客云发送一个POST请求,具体参数如下:

  • api: erp.storage.goodsdocout.v2
  • method: POST
  • effect: QUERY
  • number: goodsdocNo
  • id: recId
  • idCheck: true

请求参数包括分页信息、出入库类型、选择字段以及时间范围等。以下是请求参数的详细配置:

{
  "pageIndex": "{PAGINATION_START_PAGE}",
  "pageSize": "{PAGINATION_PAGE_SIZE}",
  "inouttype": "207",
  "selelctFields": "recId,goodsdocNo,billNo,inOutDate,gmtCreate,inouttype,inouttypeName,vendCustomerCode,vendCustomerName,currencyCode,currencyRate,userName,warehouseCode,warehouseName,comment,memo,logisticName,logisticNo,companyId,companyName,logisticType,logisticCode,inOutReason,sourceBillNo,channelId,channelCode,channelName,redStatus,field1,field2,field3,field4,field5,financeBillStatus,applyCompanyId,applyCompanyName,applyCompanyCode,applyDepartId,applyDepartName,departCode,applyUserId,applyUserName,outBillNo,gmtModified,...",
  "gmtModifiedStart": "{{LAST_SYNC_TIME|datetime}}",
  "gmtModifiedEnd": "{{CURRENT_TIME|datetime}}"
}

其他必要的请求参数包括方法名称、应用编号、版本号、返回格式、时间戳、业务参数和签名等:

{
  "method": "erp.storage.goodsdocout.v2",
  "appkey": "",
  "version": "v1.0",
  "contenttype": "json",
  "timestamp": "",
  "bizcontent": "",
  "sign": ""
}

数据请求与清洗

在发送请求后,吉客云会返回一个包含多个字段的数据集。为了确保数据的准确性和一致性,我们需要对返回的数据进行清洗和初步处理。

  1. 字段映射与转换:根据业务需求,将返回的数据字段映射到目标系统所需的字段。例如,将goodsdocNo映射为目标系统中的订单编号。
  2. 数据过滤:根据特定条件过滤不需要的数据。例如,只保留出入库类型为207(组装拆卸出库)的记录。
  3. 格式化处理:对日期、金额等字段进行格式化处理,确保符合目标系统的要求。

示例代码

以下是一个示例代码片段,用于发送请求并处理返回的数据:

import requests
import json
from datetime import datetime

# 配置请求参数
payload = {
    "pageIndex": 1,
    "pageSize": 100,
    "inouttype": "207",
    "selelctFields": "...", # 列表太长省略
    "gmtModifiedStart": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
    "gmtModifiedEnd": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
    # otherRequest parameters
    "method": "erp.storage.goodsdocout.v2",
    "appkey": "<your_app_key>",
    "version": "v1.0",
    "contenttype": "json",
    # timestamp and sign should be generated dynamically
}

# 发起POST请求
response = requests.post("https://api.jikexyun.com/erp/storage/goodsdocout/v2", data=json.dumps(payload))
data = response.json()

# 数据清洗与转换
cleaned_data = []
for record in data['result']:
    cleaned_record = {
        '订单编号': record['goodsdocNo'],
        '客户名称': record['vendCustomerName'],
        '仓库名称': record['warehouseName'],
        '出库日期': record['inOutDate'],
        # 更多字段映射...
    }
    cleaned_data.append(cleaned_record)

# 输出清洗后的数据
print(json.dumps(cleaned_data, indent=4))

通过上述步骤,我们可以成功调用吉客云接口获取所需的数据,并进行初步的清洗和加工,为后续的数据转换与写入做好准备。这一过程不仅提高了数据处理的效率,也确保了数据的一致性和准确性。 数据集成平台可视化配置API接口

使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口

在数据集成的过程中,将源平台的数据转换为目标平台所能接收的格式是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将吉客云的组装拆卸单数据转换为金蝶云星空API接口所能接收的其他出库单格式,并最终写入目标平台。

元数据配置解析

在进行ETL转换之前,我们需要理解和配置元数据。以下是元数据配置的详细解析:

{
  "api": "batchSave",
  "effect": "EXECUTE",
  "method": "POST",
  "idCheck": true,
  "request": [
    {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{goodsdocNo}"},
    {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","value":"QTCKD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"GENERAL"},
    {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{inOutDate}"},
    {"field":"FDeptId","label":"领料部门","type":"string","describe":"基础资料","value":"02","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FNote","label":"备注","type":"string","describe":"多行文本","value":"组装拆卸"},
    {
      "field": "FEntity",
      "label": "明细信息",
      "type": "array",
      "describe": "111",
      "value": "goodsDocDetailList",
      "children": [
        {"field": "FMaterialId", "label": "物料编码", "type": "string", "value": "{{goodsDocDetailList.goodsNo}}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}},
        {"field": "FQty", "label": "数量", "type": "string", "value": "{{goodsDocDetailList.quantity}}"},
        {"field": "FStockId", "label": "仓库", "type": "string", "value": "{{goodsDocDetailList.warehouseCode}}",     "parser":{"name":   "ConvertObjectParser",  "params":   "FNumber"}},
        {"field":   "FEntryNote",   "label":    "备注",   "type": "string",   "value":    "{{goodsDocDetailList.rowRemark}}"},
        {"field":   "FOwnerId", "label":    "货主",   "type": "string",   "value":    "100",  "parser":{"name":
        ConvertObjectParser,    params: FNumber}},
        {"field":
        FLot,   label: FLot,    type: string,   value: _function IF('{{goodsDocDetailList.batchNo}}'<>'DEFAULT','{{goodsDocDetailList.batchNo}}',NULL), parser:{name: ConvertObjectParser,  params: FNumber}}
      ]
    }
  ],
  otherRequest: [
    { field: FormId, label: FormId, type: string, describe: 必须填写金蝶的表单ID如:PUR_PurchaseOrder, value: STK_MisDelivery },
    { field: IsAutoSubmitAndAudit, label: IsAutoSubmitAndAudit, type: bool, value: true },
    { field: IsVerifyBaseDataField, label: IsVerifyBaseDataField, type: bool, describe: 是否验证所有的基础资料有效性,布尔类,默认false(非必录), value: false },
    { field: Operation, label: Operation, type: string, value: Save }
  ],
  operation:{
    rowsKey:"array",
    rows:"1",
    method:"batchArraySave"
  }
}

数据字段解析与转换

  1. 基本字段映射

    • FBillNo:映射到源数据中的goodsdocNo,表示单据编号。
    • FBillTypeID:固定值QTCKD01_SYS,通过ConvertObjectParser进行格式转换。
    • FStockOrgId:固定值100,同样通过ConvertObjectParser进行格式转换。
    • FStockDirect:固定值GENERAL,表示库存方向。
    • FDate:映射到源数据中的inOutDate,表示日期。
    • FDeptId: 固定值 02, 表示领料部门,通过 ConvertObjectParser.
  2. 明细信息字段映射

    • FEntity: 明细信息字段是一个数组,包含多个子字段,每个子字段对应源数据中的一个属性。
      • FMaterialId: 映射到明细列表中的物料编码,通过 ConvertObjectParser.
      • FQty: 映射到明细列表中的数量.
      • FStockId: 映射到明细列表中的仓库编码,通过 ConvertObjectParser.
      • FLot: 批次号,如果批次号不等于 'DEFAULT' 则使用批次号,否则为 NULL.
  3. 其他请求参数

    • FormId: 固定值为 STK_MisDelivery, 表示表单ID.
    • IsAutoSubmitAndAudit: 固定值为 true, 表示自动提交和审核.
    • IsVerifyBaseDataField: 固定值为 false, 表示是否验证所有基础资料有效性.

API接口调用

在完成元数据配置后,我们需要通过API接口将处理后的数据写入金蝶云星空。具体步骤如下:

  1. 构建请求体: 根据元数据配置构建请求体,将源平台的数据按照目标平台所需格式进行转换。

  2. 发送HTTP请求: 使用POST方法将构建好的请求体发送至金蝶云星空的API接口。确保设置正确的头部信息,如Content-Type等。

  3. 处理响应: 接收并处理API响应,根据响应结果判断操作是否成功,并记录日志以便后续追踪和排错。

以下是一个简化的HTTP请求示例:

import requests
import json

url = 'https://api.kingdee.com/batchSave'
headers = {
    'Content-Type': 'application/json',
}

data = {
    # 根据元数据配置构建的数据结构
}

response = requests.post(url, headers=headers, data=json.dumps(data))

if response.status_code == 200:
    print("Data successfully written to Kingdee Cloud")
else:
    print(f"Failed to write data. Status code: {response.status_code}, Response content: {response.content}")

通过以上步骤,我们可以实现从吉客云到金蝶云星空的数据无缝对接,并确保每个环节都透明可控。 用友与外部系统接口集成开发

更多系统对接方案