本文档定义织信 Informat 应用监听器（App Listener）的完整配置说明与事件列表。

# Informat 监听器文档

## 1. 概述

监听器是织信 AI 低代码平台中的一种强大工具，通过监听系统的特定事件来触发和执行预先设置的自动化程序。监听器通过捕捉系统中的特定事件（如数据变更、用户操作等），并根据预定义的规则和条件，自动执行相应的自动化程序。自动化程序可以包括数据处理、通知发送、外部系统集成等操作。

在**自动化**程序或者**脚本**中可以通过"发布应用事件"步骤发布一个自定义的**应用事件**。应用事件的类型需要预先在监听器配置中设置。

> **重要提示**：非客户端运行的监听器必须是不包含交互式步骤的自动化程序。

自动化或脚本会接受一个参数，类型为 `AppEvent`，结构如下：

```ts
interface AppEvent {
    id: string;      //事件ID
    content: object;  //事件内容
}
```

## 2. 事务

所有的事件监听器（发送通知、客户端触发的除外）的执行都会和触发点在同一事务中执行。例如监听"数据表记录创建前"事件的自动化程序里执行时抛出异常，那么包括插入记录在内的所有事务都会回滚。

例如在提交数据时需要做一些规则校验，如果规则不满足则不允许用户提交数据。在"数据表记录创建后"的事件监听器中设置好规则检查自动化程序。如果不满足规则，自动化程序执行"终止执行"，系统在接受到"终止执行"命令后就会自动将所有事务回滚，提交数据的工作也就失败了。

## 3. 事件列表

### 3.1 数据表记录创建前、后事件

在用户通过表单创建记录后触发。

> **TIP**：通过自动化、脚本创建数据表记录不会触发事件。

**在创建记录时**事件触发的顺序为：
1. 触发主表的"数据表记录创建前"事件
2. 对每一条子表的记录触发"数据表记录创建前"、"数据表记录创建后"事件
3. 触发主表的"数据表记录创建后"事件

**创建前事件内容**：
```json
{
    "content":{
        "record":{
            "name":"名称","age":0
        },
        "source":"form",
        "tableId":"listenerData"
    },
    "id":"record.create.before"
}
```

**创建后事件内容**：
```json
{
   "content": {
      "afterRecord": {
         "age": 0,
         "id": "d6dhvhodo62nl",
         "name": "名称",
         "seq": 2
      },
      "record": {
         "age": 0,
         "name": "名称"
      },
      "source": "form",
      "tableId": "listenerData"
   },
   "id": "record.create.after"
}
```

### 3.2 数据表记录更新前、后事件

在用户通过表单更新记录后触发。

> **TIP**：通过自动化、脚本更新数据表记录不会触发事件。

**在更新记录时** 子表可能包含了"创建"、"更新"、"删除"三种动作，事件触发的顺序为：
1. 触发主表的"数据表记录更新前"事件
2. 对于子表中新增的数据依次触发"数据表记录创建前"、"数据表记录创建后"事件
3. 对于子表中更新的数据依次触发"数据表记录更新前"、"数据表记录更新后"事件
4. 对于子表中删除的数据依次触发"数据表记录删除前"、"数据表记录删除后"事件
5. 触发主表的"数据表记录更新后"事件

**更新前事件内容**：
```json
{
   "content": {
      "beforeRecord": {
         "age": 100,
         "id": "xg2d0hi83cwym",
         "name": "张三",
         "seq": 1
      },
      "record": {
         "id": "xg2d0hi83cwym",
         "name": "张三1"
      },
      "source": "form",
      "tableId": "listenerData",
      "updateFieldList": [
         "name"
      ]
   },
   "id": "record.update.before"
}
```

**更新后事件内容**：
```json
{
   "content": {
      "afterRecord": {
         "age": 100,
         "id": "xg2d0hi83cwym",
         "name": "张三1",
         "seq": 1
      },
      "beforeRecord": {
         "age": 100,
         "id": "xg2d0hi83cwym",
         "name": "张三",
         "seq": 1
      },
      "record": {
         "id": "xg2d0hi83cwym",
         "name": "张三1"
      },
      "source": "form",
      "tableId": "listenerData",
      "updateFieldList": [
         "name"
      ],
      "updateRowCount": 1
   },
   "id": "record.update.after"
}
```

### 3.3 数据表记录删除前、后事件

在用户通过表单删除记录后触发。

