全部文档
文档中心数据流3.0场景案例0101-同步开票数据&生成凭证

0101-同步开票数据&生成凭证

背景:每日定时从业务系统同步开票数据,并在同步后自动生成会计凭证

核心组件:数据流3.0、连接器、数据表、会计引擎

DEMO 地址:https://alpha.deepfos.com/element-deep-pipeline/3-0-0/?elementName=demo0101&folderId=DIR6cf397c97ec3&moduleId=DPL3_0&sign=YXBwSWQ9Y3pqbml3MDE5JnNwYWNlPWN6am5pdw%3D%3D

模拟业务系统中的开票数据文件:ap_invoice.csv

使用连接器模拟旧系统数据库,环境与权限说明参见DEMO概述。

查看模拟数据:
1735794197251-0147c45f-71f6-473a-881c-bfb48ed27680

在本系统中,创建数据表元素,用于承接数据,以 MySQL 数据表为例。
1735886388948-9f87d048-df85-4ea6-b3e5-d378b15b4fc5

配置会计引擎,用于根据 AP_INVOICE 数据表的数据,生成会计凭证。

会计引擎相关配置请参见会计引擎组件文档,本案例仅说明与数据流编排直接相关的步骤。

  1. 新建业务模型(业务模型 V1.1 组件),作为会计引擎处理来源
    1735886369273-7873bf50-43e1-4271-96f7-6d323e7b9172

  2. 新建凭证模型(业务模型 V1.1 组件),作为会计引擎输出对象
    1735886700950-64fabdeb-4879-4420-bb35-31215970868a

  3. 新建会计事件类型
    1735886764410-5823f75d-b821-450f-a38f-8c9c91d4f8bd

    1735888496141-0584a922-13ec-4028-8786-645f8e5986a1

  4. 新建会计引擎(从单据到凭证)
    1736304462220-367f5e68-404e-497b-b311-08a4b3243be1

  5. 新建清单表 V1.2 和业务明细表 V1.1,用于展示生成的凭证
    1736405741709-61b0bd6c-f006-4852-97f7-7755bb952566

    1736405716767-0dc38498-f527-413c-b3ea-66658ca21473

  1. 由于调试需要,可以在开始节点配置启动参数,传入固定日期,正式版本需要每天定时运行,就需要清空启动参数,在后续指定日期时用 Python 表达式取即时的系统日期

  2. 配置启动触发,开启定时,定时规则是每天凌晨1点钟。以实现每天凌晨 1 点同步前一天的发票数据并生成凭证。
    1736407397219-361f1441-cb69-4930-ae88-4cd450764206

    1736407461802-4b00f61c-32bc-484e-a008-c40812a78104

连接器查询节点用于获取旧系统中前一天的发票数据。
1736407517394-49dff81f-e2f0-4615-b340-c8c6844e9dc7

修改节点名称:
1736407540219-422d8990-153e-47ed-9e5e-ae2dbcc68fda

节点配置可采用两种模式:

  • UI模式:过滤条件的值(发票日期=前一天)可以用 Python 代码
    1737877154156-b4d776bd-3ce4-4ff9-97b8-7ddb53628465

  • SQL 模式:在查询SQL框中输入需要查询的 SQL 语句即可
    1737880161656-3c044d2d-387e-4a41-b082-d64cdcdfb264

配置完成后,可以点击右上角的带前序节点一同调试,查看本节点的运行结果。
1736407856207-0485bf2e-b929-4b1c-8c8e-29e0fd06f6ee

进阶:使用参数和变量

如果节点之间有执行的前后顺序,后续节点可以通过 Operator.nodeX.data 引用前序节点的运行结果,更多引用方式参见预置变量。

举个例子,本场景中,仅需查询当前日期前一天的数据,当前日期为启动参数,也是开始节点的输出结果,因此在查询 SQL 中需要引用Operator.start.data。
1736408227453-e87b60fc-38ff-4b8c-9139-7bf0295d70f8

用于在新系统中新增前一天的发票数据。

若您使用的系统还未发布数据表操作节点,可以使用PY代码节点替代这部分逻辑。

若您使用的系统还未发布数据表操作节点,可以使用PY代码节点用于在新系统中新增前一天的发票数据,相关 SDK 文档:操作数据库 — DeepFOS
1736408384739-02bdf4d8-21e3-4de0-b04a-2d5b502e3cae

本节点引用了前序连接器查询节点的输出结果,因此使用了变量Operator.nodeX.data。

示例代码:

Copy
from deepfos.element.datatable import DataTableMySQL
import pandas as pd

ap_invoice = DataTableMySQL(element_name="AP_INVOICE",path='/0101/')
t = ap_invoice.table
insert_data = pd.DataFrame(Operator.ds_conn_query1.data.order("invoice_id").df().to_dict(orient='list'))
# invoice_id字段需要int转varchar
insert_data['invoice_id'] = insert_data['invoice_id'].astype(str)

# 插数
ap_invoice.insert_df(insert_data)
ap_invoice.select()

再添加PY代码节点用于在新系统中,根据同步过来的发票数据,调用会计引擎,生成凭证,相关 SDK 文档:会计/单据引擎 — DeepFOS

示例代码:

Copy
# 实例化
invoice = DataTableMySQL(element_name="AP_INVOICE", path="/0101/")
invoice_table = invoice.table
eventType = AccountingEventType('AP_INVOICE')
engines = AccountingEngines('AP_INVOICE')

# 指定开票日期=当前日期的前一天
cur_date = Operator.start.data['date'] if Operator.start.data is not None else datetime.datetime.now().date()
invoice_date = (datetime.strptime(cur_date, "%Y-%m-%d") - timedelta(days=1))
invoice_datetime_string = invoice_date.strftime("%Y-%m-%d %H:%M:%S")

# 查询指定开票日期的journal_id
columns = ["invoice_id"]
where = (invoice_table.invoice_date == invoice_date)
data = invoice.select(columns, where=where)
# 插入会计事件表
eventType.insert_to_event_table(list(data['invoice_id']))
# 执行会计引擎
engines.execute(filter_scope={"date": invoice_datetime_string})

同步发票数据以 PY 代码插数的形式为例:

此处为语雀卡片,点击链接查看

回到顶部

咨询热线

400-821-9199