新版订单-出库单(佰嘉)杭州佰健嘉庆:汤臣倍健营销云数据集成到金蝶云星辰V2
在企业的日常运营中,系统之间的数据对接与集成是一个至关重要的环节。本文将着重介绍汤臣倍健营销云与金蝶云星辰V2之间的系统对接实践——新版订单-出库单(佰嘉)杭州佰健嘉庆案例。
我们首先需要通过API从汤臣倍健营销云获取相关订单数据。使用/api/openapi/v1/erp/order/honour/agreement/header
接口,将最新生成的订单信息实时抓取下来,并处理分页和限流等问题,以确保数据不遗漏且高效抓取。在此过程中,我们实现了异常检测和错误重试机制,保障了数据提取过程的稳定性。
为了适应业务需求,我们自定义了一套复杂的数据转换逻辑,将从汤臣倍健营销云获取到的数据格式转化为金蝶云星辰V2所能接受的格式。紧接着,通过调用金蝶云星辰V2提供的写入API /jdy/v2/scm/sal_out_bound
,将经过转换后的大批量数据快速写入系统。这一过程中,高吞吐量的数据写入能力显著提升了整体效率。
此外,为确保整个数据处理链条透明且可控,我们利用集中的监控和告警系统,实时跟踪各个任务节点,从而能够及时发现并解决潜在的问题。同时,通过可视化的数据流设计工具,对整个流程进行了直观管理,使得配置变更及故障排除更加便捷、高效。
以上技术点仅是这次项目的一部分内容,在后续文章中我们将进一步探讨具体实现细节,包括如何调用不同接口、应对各种异常情况以及优化策略应用等方面。
调用汤臣倍健营销云接口获取并加工数据的技术实践
在数据集成生命周期的第一步,我们需要调用源系统汤臣倍健营销云的接口/api/openapi/v1/erp/order/honour/agreement/header
来获取订单数据,并进行初步的数据清洗和加工。以下是具体的技术实现和相关配置细节。
接口调用配置
首先,我们需要配置API调用的元数据。根据提供的元数据配置,以下是我们需要关注的字段和参数:
- API路径:
/api/openapi/v1/erp/order/honour/agreement/header
- 请求方法:POST
- 请求参数:
orgId
(组织ID):固定值e19363e8f33746b2a50c5577906a83bc
page
(页码):默认值为1
id
(订单ID)applyerId
(要货方ID)supplierId
(供货方ID)no
(订单号)distributionType
(分销类型)distributorId
(分销商ID)orderStatus
(订单状态):多个状态值,用逗号分隔createDt
(创建时间)orderTypeCode
(订单类型,如普通订单、直运销售)isDeliveryFreezed
(是否暂停发货)nature
(单据类型):固定值为1
relatedApplyerId
(关联交易经销商ID)saleDistribution
(销售渠道)disApplyerId
(分销商ID)startDt
(订单时间开始)endDt
(订单时间结束)appStartDt
(审批时间开始)appEndDt
(审批时间结束)lastStartDt
(最后修改时间开始):动态值,使用模板变量${LAST_SYNC_TIME|datetime}
lastEndDt
(最后修改时间结束):动态值,使用模板变量${CURRENT_TIME|datetime}
请求参数构建
在实际调用中,我们需要构建一个包含上述字段的JSON对象作为请求体。以下是一个示例请求体:
{
"orgId": "e19363e8f33746b2a50c5577906a83bc",
"page": "1",
"orderStatus": "WAIT_FINANCE_AUDIT,WAIT_DELIVERY,PART_DELIVERY,ALL_DELIVERY,WAIT_OUT_STORAGE,PART_OUT_STORAGE,ALL_OUT_STORAGE,PART_CONFIRM,CONFIRM,AUDIT_SUCCESS,FINISH,CLOSE",
"nature": "1",
"lastStartDt": "{{LAST_SYNC_TIME|datetime}}",
"lastEndDt": "{{CURRENT_TIME|datetime}}"
}
数据清洗与加工
在获取到原始数据后,需要对数据进行清洗和初步加工。这一步骤通常包括但不限于以下操作:
- 字段过滤:只保留必要的字段,去除冗余信息。
- 格式转换:将日期字符串转换为标准日期格式,将数值字符串转换为数值类型等。
- 数据校验:检查关键字段是否为空或格式是否正确,确保数据完整性。
例如,对于返回的数据结构,可以进行如下处理:
import json
from datetime import datetime
def clean_data(raw_data):
cleaned_data = []
for record in raw_data:
cleaned_record = {
"order_id": record.get("id"),
"order_no": record.get("no"),
"status": record.get("orderStatus"),
"created_at": datetime.strptime(record.get("createDt"), "%Y-%m-%d %H:%M:%S") if record.get("createDt") else None,
# 添加其他必要字段处理
}
# 校验关键字段
if not cleaned_record["order_id"] or not cleaned_record["order_no"]:
continue
cleaned_data.append(cleaned_record)
return cleaned_data
# 示例调用
raw_response = '[{"id":"12345","no":"ORD001","orderStatus":"WAIT_DELIVERY","createDt":"2023-10-01 12:00:00"}]'
raw_data = json.loads(raw_response)
cleaned_data = clean_data(raw_data)
print(cleaned_data)
实时监控与日志记录
为了确保数据集成过程中的透明度和可追溯性,我们需要对每次API调用及其结果进行实时监控和日志记录。这可以通过轻易云平台提供的监控工具来实现,也可以自定义日志记录机制。例如:
import logging
logging.basicConfig(level=logging.INFO)
def log_api_call(request_body, response_body):
logging.info(f"API Request: {request_body}")
logging.info(f"API Response: {response_body}")
# 示例日志记录
request_body = {
"orgId": "e19363e8f33746b2a50c5577906a83bc",
"page": "1",
# ...其他参数
}
response_body = '[{"id":"12345","no":"ORD001","orderStatus":"WAIT_DELIVERY","createDt":"2023-10-01 12:00:00"}]'
log_api_call(request_body, response_body)
通过以上步骤,我们可以高效地从汤臣倍健营销云接口获取并加工订单数据,为后续的数据转换与写入奠定基础。
轻易云数据集成平台生命周期第二步:ETL转换及写入金蝶云星辰V2 API接口
在数据集成过程中,ETL(Extract, Transform, Load)转换是至关重要的一环。本文将详细探讨如何将已经集成的源平台数据,通过轻易云数据集成平台,转换为金蝶云星辰V2 API接口所能接收的格式,并最终写入目标平台。
数据请求与清洗
在开始ETL转换之前,我们需要确保数据已经从源系统成功提取并经过初步清洗。这一步通常包括对数据进行去重、补全和标准化处理。假设我们已经完成了这些步骤,现在可以直接进入数据转换和写入阶段。
数据转换与写入
根据提供的元数据配置,我们需要将源平台的数据映射到金蝶云星辰V2 API接口所需的字段格式。以下是一个具体的技术案例:
元数据配置解析
{
"api": "/jdy/v2/scm/sal_out_bound",
"effect": "EXECUTE",
"method": "POST",
"number": "id",
"id": "id",
"name": "id",
"idCheck": true,
"request": [
{"field":"bill_source","label":"单据来源,固定传入ISV","type":"string","describe":"单据来源,固定传入APP","value":"ISV"},
{"field":"bill_date","label":"出库日期,格式:2019-01-01","type":"datetime","describe":"出库日期,格式:2019-01-01","value":"{{approveDt|date}}"},
{"field":"bill_no","label":"单据编码","type":"string","value":"{no}"},
{"field":"customer_id","label":"客户id","type":"string","describe":"客户信息","value":"_findCollection find id from b41660e7-fa00-318f-bbee-1395e229ee6b where number={clientAppNo}"},
{"field":"remark","label":"单据备注","type":"string","value":"{remark}"},
{"field":"contact_linkman","label":"联系信息-联系人","type":"string","value":"{contacts}"},
{"field":"contact_phone","label":"联系信息-联系方式","type":"string","value":"{phone}"},
{"field":"contact_address","label":"联系信息-详细地址","type":"string","value":"{shippingAddress}"},
{"field":"dept_id","label":"部门","type":"string","value":"1320359653724412928"},
{"field": "custom_field", "label": "自定义字段", "type": "object",
"children": [
{"field": "custom_field__1__2xietiob41d0jia2",
"label": "营销云备注",
"type": "string",
"value": "{no}"}
]
},
{
"field": "material_entity",
"label": "商品分录",
"type": "array",
"describe": "商品分录",
...
关键字段映射
- bill_source: 固定传入值"ISV",表示单据来源。
- bill_date: 出库日期,使用模板变量
{{approveDt|date}}
来动态填充。 - bill_no: 单据编码,对应源数据中的
{no}
。 - customer_id: 客户ID,通过
_findCollection
函数从客户表中查找对应ID。 - remark: 单据备注,对应源数据中的
{remark}
。 - contact_linkman: 联系人信息,对应源数据中的
{contacts}
。 - contact_phone: 联系方式,对应源数据中的
{phone}
。 - contact_address: 详细地址,对应源数据中的
{shippingAddress}
。 - dept_id: 部门ID,固定值"1320359653724412928"。
自定义字段和商品分录
自定义字段和商品分录部分较为复杂,需要特别注意:
- custom_field: 包含一个子字段
custom_field__1__2xietiob41d0jia2
,其值为单据编号{no}
。 - material_entity: 商品分录是一个数组,每个元素包含多个字段,如下:
material_number
: 商品编号,对应源数据中的{productNo}
。stock_id
: 仓库ID,固定值"1320319591469069312"。qty
: 数量,对应源数据中的{{details.quantity}}
。unit_id
: 单位ID,通过_findCollection
函数从单位表中查找对应ID。tax_price
: 含税单价,对应源数据中的{{details.basePrice}}
。
数据写入操作
完成上述映射后,我们使用POST方法将转换后的JSON对象发送到金蝶云星辰V2 API接口:
import requests
import json
url = 'https://api.kingdee.com/jdy/v2/scm/sal_out_bound'
headers = {'Content-Type': 'application/json'}
data = {
# 按照元数据配置生成的JSON对象
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print("Data successfully written to Kingdee Cloud.")
else:
print("Failed to write data:", response.text)
通过上述步骤,我们实现了从轻易云平台提取、转换并写入金蝶云星辰V2 API接口的全过程。这不仅确保了不同系统间的数据无缝对接,也极大提升了业务流程的自动化程度。