> **TIP**：通过自动化、脚本删除数据表记录不会触发事件。

**在删除记录时**事件触发的顺序为：
1. 触发主表的"数据表记录删除前"事件
2. 触发主表的"数据表记录删除后"事件

> **TIP**：对于"关联列表"类型的字段，删除行为只会删除关联关系，并不会实际删除数据，所以不会触发子表的相关事件。

**删除前事件内容**：
```json
{
   "content": {
      "record": {
         "age": 0,
         "id": "d6dhvhodo62nl",
         "name": "点点滴滴",
         "seq": 2
      },
      "source": "form",
      "tableId": "listenerData"
   },
   "id": "record.delete.before"
}
```

**删除后事件内容**：
```json
{
   "content": {
      "record": {
         "age": 0,
         "id": "d6dhvhodo62nl",
         "name": "点点滴滴",
         "seq": 2
      },
      "source": "form",
      "tableId": "listenerData"
   },
   "id": "record.delete.after"
}
```

### 3.4 数据表记录更新排序

在表格视图中用户通过拖拽修改记录顺序后触发。

**更新排序之前**：
```json
{
   "content": {
      "beforeRowNumber": 4,
      "recordId": "gf13shmq3njqf",
      "source": "form",
      "tableId": "listenerData"
   },
   "id": "record.rownumber.update.before"
}
```

**更新排序之后**：
```json
{
   "content": {
      "afterRowNumber": 3,
      "beforeRowNumber": 4,
      "recordId": "gf13shmq3njqf",
      "source": "form",
      "tableId": "listenerData"
   },
   "id": "record.rownumber.update.after"
}
```

### 3.5 数据表记录评论创建后

在用户通过表单发表评论后触发。

```json
{
   "content": {
      "comment": {
         "content": "评论内容（富文本JSON）",
         "id": 0,
         "parentId": 0,
         "recordId": "xg2d0hi83cwym",
         "tableId": "listenerData"
      }
   },
   "id": "record.comment.create.after"
}
```

### 3.6 数据表记录评论删除后

在用户通过表单删除评论后触发。

```json
{
   "content": {
      "comment": {
         "content": "被删除的评论内容（富文本JSON）",
         "id": 0,
         "parentId": 0,
         "recordId": "xg2d0hi83cwym",
         "tableId": "listenerData"
      }
   },
   "id": "record.comment.delete.after"
}
```

### 3.7 自动化执行

监听自动化执行的三个关键事件：`执行开始`、`执行结束`和`执行失败`。使用此监听器事件可以记录自动化执行过程。

使用场景：
- 记录执行过程作为日志，统计分析
- 在执行前进行全局的权限检查
- 将执行记录发送到消息队列，推送给监控系统

**开始执行前**：
```json
{
   "content": {
      "args": ["lefttop"],
      "draft": false,
      "id": "trang7ixclbtg",
      "isDraft": false,
      "uuid": "trang7ixclbtg:sesgv3tgz0el"
   },
   "id": "app.automatic.before"
}
```

**执行成功**：
```json
{
   "content": {
      "args": ["lefttop"],
      "draft": false,
      "id": "trang7ixclbtg",
      "isDraft": false,
      "uuid": "trang7ixclbtg:sesgv3tgz0el"
   },
   "id": "app.automatic.success"
}
```

### 3.8 定时任务执行

监听定时任务执行的三个关键事件：`执行开始`、`执行成功`和`执行失败`。使用此监听器事件可以记录定时任务过程。

使用场景：
- 记录执行过程作为日志，统计分析
- 将执行记录发送到消息队列，推送给监控系统

**开始执行前**：
```json
{
   "content": {
      "endTime": 1718092915132,
      "id": "tlijinwmbtnet",
      "name": "每天上午10点，下午2点，4点创建一条记录",
      "requestId": "arqwu3bsirbh8",
      "serverId": "informat-biz2-prd",
      "startTime": 1718157714369
   },
   "id": "app.schedule.before"
}
```

**执行成功**：
```json
{
   "content": {
      "endTime": 1718092915132,
      "id": "tlijinwmbtnet",
      "name": "每天上午10点，下午2点，4点创建一条记录",
      "requestId": "arqwu3bsirbh8",
      "serverId": "informat-biz2-prd",
      "startTime": 1718157714369
   },
   "id": "app.schedule.success"
}
```

### 3.9 进入应用

"进入应用"监听器事件会在用户从客户端进入应用后触发。使用此监听器可以实现以下应用场景：

