轻易云平台ETL转换与金蝶云星空数据写入详解

  • 轻易云集成顾问-贺强

聚水潭·奇门数据集成到金蝶云星空的实践案例

在销售业务中,及时且无误地进行数据传递,是确保运营高效的重要一环。本文将介绍如何通过轻易云数据集成平台,将聚水潭·奇门的数据流畅地对接并同步至金蝶云星空。在本次方案中,我们将以[自动]-04销售出库同步(Syali大鸭梨)为例,详细解析其实现过程及关键技术点。

首先,通过调用聚水潭·奇门提供的jushuitan.saleout.list.query接口,我们从系统中抓取最新的一批销售出库单数据。该过程设计了定时任务,以保证每小时按时抓取新订单,同时设置限流和分页处理机制,以应对接口可能存在的频率限制与数据量过大的问题。例如,每次请求不超过50条记录,并控制每分钟请求次数不超过20次,从而避免触发API访问频率限制或网络拥堵。

在获取到需要的数据后,必须考虑两端系统之间的数据格式差异,以及如何高效、准确地进行转换匹配。这部分可以通过编写自定义映射规则来实现,例如,将聚水潭中的字段名称和属性值精准匹配到金蝶云星空所需的格式上,为后续写入操作打下基础。

接下来是重点:快速且大规模地将这些已整理好的订单信息批量写入到金蝶云星空。我们主要使用其batchSave API接口,支持一次性上传多笔记录。不仅如此,还引入了错误重试机制——当出现网络波动或者其他异常导致某些记录未能成功提交时,该机制会自动重新尝试提交直到成功为止,大幅提升系统稳定性和可靠性。

为了实时监测整个流程运行状态以及及时定位潜在问题,我们还部署了一套日志记录与监控体系。当任意一步骤发生错误或者延迟等异常情况时,会立即生成详细日志并发送警报通知相关人员进行查看和处理,这使得问题能够被迅速发现和修复,从而保障了生产环境中的持续平稳运行。

以上便是一个完整且详尽的初步介绍,在随后的内容里,我们将进一步深入探讨具体代码示例及配置细节,包括但不限于不同场景下特定技术难题的解决办法。

系统集成平台API接口配置

调用聚水潭·奇门接口获取并加工数据

在轻易云数据集成平台的生命周期中,调用源系统接口是数据处理的第一步。本文将深入探讨如何通过调用聚水潭·奇门接口jushuitan.saleout.list.query来获取销售出库数据,并对其进行初步加工。

API接口配置

首先,我们需要配置API接口的元数据,以便正确地调用聚水潭·奇门的jushuitan.saleout.list.query接口。以下是该接口的元数据配置:

