# taskExtendJson 与监听器配置

## 1. taskExtendJson 配置说明

taskExtendJson 控制审批节点的行为，以 JSON 字符串存储在 extensionElements 中：

```xml
<flowable:taskExtendJson value="{JSON内容}" />
```

| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `sameMode` | int | `0` | 相同处理人模式：0=不跳过，1=跳过，2=草稿节点（首节点自动提交） |
| `isSkipAssigneeEmpty` | bool | `false` | 审批人为空时是否自动跳过 |
| `isSkipAssigneeOnePersion` | bool | `false` | 只有一人时是否自动跳过（常用于发起人=审批人场景） |
| `isSkipApproval` | bool | `false` | 是否跳过审批（自动通过） |
| `isAssignedByPreviousNode` | bool | `false` | 是否由上一节点指派审批人 |
| `isEmptyAssignedByPreviousNode` | bool | `false` | 上一节点未指派时是否允许空 |
| `isSkipApprovedOnCountersignReturn` | bool | `false` | 会签驳回时是否跳过已审批的人 |

使用 taskExtendJson 时，通常需要配合跳过审批监听器：
```xml
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
```

---

## 2. 必需的监听器汇总

### 2.1 流程级监听器（写在 process > extensionElements 中）

```xml
<bpmn2:extensionElements>
  <!-- 流程结束监听器（必需，所有流程都要有） -->
  <flowable:executionListener
    class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener"
    event="end" />

  <!-- 任务创建全局监听器（必需，新版设计器标配） -->
  <flowable:eventListener
    class="org.jeecg.modules.listener.tasktip.TaskCreateGlobalListener" />
</bpmn2:extensionElements>
```

### 2.2 节点级监听器（写在 userTask > extensionElements 中）

```xml
<!-- 跳过审批监听器（使用 taskExtendJson 时必需） -->
<flowable:taskListener
  class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener"
  event="create" />

<!-- 完成时更新表单数据监听器（按需） -->
<flowable:taskListener
  class="org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener"
  event="complete" />

<!-- 首节点自动提交监听器（草稿节点专用） -->
<!-- 首次发起流程时自动跳过此节点，驳回后才需手动操作 -->
<flowable:taskListener
  class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener"
  event="create"
  id="9c3064baa7074eab62e3c5b3b5458691" />
```

### 2.3 结束节点监听器（按需）

```xml
<bpmn2:endEvent id="End_reject">
  <bpmn2:extensionElements>
    <!-- 拒绝时触发业务逻辑 -->
    <flowable:executionListener
      expression="${myBizListener.onReject(execution)}"
      event="start" />
  </bpmn2:extensionElements>
</bpmn2:endEvent>
```

---

## 3. 系统预置监听器一览（ext_act_listener 表）

系统在 `ext_act_listener` 表中预置了所有可用的监听器，设计器界面从此表加载监听器列表供用户选择。

**listener_type：** 1=执行监听器（executionListener），2=任务监听器（taskListener）

**listener_value_type：** `javaClass`=Java类，`expression`=表达式，`delegateExpression`=Spring委托表达式

### 3.1 执行监听器（type=1，用于流程级/节点级）

| 名称 | 事件 | 类型 | 完整类路径 |
|------|------|------|-----------|
| 平台通用流程结束监听 | end | javaClass | `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener` |
| 公文收文分发 | end | javaClass | `org.jeecg.modules.listener.easyoa.ReveicedStartListener` |
| 子流程会签开始监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener` |
| 子流程开始监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SubProcessStartListener` |
| 信号启动流程监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SignalProcessStartListener` |
| 表单设计器生成自动编号 | start | javaClass | `org.jeecg.modules.designform.listener.DesformAutoNumberListener` |
| 公文表单监听 | start | javaClass | `org.jeecg.modules.listener.easyoa.OaOfficialdocStartListener` |

### 3.2 任务监听器（type=2，用于 userTask 级）

| 名称 | 事件 | 类型 | 完整类路径/表达式 |
|------|------|------|-----------------|
| 用户审核节点跳过规则监听 | create | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener` |
| 首任务节点自动提交监听 | create | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener` |
| 子流程 | create | expression | `${subProcessListener}` |
| spring表达式监听 | create | delegateExpression | `${someJavaDelegateBean}` |
| 节点监听更新业务数据到流程变量 | complete | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener` |
| 公告审核监听 | complete | javaClass | `org.jeecg.modules.listener.announcement.NoticeReviewEndListener` |
| 新闻审核监听 | complete | javaClass | `org.jeecg.modules.listener.easyoa.NewsReviewEndListener` |
| 公文发文分发 | complete | javaClass | `org.jeecg.modules.listener.easyoa.DistributeIssuedEndListener` |