- 使用"显示对话框"自动化步骤，在客户端显示一个欢迎对话框，向用户展示欢迎信息或应用的使用指南
- 使用"设置角标"自动化步骤，设置应用在工作台界面显示的角标
- 将用户的登录时间记录到日志表中，以备后续分析或审计

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
   "eventContent": {
      "app": { ... },
      "platform": "web",
      "query": {
         "appId": "i1mwqy35y88hl"
      },
      "url": "https://next.informat.cn/app/i1mwqy35y88hl",
      "user": { ... }
   },
   "eventId": "app.enter",
   "id": "app.enter"
}
```

### 3.10 进入模块

"进入模块"监听器事件会在用户从客户端进入应用某个模块后触发。

使用场景：
- 使用"显示对话框"自动化步骤，在客户端显示一个欢迎对话框
- 将用户的访问时间记录到日志表中，以备后续分析或审计

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
   "appId": "i1mwqy35y88hl",
   "eventContent": {
      "app": { ... },
      "moduleKey": "listenerData",
      "platform": "web",
      "query": {
         "appId": "i1mwqy35y88hl",
         "moduleId": "snahtjpjwbz3f"
      },
      "url": "https://next.informat.cn/app/i1mwqy35y88hl/table/snahtjpjwbz3f",
      "user": { ... }
   },
   "eventId": "app.module.enter",
   "id": "app.module.enter",
   "moduleId": "snahtjpjwbz3f"
}
```

### 3.11 应用发布

在应用发布后触发。

```json
{
   "content": {
      "appDefineId": "demoApp",
      "appId": "i1mwqy35y88hl",
      "build": 1906,
      "companyId": "icxt9rsd1f0ai",
      "publishUser": "肖建宇"
   },
   "id": "app.publish"
}
```

### 3.12 成员事件

成员事件在通过"成员管理"界面添加、删除、修改成员角色操作后触发。

**应用成员加入后**：
```json
{
   "content": {
      "appDefineId": "demoApp",
      "appId": "i1mwqy35y88hl",
      "companyId": "icxt9rsd1f0ai",
      "roleList": ["admin"],
      "userId": "bt4tdzx8vtjoe"
   },
   "id": "app.member.add.after"
}
```

**应用成员移除后**：
```json
{
   "content": {
      "appDefineId": "demoApp",
      "appId": "i1mwqy35y88hl",
      "companyId": "icxt9rsd1f0ai",
      "roleList": ["admin"],
      "userId": "pacrwba408wd0"
   },
   "id": "app.member.remove.after"
}
```

**应用成员角色更新**：
```json
{
   "content": {
      "afterRoleList": ["admin", "ceo", "manager"],
      "appDefineId": "demoApp",
      "appId": "i1mwqy35y88hl",
      "beforeRoleList": ["admin", "ceo"],
      "companyId": "icxt9rsd1f0ai",
      "userId": "yvkc2kwpy3xzr"
   },
   "id": "app.member.role.update.after"
}
```

### 3.13 任务状态变更

在应用内，归属于监听的工作流的任务发生`委托`、`转交`、`跳转节点`、`完成任务`、`认领任务`、`开始任务`行为时触发。

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
    "eventId": "client.bpmn.task.change",
    "eventContent": {
        "app": { ... },
        "query": { ... },
        "moduleId": "ztkva3xsc2vbw",
        "user": { ... },
        "url": "https://next.informat.cn/app/i1mwqy35y88hl/bpmn/ztkva3xsc2vbw"
    },
    "id": "client.bpmn.task.change"
}
```

### 3.14 流程状态变更

在应用内，监听的工作流发生`撤销`、`删除`行为时触发。

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
  "eventId": "client.bpmn.process.change",
  "eventContent": {
    "app": { ... },
    "instanceId": "6f5771e7-351d-11ef-b137-a6c0b0be7615",
    "query": { ... },
    "moduleId": "ztkva3xsc2vbw",
    "type": "delete",
    "user": { ... },
    "url": "https://next.informat.cn/app/i1mwqy35y88hl/bpmn/ztkva3xsc2vbw?ri=6f5771e7-351d-11ef-b137-a6c0b0be7615"
  },
  "id": "client.bpmn.process.change"
}
```

### 3.15 数据表记录创建后（客户端触发）