{
  "api": "jushuitan.saleout.list.query",
  "method": "POST",
  "number": "io_id",
  "id": "io_id",
  "pagination": {
    "pageSize": 25
  },
  "idCheck": true,
  "request": [
    {
      "field": "page_index",
      "label": "页数",
      "type": "string",
      "describe": "第几页,从第一页开始,默认1",
      "value": "1"
    },
    {
      "field": "page_size",
      "label": "每页行数",
      "type": "string",
      "describe": "每页多少条,默认25,最大25",
      "value": "50"
    },
    {
      "field": "start_time",
      "label": "修改开始时间",
      "type": "string",
      "describe": "修改起始时间,和结束时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空",
      "value": "{{LAST_SYNC_TIME|datetime}}"
    },
    {
      "field": "end_time",
      "label": "修改结束时间",
      "type": "string",
      "describe": "修改结束时间,和起始时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空",
      "value": "{{CURRENT_TIME|datetime}}"
    },
    {
      "field": "status",
      ...

请求参数详解

  • page_index: 页数,从第一页开始,默认值为1。
  • page_size: 每页行数,默认值为25,但最大值为50。
  • start_time: 修改开始时间,通过占位符{{LAST_SYNC_TIME|datetime}}动态获取上次同步时间。
  • end_time: 修改结束时间,通过占位符{{CURRENT_TIME|datetime}}动态获取当前时间。
  • status: 单据状态,此处设置为"Confirmed"表示已出库状态。
  • shop_id: 店铺ID,此处设置为"10593320"。

数据请求与清洗

在调用API获取数据后,需要对返回的数据进行清洗和初步加工。这一步骤确保了数据的一致性和完整性,为后续的数据转换与写入打下基础。

  1. 分页处理:由于API返回的数据量可能较大,需要通过分页参数(如page_indexpage_size)逐页请求并处理数据。轻易云平台提供了自动分页功能,可以简化这一过程。

  2. 时间过滤:利用start_timeend_time参数,可以精确控制请求的数据范围。这两个参数必须同时存在,并且时间间隔不能超过七天。

  3. 状态过滤:通过设置单据状态参数(如status="Confirmed"),可以只获取已出库的销售订单数据。

  4. 店铺过滤:通过设置店铺ID(如shop_id="10593320"),可以只获取特定店铺的销售订单数据。

异常处理与补偿机制

在实际操作中,可能会遇到网络波动、接口超时等异常情况。为了确保数据同步的可靠性,需要设计异常处理与补偿机制。例如:

  • 定时任务:通过crontab配置定时任务,每天定时触发数据同步操作。
  • 补偿请求:如果某次请求失败,可以利用补偿机制重新发起请求。例如,当某次同步失败时,可以将起始时间设置为三天前(如元数据中的omissionRemedy配置),重新发起请求以确保数据完整性。
{
  ...
  ...
  ...
  },
  ...
  ...
}

以上内容展示了如何通过轻易云平台调用聚水潭·奇门接口获取销售出库数据,并对其进行初步加工。通过合理配置API元数据、处理分页、过滤条件以及设计异常处理机制,可以高效地实现不同系统间的数据无缝对接。 用友与SCM系统接口开发配置

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

在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并最终写入目标平台。本文将详细探讨如何通过轻易云数据集成平台,将销售出库的数据转换为金蝶云星空API接口所能接收的格式,并成功写入目标平台。

配置元数据

首先,我们需要配置元数据,以确保能够正确地解析和转换源数据。以下是我们使用的元数据配置:

{
    "api": "batchSave",
    "method": "POST",
    "idCheck": true,
    "operation": {
        "rowsKey": "array",
        "rows": 1,
        "method": "batchArraySave"
    },
    "request": [
        {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSCKD01_SYS"},
        {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{io_id}"},
        {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{io_date}"},
        {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function case '{shop_id}' when '10593320' then '100' else '101' end"},
        {"field":"FCustomerID","label":"客户","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{shop_id}"},
        {"field":"FSaleDeptID","label":"销售部门","type":"string","value":"_function case when '{{items.sku_id}}' like 'A%' or '{{items.sku_id}}' like 'M%' or '{{items.sku_id}}' like 'X%' or '{{items.sku_id}}' like 'D%' or '{{items.sku_id}}' like 'T%' then 'LJ006' else 'LJ011' end", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}},
        {"field": "F_TLWD_Text", "label": "平台单号", "type": "string", "value": "{so_id}"},
        {"field": "F_TLWD_Assistant", "label": "店铺", "type": "string", "value": "{shop_id}", "parser":{"name": "ConvertObjectParser",   "params":   "FNumber"}},
        {"label":   "备注",   "field":    "FNote",    "type":     "string"},
        {"field":   "FEntity",  "label":    "明细信息",     "type":     "array", 
            "children":[
                {"field":   "FMaterialID",  "label":    "物料编码",     "type":     "string",       "describe":     "基础资料",         "value": "{{items.sku_id}}"},
                {"field":   "FTaxPrice",    "label":    "含税单价",                                                      value="{{items.sale_price}}"},
                {"parent=": FEntity, label="实发数量", field="FRealQty", type="string", value="{{items.qty}}"}
                {"parent=": FEntity, label="是否赠品", field="FIsFree", type="string", value="_function case '{{items.sale_price}}' when '0.0' then 'true' else 'false' end"}
                {"parent=": FEntity, label="仓库", field="FStockID", type="string", value="{wms_co_id}", parser={"name=ConvertObjectParser", params=“FNumber”}}
                {"parent=": FEntity, label="金额", field="FAmount", type="string", value="{{items.sale_amount}}" }
                {"parent=": FEntity, label=“库存单位”, field=“FUnitID”, type=“字符串”, value=“Pcs”, parser={“名称”: ConvertObjectParser , “参数”: “ FNumber ”}}
                {“字段”: “FOwnerTypeID”, “标签”: “货主ID”, “类型”: “字符串”, value =“ BD_OwnerOrg ”}
                {“字段”: “FOwnerID”, “标签”: “货主ID”, “类型”: “字符串”, value = "_function case '{shop_id}' when '10593320' then '100' else '101' end”, parser={“名称”: ConvertObjectParser , “参数”: “ FNumber ”}}
            ],
            value = items
        },
        {“字段”: SubHeadEntity , 标签: 财务信息 , 类型: 对象 , 子级:[
            {字段: FAllDisCount , 标签: 整单折扣额 , 类型: 字符串 , 值: {free_amount} , 父级: SubHeadEntity }
            ]
        },
        {字段: FStockOrgId , 标签: 库存组织 , 类型: 字符串 , 值:“ _function case '{shop_id}' when '10593320' then '100' else '101' end”, parser={名称: ConvertObjectParser, 参数:“ FNumber”}}
    ],
    otherRequest:[
        {字段:“ FormId”, 标签:“业务对象表单Id”, 类型:“字符串”, 描述:“必须填写金蝶的表单ID如:PUR_PurchaseOrder”, 值:“ SAL_OUTSTOCK”}
        {字段:“ Operation”, 标签:“执行的操作”, 类型:“字符串”, 值:“ Save”}
        {字段:“ IsAutoSubmitAndAudit”, 标签:“提交并审核”, 类型:“布尔型”, 值:“ true”}
        {字段:“ IsVerifyBaseDataField ”, 标签:“验证基础资料 ”, 类型:“布尔型 ”, 描述:“是否验证所有的基础资料有效性,布尔类,默认false(非必录)” 值:true}
         {字段:“ SubSystemId ”, 标签:“系统模块 ”, 类型:“字符串 ”, 描述:“默认仓库模块 ” 值:21}
         {字段:“ InterationFlags ”, 标签:“是否忽略负库存 ”, 类型:“字符串” 值:“ STK_InvCheckResult”}
     ]
}

数据解析与转换

在配置了上述元数据后,我们需要对源数据进行解析和转换。以下是一些关键字段及其处理方式:

  1. FBillTypeID(单据类型):使用ConvertObjectParser解析器,将值转换为金蝶系统识别的格式。
  2. FBillNo(单据编号):直接从源数据中获取并赋值。
  3. FSaleOrgId(销售组织):根据shop_id的值进行条件判断,并使用ConvertObjectParser进行转换。
  4. FCustomerID(客户):同样使用ConvertObjectParser进行解析和转换。
  5. FSaleDeptID(销售部门):通过条件判断,根据SKU ID前缀决定部门编码,并进行解析。

明细信息处理

对于明细信息(FEntity),我们需要逐条处理每一项商品记录:

  • FMaterialID(物料编码):使用ConvertObjectParser解析SKU ID。
  • FTaxPrice(含税单价):直接从源数据中获取并赋值。
  • 实发数量、是否赠品、仓库、金额等:根据具体业务逻辑和源数据逐一赋值和处理。

最终写入

完成所有字段的解析与转换后,通过配置好的API接口,将处理后的数据以POST请求方式批量保存到金蝶云星空系统中。

{
    api: batchSave,
    method: POST,
    idCheck: true,
    operation: {
      rowsKey: array,
      rows: 1,
      method: batchArraySave
    },
    request:[...],
    otherRequest:[...]
}

通过上述步骤,我们实现了从源平台到金蝶云星空系统的数据ETL转换及写入。整个过程不仅保证了数据的一致性和准确性,还大大提高了业务处理效率。 打通企业微信数据接口

更多系统对接方案