# 事件流

事件流功能从版本13开始引入,它允许两个或多个站点之间的站点间通信。您可以订阅文档类型并在不同站点之间流式传输文档。

例如:假设您在不同站点上托管了多个公司,其中一个是主要站点,您希望在该站点进行账簿过账,而在其他站点生成销售发票。在这种情况下,您可以使用事件流。为此,您的子公司站点可以订阅主要公司站点的物料、客户和供应商文档类型。主要公司反过来可以订阅子公司的销售发票。

要访问事件流,请转到:

首页 > 自动化 > 事件流

# 1. 先决条件

在创建事件生产者之前,需要在两个站点上创建一个共同的用户,该用户将用于访问站点,并将充当事件订阅者。确保该用户是系统管理员,并具有创建、更新和删除订阅的DocTypes的必要权限。

# 2. 如何设置事件流

让我们以两个站点为例来解释这个过程。http://test_site:8000(消费者站点)和http://test_site_producer:8000(生产者站点)

# 2.1 从生产者站点获取事件订阅者的密钥

  1. 在http://test_site_producer:8000(生产者站点),转到用户列表。
  2. 打开您打算用作事件订阅者的用户文档。滚动到标记为"API访问"的部分。在该部分中,通过点击生成密钥按钮为用户生成密钥。您将收到一个带有用户密钥的提示,复制用户密钥并保存。它还将生成一个API密钥。

# 2.2 在消费者站点为事件订阅者生成密钥

  1. 在http://test_site:8000(消费者站点),转到用户列表,并按照上一步骤中指定的相同过程操作。