"用户通过表单提交"、"用户通过工作流提交"的数据表记录，在创建后触发。

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
    "eventId": "client.record.create.after",
    "eventContent": {
        "app": { ... },
        "query": { ... },
        "tableId": "snahtjpjwbz3f",
        "source": "form",
        "user": { ... },
        "url": "https://next.informat.cn/app/i1mwqy35y88hl/table/snahtjpjwbz3f"
    },
    "id": "client.record.create.after"
}
```

### 3.16 数据表记录更新后（客户端触发）

"用户通过表单提交"、"用户通过工作流提交"的数据表记录，在更新后触发。

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
    "eventId": "client.record.update.after",
    "eventContent": {
        "app": { ... },
        "recordList": ["c67wwyqeth1up"],
        "query": { ... },
        "tableId": "snahtjpjwbz3f",
        "source": "form",
        "user": { ... },
        "url": "https://next.informat.cn/app/i1mwqy35y88hl/table/snahtjpjwbz3f?ri=c67wwyqeth1up"
    },
    "id": "client.record.update.after"
}
```

### 3.17 数据表记录删除后（客户端触发）

"用户通过表单提交"、"用户通过工作流提交"的数据表记录，在删除后触发。

> **TIP**：此监听器事件是在客户端触发，调用的自动化可以包含交互式逻辑。

```json
{
    "eventId": "client.record.delete.after",
    "eventContent": {
        "app": { ... },
        "query": { ... },
        "tableId": "snahtjpjwbz3f",
        "source": "form",
        "user": { ... },
        "url": "https://next.informat.cn/app/i1mwqy35y88hl/table/snahtjpjwbz3f"
    },
    "id": "client.record.delete.after"
}
```

## 4. 事件汇总表

| 事件ID | 说明 | 触发时机 | 客户端触发 | 事务 |
|--------|------|----------|:----------:|:----:|
| `record.create.before` | 数据表记录创建前 | 用户表单创建记录前 | 否 | 是 |
| `record.create.after` | 数据表记录创建后 | 用户表单创建记录后 | 否 | 是 |
| `record.update.before` | 数据表记录更新前 | 用户表单更新记录前 | 否 | 是 |
| `record.update.after` | 数据表记录更新后 | 用户表单更新记录后 | 否 | 是 |
| `record.delete.before` | 数据表记录删除前 | 用户表单删除记录前 | 否 | 是 |
| `record.delete.after` | 数据表记录删除后 | 用户表单删除记录后 | 否 | 是 |
| `record.rownumber.update.before` | 数据表记录排序前 | 拖拽修改记录顺序前 | 否 | 是 |
| `record.rownumber.update.after` | 数据表记录排序后 | 拖拽修改记录顺序后 | 否 | 是 |
| `record.comment.create.after` | 评论创建后 | 用户发表评论后 | 否 | 是 |
| `record.comment.delete.after` | 评论删除后 | 用户删除评论后 | 否 | 是 |
| `app.automatic.before` | 自动化执行前 | 自动化开始执行前 | 否 | 是 |
| `app.automatic.success` | 自动化执行成功 | 自动化执行成功后 | 否 | 是 |
| `app.schedule.before` | 定时任务执行前 | 定时任务开始执行前 | 否 | 是 |
| `app.schedule.success` | 定时任务执行成功 | 定时任务执行成功后 | 否 | 是 |
| `app.enter` | 进入应用 | 用户从客户端进入应用后 | 是 | 否 |
| `app.module.enter` | 进入模块 | 用户从客户端进入某个模块后 | 是 | 否 |
| `app.publish` | 应用发布 | 应用发布后 | 否 | 是 |
| `app.member.add.after` | 成员加入 | 添加应用成员后 | 否 | 是 |
| `app.member.remove.after` | 成员移除 | 删除应用成员后 | 否 | 是 |
| `app.member.role.update.after` | 成员角色更新 | 修改成员角色后 | 否 | 是 |
| `client.bpmn.task.change` | 任务状态变更 | 任务委托/转交/跳转/完成/认领/开始 | 是 | 否 |
| `client.bpmn.process.change` | 流程状态变更 | 流程撤销/删除 | 是 | 否 |
| `client.record.create.after` | 创建后（客户端触发） | 用户通过表单/工作流提交创建记录后 | 是 | 否 |
| `client.record.update.after` | 更新后（客户端触发） | 用户通过表单/工作流提交更新记录后 | 是 | 否 |
| `client.record.delete.after` | 删除后（客户端触发） | 用户通过表单/工作流提交删除记录后 | 是 | 否 |