### 3.3 常用监听器使用场景

| 监听器 | 使用场景 | 是否必需 |
|--------|---------|---------|
| `ProcessEndListener` | 所有流程都要挂，流程结束时更新业务状态 | 必需 |
| `TaskSkipApprovalListener` | 使用 taskExtendJson 时挂载，实现跳过审批逻辑 | 配合 taskExtendJson 必需 |
| `TaskCreatedAutoSubmitListener` | 草稿节点（sameMode=2），首次自动跳过 | 草稿节点必需 |
| `TaskUpdateFormDataListener` | 节点完成时将表单数据同步到流程变量 | 按需 |
| `SubProcessStartListener` | 子流程启动时的初始化 | 子流程必需 |
| `SubProcessHqStartListener` | 子流程会签场景 | 子流程会签必需 |
| `DesformAutoNumberListener` | DesForm 表单自动编号 | DesForm 自动编号时需要 |

---

## 4. 源码级监听器完整清单

以下从源码中扫描所有 `implements TaskListener` 和 `implements ExecutionListener` 的实现类。

### 4.1 TaskListener 实现类（11个）

#### 平台核心（jeecg-boot-module-bpm-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener` | create | 节点审批自动跳过（发起人=审批人跳过、审批人为空跳过、已审批免二次等） |
| `org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener` | create | 同步表单字段到流程变量，更新业务标题，触发简流事件 |
| `org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener` | create | 草稿节点首次自动提交（sameMode=2），自动设置发起人并完成任务 |
| `org.jeecg.modules.extbpm.listener.task.SubProcessListener` | create | 子流程启动时传递主流程标题和业务号 |

#### 简流（jeecg-boot-module-mindesflow-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.listener.easyoa.TaskApprovalListener` | create | 简流版审批跳过监听 |
| `org.jeecg.modules.extbpm.process.adapter.listener.ApproveResultBranchListener` | create | 审批结果分支标识变量设置 |
| `org.jeecg.modules.extbpm.process.adapter.listener.BeforeEditListener` | create | 填写节点自定义表单数据ID设置 |

#### 业务（jeecg-boot-module-joa-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.testListenerExpression.TestTaskListener` | create/assign/complete/delete | 测试用监听器，记录各事件日志 |
| `org.jeecg.modules.listener.announcement.NoticeReviewEndListener` | complete | 公告审核完成自动发布 |
| `org.jeecg.modules.listener.easyoa.DistributeIssuedEndListener` | complete | 公文发文分发，按抄送部门创建分发记录 |
| `org.jeecg.modules.listener.easyoa.NewsReviewEndListener` | complete | 新闻审核完成自动发布 |

### 4.2 ExecutionListener 实现类（12个）

#### 平台核心（jeecg-boot-module-bpm-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener` | end | 流程结束更新状态、处理表单数据、清Redis缓存（**必需**） |
| `org.jeecg.modules.extbpm.listener.execution.SignalProcessStartListener` | start | 信号启动流程初始化变量、获取表单数据、设置业务key |
| `org.jeecg.modules.extbpm.listener.execution.SubProcessStartListener` | start | 子流程启动传递主流程标题、表单key、数据ID |
| `org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener` | start | 会签子流程启动传递主流程变量、表单URL和业务数据 |

#### 简流（jeecg-boot-module-mindesflow-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.minides.listener.ProcessEndRemoveRedisListener` | end | 简流结束清Redis缓存 |
| `org.jeecg.modules.minides.listener.MiniSubProcessStartListener` | start | 简流子流程启动初始化，传递流程变量 |
| `org.jeecg.modules.extbpm.process.adapter.delegate.MiniCallActivityListener` | start | 简流调用活动参数传递，处理系统变量和工作表映射 |

#### 业务（jeecg-boot-module-joa-flowable）

| 完整类路径 | 事件 | 说明 |
|-----------|------|------|
| `org.jeecg.modules.designform.listener.DesformAutoNumberListener` | start | 表单设计器自动编号 |
| `org.jeecg.modules.testListenerExpression.TestExecutionListener` | start/end | 测试用执行监听器 |
| `org.jeecg.modules.listener.easyoa.ReveicedStartListener` | end | 公文收文分发，根据部门信息分发任务 |
| `org.jeecg.modules.listener.easyoa.OaOfficialdocStartListener` | start | 公文表单监听，校验各节点意见字段 |
| `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener`（JOA副本） | end | OA模块流程结束处理（与平台核心同类名，不同模块） |