# 2.3 在消费者站点创建事件生产者

  1. 您希望订阅的站点称为事件生产者。为您希望从中获取更新的站点创建一个事件生产者文档。
  2. 在http://test_site:8000(消费者站点),转到首页 > 自动化 > 事件流 > 事件生产者
  3. 在生产者URL字段中,输入您希望订阅的站点的URL(在这种情况下为http://test_site_producer:8000)。
  4. 在事件生产者文档类型表中,添加您希望订阅的所有文档类型。
  5. 如果您希望创建的文档与远程事件生产者站点上的名称相同,请在表中选中所需文档类型对应的“使用相同名称”复选框。
  6. 将事件订阅者字段设置为将用于从事件生产者获取文档的用户。在创建事件生产者之前,您需要在事件消费者和事件生产者站点上创建相同的用户。
  7. 分别在API密钥和API密钥字段中粘贴您在第一步(2.1)中生成的API密钥和API密钥。
  8. 保存。
  9. 保存后,将在生产者站点(http://test_site_producer:8000)上创建一个事件消费者。在此过程中,消费者站点上的用户的密钥将自动复制到生产者站点上的事件消费者文档中。

img

注意:如果这些站点上的任何用户更改了API密钥,您将需要手动更新事件生产者以及两个站点上的事件消费者中的密钥。

# 2.4 在事件生产者站点上批准事件消费者

  1. 创建事件生产者后,将在生产者站点上自动创建一个事件消费者。默认情况下,所有订阅的文档类型的状态为“待定”。为了使事件消费者能够消费这些文档类型的文档,需要将其状态更新为“已批准”。
  2. 转到:首页 > 自动化 > 事件流 > 事件消费者
  3. 打开事件消费者文档后,您将看到消费者订阅的所有文档类型。对于您希望批准消费的所有文档类型,将状态从“待定”更改为“已批准”。如果您不希望消费该文档类型的文档,则可以将状态更改为“已拒绝”。
  4. 保存。

img

注意:除非已批准,否则订阅的文档类型的文档更新不会被同步。

# 2.5 单站点的离线访问

如果您有一些地方的互联网连接较差,例如,一个偏远地区的商店,在那里生成销售发票,而您希望将这些发票从商店同步到托管账户,您可以使用以下步骤设置离线同步:

  1. 设置一个ERPNext本地实例。您可以参照此指南进行本地设置。
  2. 您需要有一个已设置的托管账户。
  3. 现在,在托管账户上创建一个事件生产者,并将生产者URL设置为您本地账户的URL。
  4. 在事件生产者文档类型的子表中添加您想要同步的任何文档类型。
  5. 批准文档类型。

# 3. 功能

# 3.1 取消订阅更新

作为事件消费者,如果您希望取消订阅您之前订阅的任何文档类型的更新,请在文档类型旁边勾选取消订阅。一旦您取消订阅,您将不再从生产者站点接收该特定文档类型的任何更新。

img

# 3.2 事件更新日志

“事件更新日志”记录了在事件生产者站点上有消费者文档的每一次创建、更新和删除操作。 要查看事件更新日志,请转到:首页 > 自动化 > 事件流 > 事件更新日志

  • 对于“创建”类型的更新,记录了更新类型、文档类型、文档名称和整个文档(作为JSON)。
  • 对于“更新”类型的更新,记录了更新类型、文档类型、文档名称和更新的数据(文档的先前状态和当前状态之间的差异)。
  • 对于“删除”类型的更新,仅记录了更新类型、文档类型和文档名称。

img

# 3.3 事件同步日志

像更新日志一样,事件同步日志记录了从事件生产者到事件消费者站点同步的每个文档。 要查看事件同步日志,请转到:首页 > 自动化 > 事件流 > 事件同步日志

img

一个成功同步的事件会生成一个日志文档,包含:

  • 更新类型:创建、更新或删除
  • 状态:同步状态
  • DocType
  • 事件生产者:创建文档的站点URL
  • 文档名称
  • 远程文档名称:如果“使用相同名称”未选中
  • 使用相同名称
  • 数据:文档数据作为JSON

img

一个失败的事件会生成一个日志文档,包含上述字段以及:

  • 错误:未同步文档的错误。

  • 重新同步按钮:它还提供了一个“重新同步”按钮,以便重新同步失败的事件。

# 3.4 依赖同步

某些文档类型具有依赖性。例如,在同步销售发票之前,物料和客户需要出现在当前站点上。因此,物料和客户是销售发票的依赖项。事件流通过按需依赖同步来处理这个问题。每当需要同步任何文档时,它首先检查该文档是否有任何依赖项(链接字段、动态链接字段、子表字段等)。如果未满足该依赖项,即依赖文档(例如:物料)不在您的消费者站点上,它将首先被同步,然后销售发票将被同步。

例如:带有物料依赖项的销售发票同步:

# 3.5 命名配置

选中“使用相同名称”复选框,以使文档在事件生产者和事件消费者站点上具有相同的名称。如果未选中此选项,则将使用当前站点的命名约定创建文档。

注意:对于具有命名系列的文档类型,建议保持“使用相同名称”复选框未选中,以防止命名冲突。如果未选中此选项,文档将按照当前站点的命名约定创建,并且“远程站点名称”和“远程文档名称”自定义字段将设置在同步的文档中,以存储事件生产者站点的URL和远程站点上的文档名称。

# 3.6 映射配置

如果您希望在具有相同或不同结构的ERPNext实例和另一个Frappe应用程序之间流式传输文档,或者如果两个站点的字段名称不同,您可以使用事件流与映射配置。

为此,您需要首先设置文档类型映射。

要访问文档类型映射,请转到:

首页 > 自动化 > 事件流 > 文档类型映射。

# 3.6.1 具有相似结构的DocTypes的映射

  • 映射名称:给映射一个唯一的名称
  • 本地文档类型:您当前站点的文档类型
  • 远程文档类型:您希望同步的事件生产者站点上的文档类型

在字段映射子表中:

  • 本地字段名称:您当前站点的本地文档类型的字段名称。
  • 远程字段名称:您希望映射到本地字段名称的事件生产者站点上的远程文档类型的字段名称。在同步期间,远程字段名称的值将被复制到本地字段名称。

# 3.6.2 某些字段的默认值

如果您的字段未映射到任何其他远程字段名称,并且您总是希望该字段具有相同的值,请在默认值字段中设置相同的值。即使您已经设置了远程字段名称,在同步过程中,如果找不到远程字段的值,并且如果已指定“默认值”,它将被设置。

# 3.6.3 具有子表的DocTypes的映射

如果您尝试映射的字段是一个子表,您需要为子表字段创建另一个文档类型映射。

  • 映射类型:选择子表作为映射类型。
  • 映射:选择您为子表创建的文档类型映射文档。

# 3.6.4 具有依赖项的DocTypes的映射(链接、动态链接字段)

如果您尝试映射的DocTypes具有任何类型的依赖项,如链接或动态链接字段,您需要设置另一个文档类型映射以同步依赖项。

例如,假设本地文档类型是机会,远程文档类型是ERPNext机会。机会中的字段 party_name(DocType Leads的链接字段)映射到ERPNext机会中的 full_name(数据字段)。在同步过程中,必须为此主要机会创建此Lead,以便进行同步。因此,您还需要为此链接字段设置映射。

  • 映射类型:在这种情况下,映射类型是文档。
  • 映射:选择您刚刚创建的映射。
  • 远程值过滤器:您需要指定将获取要映射的确切远程文档的过滤器。例如,在这种情况下,远程DocType是ERPNext机会,可以使用名称、电话号码和国家/地区唯一获取。

格式是:

{ "远程字段名称": "我们将从哪里获取该字段名称的值的字段或表达式"}

如果您想从某处获取值,请以eval开始表达式:

例如,在这种情况下是:eval:frappe.db.get_value('Global Defaults', None, 'country')

最后,在事件生产者中的事件配置子表中,针对所需的文档类型启用“具有映射”选项,并选择您刚刚创建的文档类型映射。

# 3.6 条件事件配置

如果您处于不希望将某个文档类型中的所有文档发送到消费者的场景中,您可以为它们指定条件。

例如,如果您只想发出那些公共的Note文档,您可以在生产者/消费者文档中指定它们。

如果文档在其生命周期中的某个时刻满足条件,所有旧的事件更新日志将同步到消费者

让我们考虑另一个例子。您只想同步那些已提交的销售发票。 您可以指定doc.docstatus == 1作为条件。在它们被提交之前,发票不会被同步。

对于每个更新日志,您可以在更新日志文档中看到其消费者。

如果您需要对条件进行更精细的控制,您可以连接一个自定义函数。您的函数将使用参数consumerdocupdate_log执行。例如,您只想同步那些odd的笔记

def is_odd_note(consumer, doc, update_log):
 return frappe.db.sql("""
 SELECT
 COUNT(*)
 FROM `tabNote`
 WHERE creation <= %(creation)s
 """, { "creation": doc.creation })[0][0] % 2 != 0

1
2
3
4
5
6
7
8

然后,您可以指定条件:

cmd: my_custom_app.note.is_odd_note

1
2
最后更新时间: 10/6/2024, 1:46:24 PM