新增JeecgBoot BPM流程自动生成器,包含流程创建、修改及审批人配置功能,支持自然语言描述转化为BPMN XML,并通过API与JeecgBoot系统交互。

This commit is contained in:
geht
2026-04-08 16:24:41 +08:00
parent 7c60acd679
commit 67104af7de
168 changed files with 207167 additions and 8 deletions

View File

@@ -0,0 +1,155 @@
# 条件表达式、抄送、按钮与服务任务
## 1. 条件表达式系统(来自设计器源码)
### 1.1 系统内置变量(可用于网关条件)
| 变量名 | 含义 | 用法示例 |
|--------|------|---------|
| `applyUserId` | 发起人用户名 | `${applyUserId == 'admin'}` |
| `applyUserDept` | 发起人部门 | `${applyUserDept == '部门ID'}` |
| `applyUserDeptManager` | 发起部门负责人 | `${applyUserDeptManager == 'username'}` |
| `applyUserParentDeptManager` | 上级部门负责人 | 同上 |
| `lastAssignee` | 上个节点处理人 | `${lastAssignee == 'admin'}` |
| `applyUserPostLevel` | 发起人职级 | `${applyUserPostLevel == '职级ID'}` |
| `applyUserApprovalRole` | 发起人审批角色 | `${applyUserApprovalRole == '角色ID'}` |
| `applyDate` | 发起日期 | `${applyDate > '2026-01-01'}` |
| `result` | 审批结果 | `${result == 1}` 通过 / `${result == 0}` 拒绝 |
### 1.2 条件运算符
| 运算符 | 含义 | 适用类型 |
|--------|------|---------|
| `eq` / `==` | 等于 | 字符串、数字、日期 |
| `ne` / `!=` | 不等于 | 字符串、数字、日期 |
| `gt` / `>` | 大于 | 数字、日期 |
| `gte` / `>=` | 大于等于 | 数字、日期 |
| `lt` / `<` | 小于 | 数字、日期 |
| `lte` / `<=` | 小于等于 | 数字、日期 |
| `in` | 在列表中 | 字符串、数字 |
| `not_in` | 不在列表中 | 字符串、数字 |
| `contains` | 包含 | 字符串 |
| `is_empty` | 为空 | 字符串、数字、文件 |
| `is_not_empty` | 不为空 | 字符串、数字、文件 |
| `is_department_manager` | 是部门负责人 | applyUserId, lastAssignee |
| `is_not_department_manager` | 不是部门负责人 | applyUserId, lastAssignee |
---
## 2. 抄送配置CcConfigJson
用户任务可配置抄送人,通知相关人员但不影响审批流程:
```xml
<bpmn2:userTask id="task_xxx" name="审批">
<bpmn2:extensionElements>
<flowable:CcConfigJson value="${BASE64_ENCODED_JSON}" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
### 抄送类型
| 类型 | 说明 |
|------|------|
| `candidateUsers` | 指定人 |
| `candidateRoles` | 指定角色 |
| `candidateDeptPositions` | 指定岗位 |
| `submitter_user` | 提交人本人 |
| `submitter_dept_leader` | 提交人部门负责人 |
| `submitter_parent_dept_leader` | 上级部门负责人 |
| `dept_members` | 本部门成员 |
| `dept_leader` | 部门负责人 |
---
## 3. 自定义按钮Button
用户任务可配置自定义操作按钮:
```xml
<bpmn2:userTask id="task_xxx" name="审批">
<bpmn2:extensionElements>
<flowable:Button id="btn_1" name="同意" code="approve" isHide="0" next="task_next" sort="1" />
<flowable:Button id="btn_2" name="拒绝" code="reject" isHide="0" next="end" sort="2" />
<flowable:Button id="btn_3" name="转办" code="transfer" isHide="0" sort="3" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
| 属性 | 说明 |
|------|------|
| `id` | 按钮唯一ID |
| `name` | 显示名称 |
| `code` | 按钮编码标识 |
| `isHide` | 是否隐藏0=显示1=隐藏) |
| `next` | 点击后跳转的目标节点ID |
| `sort` | 显示排序 |
---
## 4. 服务任务ServiceTask
### 4.1 API 服务任务
自动调用外部 HTTP 接口:
```xml
<bpmn2:serviceTask id="service_api" name="调用外部接口"
flowable:class="org.jeecg.modules.extbpm.listener.service.ApiServiceTaskDelegate">
<bpmn2:extensionElements>
<flowable:ApiServiceTaskConfig value="${BASE64_ENCODED_JSON}" />
</bpmn2:extensionElements>
</bpmn2:serviceTask>
```
ApiServiceTaskConfig JSON 结构:
```json
{
"apiUrl": "https://api.example.com/endpoint",
"method": "GET|POST",
"headers": {},
"parameters": {},
"timeout": 30000,
"retryCount": 0
}
```
### 4.2 AI 服务任务
调用 AI 大模型进行智能处理:
```xml
<bpmn2:serviceTask id="service_ai" name="AI智能处理"
flowable:class="org.jeecg.modules.extbpm.listener.service.AigcServiceTaskDelegate">
<bpmn2:extensionElements>
<flowable:AiServiceTaskConfig value="${BASE64_ENCODED_JSON}" />
</bpmn2:extensionElements>
</bpmn2:serviceTask>
```
AiServiceTaskConfig JSON 结构:
```json
{
"aiFlowId": "AI对话流ID",
"inputParams": {},
"outputParams": {}
}
```
---
## 5. 设计器 API 端点一览
| API 路径 | 用途 |
|----------|------|
| `act/designer/api/saveProcess` | 保存/新建流程 |
| `act/designer/api/getProcessXml` | 获取流程 XML |
| `act/designer/api/getTypes` | 获取流程类型列表 |
| `act/designer/api/getPageUsers` | 获取用户列表(审批人选择) |
| `act/designer/api/getGroups` | 获取角色/组列表 |
| `act/designer/api/getRoleNameByCodes` | 根据角色编码获取名称 |
| `act/designer/api/getExpressions` | 获取可用表达式列表 |
| `act/designer/api/getListenersByType` | 获取监听器列表 |
| `sys/sysDepart/queryDepartAndPostTreeSync` | 获取部门+岗位树 |
| `sys/position/list` | 获取职级列表 |

View File

@@ -0,0 +1,356 @@
# 审批人配置详解
JeecgBoot BPM 支持 7 种审批人配置方式,每种对应不同的 XML 属性组合。
## 1. 固定指定人assignee
最简单的方式,固定指定一个用户处理:
```xml
<bpmn2:userTask id="task_xxx" name="固定人审批" flowable:assignee="admin" />
```
## 2. 发起人/流程变量(表达式)
通过表达式动态获取审批人:
```xml
<!-- 流程发起人 -->
<bpmn2:userTask id="task_xxx" name="发起人提交" flowable:assignee="${applyUserId}" />
<!-- 部门负责人(自定义变量) -->
<bpmn2:userTask id="task_xxx" name="部门领导审批" flowable:assignee="${deptLeader}" />
```
## 3. 候选人(多人选一)— candidateUsers
多人中任一人可认领处理:
```xml
<bpmn2:userTask id="task_xxx" name="多人审批" flowable:candidateUsers="admin,jeecg,zhangsan" />
```
## 4. 角色审批 — candidateGroups + groupType="role"
按角色编码分配,角色下所有用户都可处理:
```xml
<bpmn2:userTask id="task_xxx" name="角色审批"
flowable:candidateGroups="admin,jeecg"
flowable:groupType="role" />
```
带跳过审批人配置taskExtendJson
```xml
<bpmn2:userTask id="task_xxx" name="审批角色"
flowable:candidateGroups="vue3,jeecg,admin"
flowable:groupType="role">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{
&quot;sameMode&quot;:0,
&quot;isSkipAssigneeEmpty&quot;:false,
&quot;isSkipAssigneeOnePersion&quot;:true,
&quot;isSkipApproval&quot;:false,
&quot;isAssignedByPreviousNode&quot;:false,
&quot;isEmptyAssignedByPreviousNode&quot;:true
}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
## 5. 部门审批 — candidateGroups + groupType="dept"
按部门 ID 分配,部门下所有用户都可处理:
```xml
<bpmn2:userTask id="task_xxx" name="部门审批"
flowable:candidateGroups="6d35e179cd814e3299bd588ea7daed3f,c6d7cb4deeac411cb3384b1b31278596"
flowable:groupType="dept">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
## 6. 部门岗位审批 — candidateGroups + groupType="deptPosition"
按部门岗位 ID 分配审批人:
```xml
<bpmn2:userTask id="task_xxx" name="候选岗位审批"
flowable:candidateGroups="2032392253970890754,2032395269063098370"
flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
## 7. 上一节点指派 — isAssignedByPreviousNode
由上一审批节点在完成时选择下一步处理人:
```xml
<bpmn2:userTask id="task_xxx" name="分配经理">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{
&quot;sameMode&quot;:0,
&quot;isSkipAssigneeEmpty&quot;:false,
&quot;isSkipAssigneeOnePersion&quot;:false,
&quot;isSkipApproval&quot;:false,
&quot;isAssignedByPreviousNode&quot;:true,
&quot;isEmptyAssignedByPreviousNode&quot;:false
}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
## 8. 职务级别审批 — groupType="position" + 表达式
通过表达式动态获取指定职务级别的用户:
```xml
<bpmn2:userTask id="task_xxx" name="职务级别审批"
flowable:assignee="${assigneeUserId}"
flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, '岗位ID')}"
flowable:groupType="position"
flowable:countersignRule="countersign_proportion">
...
</bpmn2:userTask>
```
## 9. 表达式审批人 — Spring Bean 动态获取
系统提供 3 个 Spring Bean 用于通过表达式动态获取审批人,在 `flowable:candidateUsers``flowable:assignee` 中使用。
### 9.1 `flowNodeExecution` — 部门层级表达式
Bean 类:`org.jeecg.modules.expression.FlowNodeExecutionExpression`
| 表达式 | 说明 | 依赖变量 |
|--------|------|---------|
| `${flowNodeExecution.getDepartLeaders(execution)}` | 发起部门的部门负责人 | `sys_org_code` |
| `${flowNodeExecution.getLevel1DepartLeaders(execution)}` | 上一级部门负责人 | `sys_org_code` |
| `${flowNodeExecution.getLevel2DepartLeaders(execution)}` | 上二级部门负责人 | `sys_org_code` |
| `${flowNodeExecution.getLevel3DepartLeaders(execution)}` | 上三级部门负责人 | `sys_org_code` |
| `${flowNodeExecution.getUserSuperPositionLevel1(execution)}` | 发起人上一级岗位人员 | `applyUserId` + `sys_org_code` |
| `${flowNodeExecution.getUserSuperPositionLevel2(execution)}` | 发起人上两级岗位人员 | `applyUserId` + `sys_org_code` |
| `${flowNodeExecution.getUserSuperPositionLevel3(execution)}` | 发起人上三级岗位人员 | `applyUserId` + `sys_org_code` |
**用法示例:**
```xml
<bpmn2:userTask id="task_dept_leader" name="部门负责人审批"
flowable:candidateUsers="${flowNodeExecution.getDepartLeaders(execution)}">
</bpmn2:userTask>
```
### 9.2 `oaUtil` — 流程上下文表达式
Bean 类:`org.jeecg.modules.expression.OaUtilExpression`
**办理人表达式:**
| 表达式 | 说明 |
|--------|------|
| `${oaUtil.getLastTaskAssignee(execution)}` | 获取上一节点处理人用户名(排除加签节点,支持驳回场景) |
| `${oaUtil.getLastTaskAssigneePositionLevel1(execution)}` | 上一节点处理人的上一级岗位人员(支持会签节点) |
**条件分支表达式(用于 sequenceFlow 的 conditionExpression**
| 表达式 | 说明 | 操作符 |
|--------|------|--------|
| `${oaUtil.branchConditionByPost('eq',applyUserId,'部长')}` | 按发起人职务判断 | eq=等于, ne=不等于 |
| `${oaUtil.branchConditionByOrg('eq',sys_org_code,'A01A01')}` | 按发起人部门编码判断 | eq=等于, ne=不等于 |
**上一节点处理人条件判断写法:**
```xml
<!-- 等于 -->
<conditionExpression>${oaUtil.getLastTaskAssignee(execution) == 'zhangsan'}</conditionExpression>
<!-- 不等于 -->
<conditionExpression>${oaUtil.getLastTaskAssignee(execution) != 'zhangsan'}</conditionExpression>
<!-- in属于多人之一 -->
<conditionExpression>${'zhangsan,lisi'.contains(oaUtil.getLastTaskAssignee(execution))}</conditionExpression>
<!-- not in -->
<conditionExpression>${!'zhangsan,lisi'.contains(oaUtil.getLastTaskAssignee(execution))}</conditionExpression>
```
### 9.3 `oaFlowExpression` — 职级审批表达式
Bean 类:`org.jeecg.modules.extbpm.process.common.expression.OaFlowExpression`
| 表达式 | 说明 |
|--------|------|
| `${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, 'targetPositionId')}` | 按职级查找审批人见下方4种规则 |
| `${oaFlowExpression.getUserSuperPositionLevel1(applyUserId)}` | 发起人上一级岗位人员(按用户名,不需要 execution |
| `${oaFlowExpression.getUserSuperPositionLevel2(applyUserId)}` | 发起人上两级岗位人员 |
| `${oaFlowExpression.getUserSuperPositionLevel3(applyUserId)}` | 发起人上三级岗位人员 |
**`getApplyUserDeptPositionLevel` 4种规则**
| 发起人职级 | 目标职级 | 行为 |
|-----------|---------|------|
| 职员层(职员/部长/副部长) | 职员层 | 查发起人所在部门下对应职级人员 |
| 职员层 | 领导层(董事长/总经理/副总经理) | 查发起人所在公司领导班子中对应职级 |
| 领导层 | 职员层 | 返回空(领导不需要职员审批) |
| 领导层 | 领导层 | 查当前领导班子中对应职级 |
**用法示例(配合 groupType="position"**
```xml
<bpmn2:userTask id="task_position" name="职级审批"
flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, '1958471111989067778')}"
flowable:groupType="position">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
### 9.4 条件评估工具类
`org.jeecg.modules.expression.util.EvalConditionUtils` 提供条件评估:
| 操作符 | 含义 | 支持类型 |
|--------|------|---------|
| `eq` | 等于(忽略大小写) | String / Set<String>(任一匹配) |
| `ne` | 不等于(忽略大小写) | String / Set<String>(全部不匹配) |
---
## 10. groupType 完整速查表
| groupType 值 | 含义 | candidateGroups 值 | 说明 |
|-------------|------|-------------------|------|
| `role` | 系统角色 | 角色编码(逗号分隔) | `jeecg,noticeReviewer` |
| `approvalRole` | 审批角色 | 审批角色编码(逗号分隔) | 独立于系统角色的审批专用角色 |
| `dept` | 部门 | 部门ID逗号分隔 | `6d35e179cd814e3299bd588ea7daed3f` |
| `deptPosition` | 部门岗位 | 岗位ID逗号分隔 | `2032392253970890754,2032395269063098370` |
| `position` | 职务级别 | 通过表达式获取 | 配合 `oaFlowExpression` 使用 |
| `formData` | 表单数据 | 从表单字段动态获取 | 用户选择控件的值作为审批人 |
| _(无)_ | 指定人/候选人 | 不使用 candidateGroups | 用 `assignee``candidateUsers` |
## 11. 审批人数据来源表
生成流程时如需查询实际的角色编码、用户名、部门ID可查询以下系统表
| 数据 | 表名 | 关键字段 | 查询示例 |
|------|------|---------|---------|
| 角色编码 | `sys_role` | `role_code` | `SELECT role_code, role_name FROM sys_role` |
| 用户名 | `sys_user` | `username` | `SELECT username, realname FROM sys_user` |
| 部门ID | `sys_depart` | `id` | `SELECT id, depart_name FROM sys_depart` |
**sys_depart.org_category 机构类别:**
| 值 | 含义 | 用途 |
|----|------|------|
| `1` | 公司 | 顶级组织 |
| `2` | 部门 | `groupType="dept"` 时使用部门ID |
| `3` | 岗位 | `groupType="deptPosition"` 时使用岗位ID |
| `4` | 子公司 | 子组织 |
## 12. 草稿节点(驳回到发起人)— assignee + sameMode:2
草稿节点用于"驳回到发起人"场景:流程被驳回后,发起人可修改数据并重新提交。
**核心特征:**
- `flowable:assignee="${applyUserId}"` — 指定发起人
- `sameMode: 2` — 特殊模式,标记为草稿/首节点
- `TaskCreatedAutoSubmitListener` — 首次提交时自动跳过此节点(首节点自动提交),驳回后才需要手动操作
- `TaskSkipApprovalListener` — 标准跳过审批监听器
```xml
<bpmn2:userTask id="task_draft" name="草稿" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:2,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:false,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
</bpmn2:userTask>
```
> **使用场景:** 在"驳回到发起人"流程模式中,将此节点放在开始事件之后。首次发起流程时,此节点会被 `TaskCreatedAutoSubmitListener` 自动跳过;当审批被驳回到此节点时,发起人需要手动修改数据后重新提交。
## 13. 完整参考示例 — 所有审批人类型串联
以下是一个包含所有审批人配置类型的完整流程 XML来自生产环境
```
开始 → 指定人(jeecg) → 候选多人(admin,jeecg) → 角色(jeecg,noticeReviewer)
→ 部门(两个部门ID) → 候选岗位(两个岗位ID) → 职级(表达式)
→ 会签固定人员(jeecg,qinfeng, 全部通过) → 结束
```
**关键 XML 片段:**
```xml
<!-- 1. 指定人 -->
<bpmn2:userTask id="Task_04woce4" name="指定人" flowable:assignee="jeecg" />
<!-- 2. 候选多人 -->
<bpmn2:userTask id="Task_1k76zxi" name="指定多人(候选多人)" flowable:candidateUsers="admin,jeecg">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 3. 角色 -->
<bpmn2:userTask id="Task_0gm5nm0" name="角色"
flowable:candidateGroups="jeecg,noticeReviewer" flowable:groupType="role">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 4. 部门 -->
<bpmn2:userTask id="Task_0hre67h" name="部门"
flowable:candidateGroups="6d35e179cd814e3299bd588ea7daed3f,c6d7cb4deeac411cb3384b1b31278596"
flowable:groupType="dept">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 5. 候选岗位 -->
<bpmn2:userTask id="Task_0d9ubtz" name="候选岗位"
flowable:candidateGroups="2032392253970890754,2032395269063098370"
flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 6. 职级 -->
<bpmn2:userTask id="Task_1euf9po" name="职级"
flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, '1958471111989067778')}"
flowable:groupType="position">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:true,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:true,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 7. 会签固定人员(全部通过) -->
<bpmn2:userTask id="Task_1tj90vc" name="会签固定人员"
flowable:assignee="${assigneeUserId}" flowable:countersignRule="countersign_all">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:false,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:false,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskCountersignExtendJson value="eyJhdWRpdG9yVXNlclR5cGUiOiJjYW5kaWRhdGVVc2VycyIsImF1ZGl0b3JVc2VySWRzIjpbImplZWNnIiwicWluZmVuZyJdLCJ0aW1lc3RhbXAiOjE3NzM0MTU4NTkwMTZ9" />
</bpmn2:extensionElements>
<bpmn2:multiInstanceLoopCharacteristics
flowable:collection="${flowUtil.stringToList('jeecg,qinfeng')}"
flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">
${nrOfCompletedInstances/nrOfInstances==1}
</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
```

View File

@@ -0,0 +1,242 @@
# 会签配置详解
会签(多实例任务):一个审批节点同时由多人处理,根据完成比例决定是否通过。
**重要前提:** 不启动多实例(不加 `multiInstanceLoopCharacteristics`),则只会创建一个任务,默认不启动。不启动多实例时,会签相关配置都无效。
## 1. 会签通用结构
```xml
<bpmn2:userTask id="task_xxx" name="会签节点"
flowable:assignee="${assigneeUserId}"
flowable:countersignRule="${RULE}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{...}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskCountersignExtendJson value="${BASE64_CONFIG}" />
</bpmn2:extensionElements>
<bpmn2:multiInstanceLoopCharacteristics isSequential="false"
flowable:collection="${COLLECTION_EXPR}"
flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">
${COMPLETION_CONDITION}
</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
```
## 2. 会签规则countersignRule
| 规则值 | 说明 | completionCondition |
|--------|------|---------------------|
| `countersign_all` | 全部通过 | `${nrOfCompletedInstances/nrOfInstances==1}` |
| `countersign_one` | 一人通过即可 | `${nrOfCompletedInstances/nrOfInstances>0}` |
| `countersign_half` | 半数通过 | `${nrOfCompletedInstances/nrOfInstances>=0.5}` |
| `countersign_proportion` | 按比例通过(自定义比例) | `${nrOfCompletedInstances/nrOfInstances>=0.N}` |
| `countersign_custom` | 自定义选人 | 自定义 |
> **注意:** XML 中 `>=` 需要写成 `&gt;=`,如 `${nrOfCompletedInstances/nrOfInstances&gt;=0.6}`
## 3. 顺序会签 vs 并行会签
| 对比项 | 并行会签isSequential="false" | 顺序会签isSequential="true" |
|--------|-------------------------------|-------------------------------|
| 任务创建 | 同时为所有审批人创建任务 | 按顺序逐个创建,前一个完成才创建下一个 |
| nrOfActiveInstances | 等于尚未完成的审批人数 | 始终为 1 |
| 适用场景 | 多人同时审批,互不影响 | 按层级逐级审批 |
| 完成条件触发 | 每完成一个就检查条件 | 每完成一个就检查条件 |
```xml
<!-- 并行会签(默认,所有人同时收到任务) -->
<bpmn2:multiInstanceLoopCharacteristics isSequential="false" ...>
<!-- 顺序会签(按顺序逐个审批) -->
<bpmn2:multiInstanceLoopCharacteristics isSequential="true" ...>
```
## 4. 多实例内置流程变量
多实例自动创建以下 3 个流程变量,用于 `completionCondition` 表达式:
| 变量名 | 类型 | 说明 |
|--------|------|------|
| `nrOfInstances` | int | 实例总数(审批人总数) |
| `nrOfActiveInstances` | int | 当前活跃的(未完成的)实例数。**顺序会签时此值始终为 1** |
| `nrOfCompletedInstances` | int | 已完成的实例个数 |
**完成条件示例:**
```
${nrOfCompletedInstances/nrOfInstances==1} → 全部完成
${nrOfCompletedInstances/nrOfInstances>0} → 至少一人完成
${nrOfCompletedInstances/nrOfInstances>=0.5} → 50%完成
${nrOfCompletedInstances/nrOfInstances>=0.6} → 60%完成时,删除其他未完成任务,继续下一步
```
## 5. 会签工具 Bean — flowUtil
`flowUtil` 是系统暴露的 Spring Bean提供会签人员集合获取方法
| 方法 | 说明 | 用于 |
|------|------|------|
| `${flowUtil.stringToList('user1,user2')}` | 将逗号分隔字符串转为 List 集合 | 固定人员会签candidateUsers |
| `${flowUtil.getAssigneeUsers(execution,'BASE64配置')}` | 根据 Base64 编码的配置动态获取审批人列表 | 部门/岗位/表单字段会签 |
**`stringToList` 的变量写法:**
```xml
<!-- 固定人员 -->
flowable:collection="${flowUtil.stringToList('admin,jeecg,zhangsan')}"
<!-- 使用流程变量(动态) -->
flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}"
```
**`getAssigneeUsers` 的 Base64 配置:** 将 taskCountersignExtendJson 的 JSON去掉 timestamp 和 countersignProportion进行 Base64 编码后作为参数传入。
## 4. 会签审批人类型auditorUserType
taskCountersignExtendJson 是 Base64 编码的 JSON解码后结构如下
### 人员会签candidateUsers
```json
{
"auditorUserType": "candidateUsers",
"auditorUserIds": ["jeecg", "admin"],
"countersignProportion": "0.2",
"timestamp": 1758257673121
}
```
对应 XML collection
```xml
flowable:collection="${flowUtil.stringToList('jeecg,admin')}"
```
### 部门会签candidateDepts
```json
{
"auditorUserType": "candidateDepts",
"auditorDeptIds": ["部门ID1", "部门ID2"],
"timestamp": 1758257664644
}
```
对应 XML collection
```xml
flowable:collection="${flowUtil.getAssigneeUsers(execution,'BASE64编码的配置')}"
```
### 职务会签candidatePosts
```json
{
"auditorUserType": "candidatePosts",
"auditorPostIds": ["职务ID1", "职务ID2"],
"timestamp": 1758202368122
}
```
对应 XML collection
```xml
flowable:collection="${flowUtil.getAssigneeUsers(execution,'BASE64编码的配置')}"
```
### 表单字段会签formData
从表单中的用户选择控件动态获取会签人:
```json
{
"auditorUserType": "formData",
"auditorCountersignFormField": "select_user_xxx",
"auditorCountersignFormFieldType": "select-user",
"timestamp": 1758257668105
}
```
对应 XML collection
```xml
flowable:collection="${flowUtil.getAssigneeUsers(execution,'BASE64编码的配置')}"
```
## 7. 完整会签示例 — 人员会签(并行,全部通过)
```xml
<bpmn2:userTask id="task_countersign" name="部门会签"
flowable:assignee="${assigneeUserId}"
flowable:countersignRule="countersign_all">
<bpmn2:extensionElements>
<flowable:taskCountersignExtendJson value="eyJhdWRpdG9yVXNlclR5cGUiOiJjYW5kaWRhdGVVc2VycyIsImF1ZGl0b3JVc2VySWRzIjpbImFkbWluIiwiamVlY2ciXSwidGltZXN0YW1wIjoxNzU4MjU3NjczMTIxfQ==" />
</bpmn2:extensionElements>
<bpmn2:multiInstanceLoopCharacteristics
flowable:collection="${flowUtil.stringToList('admin,jeecg')}"
flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">
${nrOfCompletedInstances/nrOfInstances==1}
</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
```
## 8. 完整会签示例 — 人员比例通过并行20%
```xml
<bpmn2:userTask id="task_vote" name="投票表决"
flowable:assignee="${assigneeUserId}"
flowable:countersignRule="countersign_proportion"
flowable:countersignProportion="0.2">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:false,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:false,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskCountersignExtendJson value="eyJjb3VudGVyc2lnblByb3BvcnRpb24iOiIwLjIiLCJhdWRpdG9yVXNlclR5cGUiOiJjYW5kaWRhdGVVc2VycyIsImF1ZGl0b3JVc2VySWRzIjpbImplZWNnIl0sInRpbWVzdGFtcCI6MTc1ODI1NzY3MzEyMX0=" />
</bpmn2:extensionElements>
<bpmn2:multiInstanceLoopCharacteristics
flowable:collection="${flowUtil.stringToList('jeecg')}"
flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">
${nrOfCompletedInstances/nrOfInstances&gt;=0.2}
</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
```
## 9. 完整会签示例 — 岗位会签顺序比例20%
来自生产环境的岗位candidatePosts顺序会签示例使用 `flowUtil.getAssigneeUsers` 动态获取审批人:
**taskCountersignExtendJson Base64 解码后:**
```json
{
"countersignProportion": "0.2",
"auditorUserType": "candidatePosts",
"auditorPostIds": ["2032387176954642433", "1958471111989067778"],
"timestamp": 1773418938149
}
```
**getAssigneeUsers 参数 Base64 解码后(不含 timestamp 和 countersignProportion**
```json
{
"auditorUserType": "candidatePosts",
"auditorPostIds": ["2032387176954642433", "1958471111989067778"]
}
```
```xml
<bpmn2:userTask id="task_dept_mgr" name="部门经理审批"
flowable:assignee="${assigneeUserId}"
flowable:countersignRule="countersign_proportion">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:0,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:false,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:false,&quot;isSkipApprovedOnCountersignReturn&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskCountersignExtendJson value="eyJjb3VudGVyc2lnblByb3BvcnRpb24iOiIwLjIiLCJhdWRpdG9yVXNlclR5cGUiOiJjYW5kaWRhdGVQb3N0cyIsImF1ZGl0b3JQb3N0SWRzIjpbIjIwMzIzODcxNzY5NTQ2NDI0MzMiLCIxOTU4NDcxMTExOTg5MDY3Nzc4Il0sInRpbWVzdGFtcCI6MTc3MzQxODkzODE0OX0=" />
</bpmn2:extensionElements>
<bpmn2:multiInstanceLoopCharacteristics isSequential="true"
flowable:collection="${flowUtil.getAssigneeUsers(execution,'eyJhdWRpdG9yVXNlclR5cGUiOiJjYW5kaWRhdGVQb3N0cyIsImF1ZGl0b3JQb3N0SWRzIjpbIjIwMzIzODcxNzY5NTQ2NDI0MzMiLCIxOTU4NDcxMTExOTg5MDY3Nzc4Il19')}"
flowable:elementVariable="assigneeUserId" />
</bpmn2:userTask>
```
**关键差异:**
- `isSequential="true"` — 顺序逐个审批
- 没有 `completionCondition` — 当 countersignRule 为 proportion 但未写 completionCondition 时,系统通过 countersignProportion 属性和 taskCountersignExtendJson 中的 countersignProportion 值自动处理
- `flowUtil.getAssigneeUsers(execution, 'BASE64')` — 运行时根据岗位ID动态获取用户列表

View File

@@ -0,0 +1,176 @@
# 流程配置数据库表ext_act_process 系列)
流程除了 BPMN XML 外,还需要在 4 张配置表中存储流程属性、节点配置、表单绑定和字段权限。
## 1. ext_act_process — 流程主表
| 字段 | 说明 | 取值 |
|------|------|------|
| `id` | 流程ID主键 | 新建时返回 |
| `process_key` | 流程定义Key | `process_{timestamp}` |
| `process_name` | 流程名称 | 用户定义 |
| `process_type` | 流程分类 | 字典 `bpm_process_type` 的值,如 `oa``test` |
| `process_status` | 发布状态 | 0=未发布, 1=已发布 |
| `process_xml` | BPMN XMLlongblob | 完整 XML 内容 |
| `start_type` | 发起方式 | 见下表 |
| `urge_status` | 允许催办 | `0`=关, `1`=开 |
| `back_status` | 允许撤回 | `0`=关, `1`=开 |
| `graphic_status` | 显示流程图 | `0`=关, `1`=开 |
| `auto_submit_status` | 自动提交 | `0`=关, `1`=开 |
| `notify_way` | 通知方式 | 系统消息/邮件/钉钉/企微 |
| `open_status` | 启用状态 | 0=关, 1=开 |
| `run_concurrent_mode` | 并发模式 | 控制同一数据多次发起 |
| `iz_supervise` | 督办标记 | 0=否, 1=是 |
**start_type 发起方式:**
| 值 | 说明 |
|----|------|
| `manual` | 手工发起流程(默认) |
| `tableEvent` | 工作表触发(数据新增/修改时自动发起) |
| `buttonEvent` | 按钮事件触发(自定义按钮触发) |
| `timerEvent` | 定时触发 |
| `dateFieldEvent` | 根据表日期字段触发 |
| `userEvent` | 人员事件触发(如员工离职) |
| `subEvent` | 子流程触发 |
## 2. ext_act_process_form — 流程表单绑定
将流程与业务表单关联:
| 字段 | 说明 | 取值 |
|------|------|------|
| `relation_code` | 关联编码(唯一) | `onl_{表名}` / `desform_{表名}` / `dev_{表名}_001` |
| `biz_name` | 业务名称 | 可选 |
| `process_id` | 关联流程ID | 外键 |
| `form_table_name` | 表单表名 | 业务表名 |
| `form_type` | 表单类型 | 见下表 |
| `title_exp` | 标题表达式 | 如 `请假申请【${name}】` |
| `form_deal_style` | 表单处理风格 | `default` |
| `flow_status_col` | 流程状态字段 | 通常为 `bpm_status` |
| `trigger_action` | 触发动作 | `add`/`update`/`add\|update`tableEvent 时用) |
| `report_print_url` | 打印模板URL | 可选 |
**form_type 表单类型:**
| 值 | 说明 | relation_code 格式 |
|----|------|-------------------|
| `1` | Online表单低代码表单 | `onl_{tableName}` |
| `2` | 表单设计器DesForm | `desform_{formCode}` |
| `3` | 自定义开发表单 | `dev_{code}_001` |
**title_exp 标题表达式语法:** 使用 `${变量名}` 引用表单字段值,如 `请假【${name}】提交于${create_time}`
## 3. ext_act_process_node — 节点配置
控制每个审批节点的行为:
| 字段 | 说明 | 取值 |
|------|------|------|
| `process_id` | 关联流程ID | 外键 |
| `process_node_code` | 节点ID对应 XML 中的 userTask id | 如 `task_apply` |
| `process_node_name` | 节点名称 | 如 `部门经理审批` |
| `model_and_view` | PC端表单路径 | 如 `super/bpm/process/components/OnlineFormOpt` |
| `model_and_view_mobile` | 移动端表单路径 | 可选 |
| `node_timeout` | 超时提醒(小时) | 0=不提醒 |
| `form_edit_status` | 表单是否可编辑 | `0`=只读, `1`=可编辑 |
| `cc_status` | 允许抄送 | `0`=关, `1`=开 |
| `selnext_user_status` | 允许选择下一步处理人 | `0`=关, `1`=开 |
| `msg_status` | 消息通知 | `0`=关, `1`=开 |
| `transfer_status` | 允许转办 | `0`=关, `1`=开 |
| `add_sign_status` | 允许加签 | `0`=关, `1`=开 |
| `smart_back_status` | 允许智能回退 | `0`=关, `1`=开 |
| `reject_status` | 允许驳回 | `0`=关, `1`=开 |
| `allow_counter_sign_add_user` | 会签允许加人 | `0`=关, `1`=开 |
| `node_config_json` | 节点扩展配置JSON | 包含通知设置、审批人配置等 |
## 4. ext_act_process_node_auth — 字段权限配置
控制每个节点上表单字段的可见性和可编辑性:
| 字段 | 说明 | 取值 |
|------|------|------|
| `process_id` | 关联流程ID | 外键 |
| `process_node_code` | 节点ID | 如 `task_apply` |
| `rule_code` | 字段编码 | 表单字段名 |
| `rule_name` | 字段名称 | 显示名称 |
| `rule_type` | 策略类型 | `1`=显示, `2`=禁用 |
| `status` | 效果模式 | `1`=正向有效, `0`=反向有效 |
| `required` | 是否必填 | `0`=否, `1`=是 |
| `form_type` | 表单类型 | `1`/`2`/`3` 同上 |
| `form_biz_code` | 表单业务编码 | 表名或表单编码 |
| `desform_com_key` | DesForm 组件Key | DesForm 专用 |
**rule_type + status 组合效果:**
| rule_type | status | 效果 |
|-----------|--------|------|
| `1`(显示) | `1`(正向) | 字段**可见** |
| `1`(显示) | `0`(反向) | 字段**隐藏** |
| `2`(禁用) | `1`(正向) | 字段**禁用**(只读) |
| `2`(禁用) | `0`(反向) | 字段**可编辑** |
## 5. node_config_json 完整结构
节点扩展配置 JSON 包含以下关键字段(来自生产数据分析):
```json
{
// 审批人配置
"approverGroups": {
"approverType": "candidateUser",
"assigneeType": "assigneeByName|assigneeByExp",
"approverIds": ["admin", "jeecg"],
"approverNames": ["管理员", "jeecg"],
"roleIds": [], "roleNames": [],
"deptIds": [], "deptNames": [],
"postIds": [], "postNames": [],
"expressionsIds": ["${applyUserId}"],
"expressionsNames": ["获取发起人"],
"formTableType": "",
"levelMode": "1",
"variableContent": "", "variableTitle": "[]"
},
// 审批行为
"sameMode": 0, // 相同处理人: 0=不跳过, 1=跳过, 2=草稿
"skipApproval": 0, // 0=不跳过, 1=跳过审批
"assigneeIsEmpty": 0, // 审批人为空时: 0=不跳过
"approvalEnabled": true, // 启用审批
"approvalMethod": "1", // 审批方式
// 节点功能开关
"formEditStatus": false, // 表单可编辑
"ccStatus": true, // 抄送
"selnextUserStatus": true, // 选择下一步处理人
"msgStatus": false, // 消息通知
"transferStatus": true, // 转办
"rejectStatus": true, // 驳回
"allowAddSign": true, // 加签
"allowCountersignAddUser": false, // 会签加人
// 会签配置
"isSequential": false, // 顺序/并行
"collection": "${flowUtil.stringToList(assigneeUserIdList)}",
"elementVariable": "assigneeUserId",
// 分支相关
"approveResultBranch": false, // 审批结果分支
"hasResultBranch": false,
// 发起人节点标记
"applyUserNode": true, // 是否为发起人节点
// 超时配置
"timeType": "timeDate",
"level": "1",
// 更新记录(服务节点)
"expressionType": "delegateExpression",
"expressionValue": "${updateRecordDelegate}",
"formTableCode": "table_name",
"formTableSourceTaskId": "start",
"formTableSourceNodeType": "table",
"updateFields": "[...]"
}
```

View File

@@ -0,0 +1,394 @@
# 完整示例、Python 脚本与流程模式
## 1. 完整示例 — 请假审批流程
**流程描述:** 开始 → 员工提交 → 经理审批 → 排他网关(通过/拒绝) → HR审批 → 结束
### 1.1 节点定义
```xml
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId" />
<bpmn2:userTask id="task_apply" name="员工提交申请" flowable:assignee="${applyUserId}" />
<bpmn2:userTask id="task_manager" name="部门经理审批" flowable:assignee="manager" />
<bpmn2:exclusiveGateway id="gateway_result" name="审批结果" />
<bpmn2:userTask id="task_hr" name="HR审批" flowable:assignee="hr" />
<bpmn2:endEvent id="end" name="结束" />
```
### 1.2 连线定义
```xml
<bpmn2:sequenceFlow id="flow_1" name="" sourceRef="start" targetRef="task_apply" />
<bpmn2:sequenceFlow id="flow_2" name="" sourceRef="task_apply" targetRef="task_manager" />
<bpmn2:sequenceFlow id="flow_3" name="" sourceRef="task_manager" targetRef="gateway_result" />
<bpmn2:sequenceFlow id="flow_approve" name="通过" sourceRef="gateway_result" targetRef="task_hr">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 1}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_reject" name="拒绝" sourceRef="gateway_result" targetRef="end">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 0}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_4" name="" sourceRef="task_hr" targetRef="end" />
```
### 1.3 布局计算
```
节点列表(按垂直顺序):
start: type=startEvent, y=30, h=36 → bottom=66
task_apply: type=userTask, y=106, h=60 → bottom=166
task_manager: type=userTask, y=206, h=60 → bottom=266
gateway_result: type=exclusiveGateway, y=306, h=50 → bottom=356
task_hr: type=userTask, y=396, h=60 → bottom=456
end: type=endEvent, y=496, h=36 → bottom=532
```
### 1.4 nodes 参数
```
id=task_apply###nodeName=员工提交申请@@@id=task_manager###nodeName=部门经理审批@@@id=task_hr###nodeName=HR审批@@@
```
## 2. Python 调用脚本模板
```python
import urllib.request
import urllib.parse
import json
import time
def create_bpm_process(api_base, token, process_name, process_type, bpmn_xml, nodes_str, tenant_id="1"):
"""
创建 JeecgBoot BPM 流程
Args:
api_base: 后端地址,如 "https://api3.boot.jeecg.com"
token: X-Access-Token
process_name: 流程名称
process_type: 流程类型(如 "oa"
bpmn_xml: 完整 BPMN XML 字符串
nodes_str: nodes 参数字符串
tenant_id: 租户ID默认 "1"
Returns:
dict: API 返回结果
"""
ts = str(int(time.time() * 1000))
process_key = f"process_{ts}"
# 替换 XML 中的占位符
bpmn_xml = bpmn_xml.replace("${PROCESS_KEY}", process_key)
bpmn_xml = bpmn_xml.replace("${PROCESS_NAME}", process_name)
data = {
"processDefinitionId": "0",
"processName": process_name,
"processkey": process_key,
"typeid": process_type,
"lowAppId": "",
"params": "",
"nodes": nodes_str,
"processDescriptor": bpmn_xml,
"realProcDefId": "",
"startType": "manual"
}
encoded_data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(
f"{api_base}/act/designer/api/saveProcess",
data=encoded_data,
headers={
"X-Access-Token": token,
"X-Sign": "00000000000000000000000000000000",
"X-Tenant-Id": tenant_id,
"X-Timestamp": ts,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
method="POST"
)
resp = urllib.request.urlopen(req)
result = json.loads(resp.read().decode('utf-8'))
return result, process_key
def update_bpm_process(api_base, token, process_id, process_key, process_name, process_type, bpmn_xml, nodes_str, tenant_id="1"):
"""
更新已有 JeecgBoot BPM 流程
Args:
api_base: 后端地址
token: X-Access-Token
process_id: 流程数据表ID新建时返回的 obj
process_key: 流程定义ID
process_name: 流程名称
process_type: 流程类型
bpmn_xml: 完整 BPMN XML 字符串
nodes_str: nodes 参数字符串
tenant_id: 租户ID默认 "1"
Returns:
dict: API 返回结果
"""
ts = str(int(time.time() * 1000))
data = {
"processDefinitionId": process_id,
"processName": process_name,
"processkey": process_key,
"typeid": process_type,
"lowAppId": "",
"params": "",
"nodes": nodes_str,
"processDescriptor": bpmn_xml,
"startType": "manual"
}
encoded_data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(
f"{api_base}/act/designer/api/saveProcess",
data=encoded_data,
headers={
"X-Access-Token": token,
"X-Sign": "00000000000000000000000000000000",
"X-Tenant-Id": tenant_id,
"X-Timestamp": ts,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
method="POST"
)
resp = urllib.request.urlopen(req)
result = json.loads(resp.read().decode('utf-8'))
return result
```
## 3. 常见流程模式速查
### 模式A简单审批线性
```
开始 → 提交 → 审批 → 结束
```
### 模式B多级审批线性
```
开始 → 提交 → 经理审批 → 总监审批 → HR审批 → 结束
```
### 模式C条件分支排他网关
```
开始 → 提交 → 审批 → 网关
├─ 通过 → 下一步 → 结束
└─ 拒绝 → 结束
```
### 模式D金额条件分支
```
开始 → 提交 → 网关(金额判断)
├─ ≤1000 → 经理审批 → 结束
├─ ≤10000 → 总监审批 → 结束
└─ >10000 → CEO审批 → 结束
```
### 模式E并行会签
```
开始 → 提交 → 并行网关(fork)
├─ 部门A审批
└─ 部门B审批
并行网关(join) → 结束
```
### 模式F审批+驳回到发起人(草稿节点模式)
```
开始 → 草稿(自动跳过) → 审批 → 网关
├─ 通过 → 结束
└─ 驳回 → 草稿(发起人修改后重新提交)
```
**关键节点 XML**
```xml
<!-- 草稿节点:首次自动跳过,驳回后发起人手动操作 -->
<bpmn2:userTask id="task_draft" name="草稿" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&quot;sameMode&quot;:2,&quot;isSkipAssigneeEmpty&quot;:false,&quot;isSkipAssigneeOnePersion&quot;:false,&quot;isSkipApproval&quot;:false,&quot;isAssignedByPreviousNode&quot;:false,&quot;isEmptyAssignedByPreviousNode&quot;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<!-- 驳回连线:从网关回到草稿节点 -->
<bpmn2:sequenceFlow id="flow_reject" name="驳回" sourceRef="gateway_result" targetRef="task_draft">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 0}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
```
### 模式G多级审批 + 表达式审批人 + 上一节点指派(实战验证)
```
开始 → 申请人填写(草稿) → 部门负责人审批(表达式) → 分管领导审批(表达式) → 指派确认(上一节点指派) → 结束
```
**已验证成功的完整 Python 脚本f-string 方式构造 XML**
```python
import urllib.request
import urllib.parse
import json
import time
API_BASE = '{后端地址}'
TOKEN = '{X-Access-Token}'
ts = str(int(time.time() * 1000))
process_key = f'process_{ts}'
process_name = '车辆出差申请流程'
# 注意f-string 中 ${xxx} 写作 ${{xxx}}JSON 花括号也需 {{}}
bpmn_xml = f'''<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:flowable="http://flowable.org/bpmn"
id="sample-diagram"
targetNamespace="http://bpmn.io/schema/bpmn"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="{process_key}" name="{process_name}">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId" />
<bpmn2:userTask id="task_apply" name="申请人填写" flowable:assignee="${{applyUserId}}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value='{{"sameMode":2,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":false}}' />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="auto_submit_1" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<bpmn2:userTask id="task_dept_leader" name="部门负责人审批"
flowable:candidateUsers="${{flowNodeExecution.getDepartLeaders(execution)}}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value='{{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true}}' />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<bpmn2:userTask id="task_leader" name="分管领导审批"
flowable:candidateUsers="${{flowNodeExecution.getLevel1DepartLeaders(execution)}}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value='{{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true}}' />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<bpmn2:userTask id="task_dispatch" name="车辆调度确认">
<bpmn2:extensionElements>
<flowable:taskExtendJson value='{{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":true,"isEmptyAssignedByPreviousNode":false}}' />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<bpmn2:endEvent id="end" name="结束" />
<bpmn2:sequenceFlow id="flow_1" name="" sourceRef="start" targetRef="task_apply" />
<bpmn2:sequenceFlow id="flow_2" name="" sourceRef="task_apply" targetRef="task_dept_leader" />
<bpmn2:sequenceFlow id="flow_3" name="" sourceRef="task_dept_leader" targetRef="task_leader" />
<bpmn2:sequenceFlow id="flow_4" name="" sourceRef="task_leader" targetRef="task_dispatch" />
<bpmn2:sequenceFlow id="flow_5" name="" sourceRef="task_dispatch" targetRef="end" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="{process_key}">
<bpmndi:BPMNShape id="shape_start" bpmnElement="start">
<dc:Bounds x="200" y="30" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="207" y="73" width="22" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape_task_apply" bpmnElement="task_apply">
<dc:Bounds x="168" y="106" width="100" height="60" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape_task_dept_leader" bpmnElement="task_dept_leader">
<dc:Bounds x="168" y="206" width="100" height="60" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape_task_leader" bpmnElement="task_leader">
<dc:Bounds x="168" y="306" width="100" height="60" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape_task_dispatch" bpmnElement="task_dispatch">
<dc:Bounds x="168" y="406" width="100" height="60" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape_end" bpmnElement="end">
<dc:Bounds x="200" y="506" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="207" y="549" width="22" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge_flow_1" bpmnElement="flow_1">
<di:waypoint x="218" y="66" /><di:waypoint x="218" y="106" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge_flow_2" bpmnElement="flow_2">
<di:waypoint x="218" y="166" /><di:waypoint x="218" y="206" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge_flow_3" bpmnElement="flow_3">
<di:waypoint x="218" y="266" /><di:waypoint x="218" y="306" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge_flow_4" bpmnElement="flow_4">
<di:waypoint x="218" y="366" /><di:waypoint x="218" y="406" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge_flow_5" bpmnElement="flow_5">
<di:waypoint x="218" y="466" /><di:waypoint x="218" y="506" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>'''
nodes_str = 'id=task_apply###nodeName=申请人填写@@@id=task_dept_leader###nodeName=部门负责人审批@@@id=task_leader###nodeName=分管领导审批@@@id=task_dispatch###nodeName=车辆调度确认@@@'
data = {
'processDefinitionId': '0',
'processName': process_name,
'processkey': process_key,
'typeid': 'oa',
'lowAppId': '',
'params': '',
'nodes': nodes_str,
'processDescriptor': bpmn_xml,
'realProcDefId': '',
'startType': 'manual'
}
encoded_data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(
f'{API_BASE}/act/designer/api/saveProcess',
data=encoded_data,
headers={
'X-Access-Token': TOKEN,
'X-Sign': '00000000000000000000000000000000',
'X-Tenant-Id': '1',
'X-Timestamp': str(int(time.time() * 1000)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
method='POST'
)
resp = urllib.request.urlopen(req)
result = json.loads(resp.read().decode('utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
print(f'\\nProcess Key: {process_key}')
```
**实战要点:**
1. 此脚本必须先写入 `.py` 文件再执行(不能 `python3 -c` 内联bash 会展开 `${}` 导致报错)
2. f-string 中所有 `${xxx}` 都写作 `${{xxx}}`
3. taskExtendJson 的 `value` 用单引号包裹 JSONJSON 花括号用 `{{}}` 转义
4. 执行完毕后删除临时 `.py` 文件

View File

@@ -0,0 +1,125 @@
# 节点 ID 命名与图形布局规则
## 1. 节点 ID 命名规范
| 节点类型 | ID 前缀 | 示例 |
|----------|---------|------|
| 开始事件 | `start` | `start` |
| 结束事件 | `end` | `end` |
| 用户任务 | `task_` | `task_apply`, `task_manager`, `task_hr` |
| 排他网关 | `gateway_` | `gateway_result`, `gateway_amount` |
| 并行网关 | `pgw_` | `pgw_fork`, `pgw_join` |
| 连线 | `flow_` | `flow_1`, `flow_approve`, `flow_reject` |
## 2. 图形布局计算规则
### 2.1 尺寸常量
| 元素 | 宽度(width) | 高度(height) |
|------|------------|-------------|
| startEvent | 36 | 36 |
| endEvent | 36 | 36 |
| userTask | 100 | 60 |
| exclusiveGateway | 50 | 50 |
| parallelGateway | 50 | 50 |
### 2.2 布局策略 — 垂直主轴
所有节点沿 **垂直方向Y轴** 从上到下排列,中心线 X 固定。
**基准参数:**
- 主轴中心 X = `218`(所有节点以此为中心对齐)
- 起始 Y = `30`
- 节点间垂直间距 = `40`(节点底部到下一节点顶部的距离)
**计算公式:**
```python
CENTER_X = 218
START_Y = 30
VERTICAL_GAP = 40
# 节点尺寸
SIZES = {
"startEvent": {"w": 36, "h": 36},
"endEvent": {"w": 36, "h": 36},
"userTask": {"w": 100, "h": 60},
"exclusiveGateway": {"w": 50, "h": 50},
"parallelGateway": {"w": 50, "h": 50},
}
def layout_nodes(nodes):
"""计算每个节点的 Bounds (x, y, width, height)"""
y = START_Y
positions = []
for node in nodes:
size = SIZES[node["type"]]
x = CENTER_X - size["w"] / 2
positions.append({
"id": node["id"],
"x": x, "y": y,
"w": size["w"], "h": size["h"],
"center_x": CENTER_X,
"center_y": y + size["h"] / 2,
"bottom_y": y + size["h"]
})
y += size["h"] + VERTICAL_GAP
return positions
```
### 2.3 Shape XML 生成
```xml
<!-- startEvent / endEvent -->
<bpmndi:BPMNShape id="shape_{id}" bpmnElement="{id}">
<dc:Bounds x="{x}" y="{y}" width="{w}" height="{h}" />
<bpmndi:BPMNLabel>
<dc:Bounds x="{x+7}" y="{y+h+7}" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<!-- userTask -->
<bpmndi:BPMNShape id="shape_{id}" bpmnElement="{id}">
<dc:Bounds x="{x}" y="{y}" width="{w}" height="{h}" />
</bpmndi:BPMNShape>
<!-- gateway (isMarkerVisible="true" 用于排他网关) -->
<bpmndi:BPMNShape id="shape_{id}" bpmnElement="{id}" isMarkerVisible="true">
<dc:Bounds x="{x}" y="{y}" width="{w}" height="{h}" />
<bpmndi:BPMNLabel>
<dc:Bounds x="{x+w+10}" y="{center_y-7}" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
```
### 2.4 Edge XML 生成
**直线连接(垂直方向、上下相邻节点):**
```xml
<bpmndi:BPMNEdge id="edge_{flow_id}" bpmnElement="{flow_id}">
<di:waypoint x="{source.center_x}" y="{source.bottom_y}" />
<di:waypoint x="{target.center_x}" y="{target.y}" />
</bpmndi:BPMNEdge>
```
**分支连线(排他网关的非主路径,从右侧绕行):**
当网关有拒绝/回退路径需要连接到非相邻节点时,使用右侧绕行:
```xml
<bpmndi:BPMNEdge id="edge_{flow_id}" bpmnElement="{flow_id}">
<di:waypoint x="{gateway.center_x + 25}" y="{gateway.center_y}" />
<di:waypoint x="{gateway.center_x + 132}" y="{gateway.center_y}" />
<di:waypoint x="{gateway.center_x + 132}" y="{target.center_y}" />
<di:waypoint x="{target.center_x + target.w/2}" y="{target.center_y}" />
</bpmndi:BPMNEdge>
```
**并行分支连线(从左侧出发):**
```xml
<bpmndi:BPMNEdge id="edge_{flow_id}" bpmnElement="{flow_id}">
<di:waypoint x="{gateway.center_x - 25}" y="{gateway.center_y}" />
<di:waypoint x="{target.center_x - target.w/2 - 50}" y="{gateway.center_y}" />
<di:waypoint x="{target.center_x - target.w/2 - 50}" y="{target.center_y}" />
<di:waypoint x="{target.center_x - target.w/2}" y="{target.center_y}" />
</bpmndi:BPMNEdge>
```

View File

@@ -0,0 +1,325 @@
# 子流程与网关类型详解
## 1. 网关类型一览
| 用户描述 | BPMN 类型 | XML 元素 | 说明 |
|----------|----------|----------|------|
| 分支/条件判断/通过或拒绝 | 排他网关 | `exclusiveGateway` | 只走一条满足条件的路径 |
| 并行/同时 | 并行网关 | `parallelGateway` | 所有路径同时执行,全部完成后汇聚 |
| 包含/部分并行 | 包含网关 | `inclusiveGateway` | 满足条件的路径都走,全部完成后汇聚 |
> **注意:** JeecgBoot 设计器不支持事件网关eventBasedGateway实际只用上面三种。
---
## 2. 排他网关exclusiveGateway
只走一条路径,适用于"通过/拒绝"、"金额判断"等场景。
```xml
<bpmn2:exclusiveGateway id="gateway_result" name="审批结果" />
<!-- 条件连线 -->
<bpmn2:sequenceFlow id="flow_approve" name="通过" sourceRef="gateway_result" targetRef="task_next">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 1}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_reject" name="拒绝" sourceRef="gateway_result" targetRef="end">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 0}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
```
**BPMNShape** 排他网关需要 `isMarkerVisible="true"`
```xml
<bpmndi:BPMNShape id="shape_gateway" bpmnElement="gateway_result" isMarkerVisible="true">
<dc:Bounds x="715" y="205" width="50" height="50" />
</bpmndi:BPMNShape>
```
---
## 3. 并行网关parallelGateway
所有路径同时执行必须成对使用fork + join。连线**不需要条件表达式**。
```xml
<!-- 并行分支fork -->
<bpmn2:parallelGateway id="pgw_fork" name="并行开始" />
<!-- 并行任务 -->
<bpmn2:userTask id="task_a" name="部门A审批" flowable:assignee="admin" />
<bpmn2:userTask id="task_b" name="部门B审批" flowable:assignee="admin" />
<!-- 并行汇聚join -->
<bpmn2:parallelGateway id="pgw_join" name="并行汇聚" />
<!-- 连线(无条件) -->
<bpmn2:sequenceFlow id="flow_fork_a" sourceRef="pgw_fork" targetRef="task_a" />
<bpmn2:sequenceFlow id="flow_fork_b" sourceRef="pgw_fork" targetRef="task_b" />
<bpmn2:sequenceFlow id="flow_join_a" sourceRef="task_a" targetRef="pgw_join" />
<bpmn2:sequenceFlow id="flow_join_b" sourceRef="task_b" targetRef="pgw_join" />
```
---
## 4. 包含网关inclusiveGateway
满足条件的路径都会执行,也必须成对使用(分支 + 汇聚)。**连线需要条件表达式**。
### 4.1 基本用法(来自生产环境:包含网关测试)
```
开始 → 领取体检单 → 包含网关1分支
├─ 普通员工 (user_type=='1') → 常规体检 ──┐
├─ 全部 (user_type=='1'||'2') → 抽血化验 → 领取早餐 ──┤→ 包含网关2汇聚→ 结束
└─ 领导 (user_type=='2') → 深度体检 ──┘
```
```xml
<!-- 包含网关分支 -->
<bpmn2:inclusiveGateway id="igw_fork" name="包含网关分支" />
<!-- 带条件的连线 -->
<bpmn2:sequenceFlow id="flow_1" name="普通员工" sourceRef="igw_fork" targetRef="task_normal">
<bpmn2:conditionExpression xsi:type="tFormalExpression">${user_type=='1'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_2" name="全部" sourceRef="igw_fork" targetRef="task_blood">
<bpmn2:conditionExpression xsi:type="tFormalExpression">${user_type=='1' || user_type=='2'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_3" name="领导" sourceRef="igw_fork" targetRef="task_deep">
<bpmn2:conditionExpression xsi:type="tFormalExpression">${user_type=='2'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<!-- 包含网关汇聚 -->
<bpmn2:inclusiveGateway id="igw_join" name="包含网关汇聚" />
<!-- 所有分支汇聚到同一个网关 -->
<bpmn2:sequenceFlow id="flow_join_1" sourceRef="task_normal" targetRef="igw_join" />
<bpmn2:sequenceFlow id="flow_join_2" sourceRef="task_breakfast" targetRef="igw_join" />
<bpmn2:sequenceFlow id="flow_join_3" sourceRef="task_deep" targetRef="igw_join" />
```
### 4.2 包含网关 + 直通路径(来自生产环境:督办流程)
包含网关的一个分支可以直接连到汇聚网关(不经过任何任务),实现"无风险时跳过"的效果:
```
部门负责人审核 → 包含网关(分支)
├─ 有风险 (iz_danger=='1') → 风控审计负责 ──┐
├─ 有风险 (iz_danger=='1') → 部门分管领导 ──┤→ 包含网关(汇聚)→ 结束
└─ 无风险 (iz_danger=='0') ──────────────────┘
```
```xml
<bpmn2:inclusiveGateway id="Gateway_fork" />
<bpmn2:inclusiveGateway id="Gateway_join" />
<!-- 有风险:走两条并行路径 -->
<bpmn2:sequenceFlow id="flow_risk1" name="有风险" sourceRef="Gateway_fork" targetRef="task_audit">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger== '1' }</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_risk2" name="有风险" sourceRef="Gateway_fork" targetRef="task_leader">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger== '1' }</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<!-- 无风险:直接到汇聚网关 -->
<bpmn2:sequenceFlow id="flow_norisk" name="无风险" sourceRef="Gateway_fork" targetRef="Gateway_join">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger=='0'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<!-- 汇聚 -->
<bpmn2:sequenceFlow id="flow_j1" sourceRef="task_audit" targetRef="Gateway_join" />
<bpmn2:sequenceFlow id="flow_j2" sourceRef="task_leader" targetRef="Gateway_join" />
```
### 4.3 包含网关 vs 排他网关 vs 并行网关
| 特性 | 排他网关 | 并行网关 | 包含网关 |
|------|---------|---------|---------|
| 执行路径 | 只走1条 | 全部走 | 满足条件的都走 |
| 条件表达式 | 必需 | 不需要 | 必需 |
| 汇聚行为 | 等1个 | 等全部 | 等所有已激活的 |
| 适用场景 | 二选一/多选一 | 同时并行 | 条件并行 |
---
## 5. 内嵌子流程subProcess
内嵌子流程在主流程 XML 内部定义,拥有自己的开始和结束事件。适用于将一组相关节点打包为一个整体。
### 5.1 基本结构
```xml
<bpmn2:subProcess id="subprocess_1" name="审批子流程">
<bpmn2:incoming>Flow_in</bpmn2:incoming>
<bpmn2:outgoing>Flow_out</bpmn2:outgoing>
<!-- 子流程内部的开始事件 -->
<bpmn2:startEvent id="sub_start" />
<!-- 子流程内部的用户任务 -->
<bpmn2:userTask id="sub_task1" name="经理审批" flowable:assignee="admin" />
<bpmn2:userTask id="sub_task2" name="财务审批" flowable:candidateGroups="finance" />
<!-- 子流程内部的结束事件 -->
<bpmn2:endEvent id="sub_end" />
<!-- 子流程内部的连线 -->
<bpmn2:sequenceFlow id="sub_flow1" sourceRef="sub_start" targetRef="sub_task1" />
<bpmn2:sequenceFlow id="sub_flow2" sourceRef="sub_task1" targetRef="sub_task2" />
<bpmn2:sequenceFlow id="sub_flow3" sourceRef="sub_task2" targetRef="sub_end" />
</bpmn2:subProcess>
```
### 5.2 完整示例(来自生产环境:测试嵌套子流程)
```
开始 → 入职(admin) → [内嵌子流程: 开始 → 经理(qinfeng) → 财务(vue3角色) → 结束] → 人力(admin角色) → 结束
```
**布局说明:** 内嵌子流程在图形上展开显示(`isExpanded="true"`),需要为整个子流程框指定 Bounds。
```xml
<!-- 子流程 Shape展开模式 -->
<bpmndi:BPMNShape id="shape_subprocess" bpmnElement="subprocess_1" isExpanded="true">
<dc:Bounds x="280" y="45" width="650" height="185" />
</bpmndi:BPMNShape>
```
---
## 6. 调用子流程callActivity— 主子流程
调用子流程引用**另一个独立部署的流程定义**,主流程和子流程各自独立管理。
### 6.1 基本结构
```xml
<bpmn2:callActivity id="call_sub" name="调用子流程" calledElement="子流程的processKey">
<bpmn2:extensionElements>
<!-- 传入变量:主流程 → 子流程 -->
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<!-- 传出变量:子流程 → 主流程 -->
<flowable:out source="applyUserId" target="applyUserId" />
</bpmn2:extensionElements>
</bpmn2:callActivity>
```
### 6.2 必传变量
| 变量 | 方向 | 说明 |
|------|------|------|
| `applyUserId` | in + out | 流程发起人,子流程需要知道谁发起的 |
| `JG_LOCAL_PROCESS_ID``JG_SUB_MAIN_PROCESS_ID` | in | 主流程ID子流程需要关联回主流程 |
### 6.3 完整示例(来自生产环境:出差申请主子流程)
```
开始 → 主管领导 → 部门领导 → 排他网关
├─ 预支借款 (travel_expenses_type=='1') → 借款申请 → callActivity(调用joa_loan子流程) → 归档 → 结束
└─ 个人垫付 (travel_expenses_type=='2') → 归档 → 结束
```
```xml
<callActivity id="callSubProcess" name="" calledElement="joa_loan">
<extensionElements>
<flowable:in source="apply_no" target="id" />
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<flowable:out source="applyUserId" target="applyUserId" />
</extensionElements>
</callActivity>
```
---
## 7. 会签子流程callActivity + multiInstance
会签子流程 = 调用子流程 + 多实例循环。每个审批人各执行一次完整的子流程。
### 7.1 结构
```xml
<bpmn2:callActivity id="call_countersign" name="会签子流程" calledElement="子流程processKey">
<bpmn2:extensionElements>
<flowable:in source="assigneeUserId" target="assigneeUserId" />
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<flowable:out source="applyUserId" target="applyUserId" />
</bpmn2:extensionElements>
<!-- 多实例循环:每个审批人执行一次子流程 -->
<bpmn2:multiInstanceLoopCharacteristics
isSequential="true"
flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}"
flowable:elementVariable="assigneeUserId" />
</bpmn2:callActivity>
```
### 7.2 完整示例(来自生产环境:主流程会签主子流程)
```
开始 → 主流程经理审批(候选人) → callActivity(会签子流程, 顺序执行) → 主流程总监审批 → 结束
```
```xml
<callActivity id="callSubProcess" name="" calledElement="subflow">
<extensionElements>
<flowable:in source="assigneeUserId" target="assigneeUserId" />
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<flowable:out source="applyUserId" target="applyUserId" />
</extensionElements>
<multiInstanceLoopCharacteristics
isSequential="true"
flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}"
flowable:elementVariable="assigneeUserId" />
</callActivity>
```
**关键区别:**
- 普通子流程:没有 `multiInstanceLoopCharacteristics`,只执行一次
- 会签子流程:有 `multiInstanceLoopCharacteristics`,按 `assigneeUserIdList` 中的人数循环执行
---
## 8. 分支条件表达式配置
### 8.1 排他网关条件
排他网关的每条出线都需要条件表达式(除了默认路径):
```xml
<bpmn2:sequenceFlow id="flow_1" name="通过" sourceRef="gateway" targetRef="task_next">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 1}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
```
### 8.2 包含网关条件
包含网关的每条出线也需要条件表达式,可以多条同时满足:
```xml
<bpmn2:sequenceFlow id="flow_1" name="普通员工" sourceRef="igw" targetRef="task_a">
<bpmn2:conditionExpression xsi:type="tFormalExpression">${user_type=='1'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_2" name="全部" sourceRef="igw" targetRef="task_b">
<bpmn2:conditionExpression xsi:type="tFormalExpression">${user_type=='1' || user_type=='2'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
```
### 8.3 常用条件表达式写法
| 场景 | 表达式 |
|------|--------|
| 审批通过 | `${result == 1}` |
| 审批拒绝 | `${result == 0}` |
| 字段等于值 | `${field_name == 'value'}` |
| 字段不等于 | `${field_name != 'value'}` |
| 数值比较 | `${amount > 10000}` |
| 多条件 OR | `${type=='1' \|\| type=='2'}` |
| 多条件 AND | `${type=='1' && level=='high'}` |
| 布尔判断 | `${iz_danger == '1'}` |
> **注意:** `conditionExpression` 中使用 `xsi:type="tFormalExpression"`(排他网关)或 `xsi:type="bpmn2:tFormalExpression"`(新版设计器),两种都可用。

View File

@@ -0,0 +1,187 @@
# 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=执行监听器executionListener2=任务监听器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模块流程结束处理与平台核心同类名不同模块 |

View File

@@ -0,0 +1,41 @@
# BPMN 模板参考文档索引
本文档已拆分为多个子文件,方便维护和查阅。按需阅读对应文件:
| 文件 | 内容 | 使用场景 |
|------|------|---------|
| [bpmn-xml-skeleton.md](bpmn-xml-skeleton.md) | XML 骨架模板 + 基本节点模板 | 每次生成流程必读 |
| [bpmn-assignee-types.md](bpmn-assignee-types.md) | 7种审批人配置 + groupType速查 + 数据来源表 + 草稿节点 | 配置审批人时必读 |
| [bpmn-countersign.md](bpmn-countersign.md) | 会签配置(规则/人员类型/完整示例) | 需要会签时阅读 |
| [bpmn-task-extend.md](bpmn-task-extend.md) | taskExtendJson 配置 + 监听器汇总 | 配置节点行为时阅读 |
| [bpmn-layout.md](bpmn-layout.md) | 节点ID命名规范 + 图形布局计算规则 | 生成 XML 布局时必读 |
| [bpmn-examples.md](bpmn-examples.md) | 完整示例 + Python调用脚本 + 6种流程模式速查 | 参考模式和调用API |
| [bpmn-advanced.md](bpmn-advanced.md) | 条件表达式 + 抄送 + 按钮 + 服务任务 + API端点 | 高级配置时阅读 |
| [bpmn-subprocess-gateway.md](bpmn-subprocess-gateway.md) | 3种网关 + 内嵌子流程 + 调用子流程 + 会签子流程 | 子流程/网关时必读 |
| [bpmn-db-config.md](bpmn-db-config.md) | 4张配置数据库表 + node_config_json结构 | 数据库配置时阅读 |
## 生产环境 BPMN 示例文件
`references/example/` 目录下包含从生产环境导出的真实流程 BPMN XML 文件,可作为生成流程时的参考模板:
| 文件 | 流程类型 | 包含特性 |
|------|---------|---------|
| `合同付款审批单.bpmn` | 审批流程 | 多级审批 |
| `采购申请单.bpmn` | 审批流程 | 多级审批 |
| `用章申请建设.bpmn` | 审批流程 | 多级审批 |
| `车辆维修保养审批单.bpmn` | 审批流程 | 多级审批 |
| `档案查借阅审批表.bpmn` | 审批流程 | 多级审批 |
| `合同审批单.bpmn` | 审批流程 | 多级审批 |
| `顺序会签流程.bpmn` | 会签 | 顺序会签isSequential=true |
| `并行会签测试.bpmn` | 会签 | 并行会签isSequential=false |
| `借款申请(子流程).bpmn` | 子流程 | 被调用的子流程定义 |
| `出差申请(主子流程).bpmn` | 主子流程 | callActivity 调用子流程 |
| `督办流程.bpmn` | 包含网关 | inclusiveGateway + 条件分支 |
**使用方式:** 生成流程前,先阅读与目标流程最相似的示例文件,学习其节点结构、审批人配置、监听器写法和布局坐标,然后参照生成新流程。
## 推荐阅读顺序
**基本流程生成:** `bpmn-xml-skeleton.md``bpmn-assignee-types.md``bpmn-layout.md``bpmn-examples.md`
**高级功能:** `bpmn-subprocess-gateway.md``bpmn-countersign.md``bpmn-task-extend.md``bpmn-advanced.md``bpmn-db-config.md`

View File

@@ -0,0 +1,121 @@
# BPMN XML 骨架与基本节点模板
## 1. XML 骨架模板
所有生成的 BPMN XML 必须使用以下骨架:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:flowable="http://flowable.org/bpmn"
id="sample-diagram"
targetNamespace="http://bpmn.io/schema/bpmn"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="${PROCESS_KEY}" name="${PROCESS_NAME}">
<!-- 必需的监听器 -->
<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>
<!-- 节点定义区 -->
${NODES}
<!-- 连线定义区 -->
${SEQUENCE_FLOWS}
</bpmn2:process>
<!-- 图形布局区 -->
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="${PROCESS_KEY}">
${SHAPES_AND_EDGES}
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>
```
## 2. 节点 XML 模板
### 2.1 开始节点(必需)
```xml
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId" />
```
### 2.2 结束节点(必需)
**普通结束节点:**
```xml
<bpmn2:endEvent id="end" name="结束" />
```
**带监听器的结束节点(如需在结束时触发业务逻辑):**
```xml
<bpmn2:endEvent id="End_reject">
<bpmn2:extensionElements>
<flowable:executionListener expression="${myListener.onReject(execution)}" event="start" />
</bpmn2:extensionElements>
</bpmn2:endEvent>
```
> 一个流程可以有多个结束节点(如"同意结束"和"拒绝结束"各一个),每个可挂不同监听器。
### 2.3 用户任务userTask
```xml
<!-- 指定人 -->
<bpmn2:userTask id="task_xxx" name="节点名称" flowable:assignee="username" />
<!-- 候选人(多人) -->
<bpmn2:userTask id="task_xxx" name="节点名称" flowable:candidateUsers="user1,user2" />
<!-- 候选角色组 -->
<bpmn2:userTask id="task_xxx" name="节点名称" flowable:candidateGroups="roleCode" />
<!-- 表达式(动态) -->
<bpmn2:userTask id="task_xxx" name="节点名称" flowable:assignee="${variableName}" />
<!-- 发起人 -->
<bpmn2:userTask id="task_xxx" name="节点名称" flowable:assignee="${applyUserId}" />
```
### 2.4 排他网关exclusiveGateway
```xml
<bpmn2:exclusiveGateway id="gateway_xxx" name="网关名称" />
```
带条件的连线:
```xml
<bpmn2:sequenceFlow id="flow_xxx" name="通过" sourceRef="gateway_xxx" targetRef="task_yyy">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 1}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flow_xxx" name="拒绝" sourceRef="gateway_xxx" targetRef="end">
<bpmn2:conditionExpression xsi:type="tFormalExpression"><![CDATA[${result == 0}]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
```
### 2.5 并行网关parallelGateway
并行网关需要成对使用(分支 + 汇聚):
```xml
<!-- 并行分支 -->
<bpmn2:parallelGateway id="gateway_fork" name="并行开始" />
<!-- 并行汇聚 -->
<bpmn2:parallelGateway id="gateway_join" name="并行汇聚" />
```
### 2.6 普通连线sequenceFlow
```xml
<bpmn2:sequenceFlow id="flow_xxx" name="" sourceRef="nodeA" targetRef="nodeB" />
```

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="mainflow" name="主流程(会签主子流程)">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1568615412011" name="主流程经理审批" flowable:candidateUsers="zhoujf,admin" />
<userTask id="task1568615414124" name="主流程总监审批" flowable:assignee="admin" />
<callActivity id="callSubProcess1568615439083" name="" calledElement="subflow">
<extensionElements>
<flowable:in source="assigneeUserId" target="assigneeUserId" />
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<flowable:out source="applyUserId" target="applyUserId" />
</extensionElements>
<multiInstanceLoopCharacteristics flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId" />
</callActivity>
<sequenceFlow id="flow1568615431826" name="" sourceRef="start1" targetRef="task1568615412011" />
<sequenceFlow id="flow1568615434460" name="" sourceRef="task1568615414124" targetRef="end" />
<sequenceFlow id="flow1568615440940" name="" sourceRef="task1568615412011" targetRef="callSubProcess1568615439083" />
<sequenceFlow id="flow1568615449144" name="" sourceRef="callSubProcess1568615439083" targetRef="task1568615414124" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_mainflow">
<bpmndi:BPMNPlane id="BPMNPlane_mainflow" bpmnElement="mainflow">
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615449144" bpmnElement="flow1568615449144">
<omgdi:waypoint x="480" y="241" />
<omgdi:waypoint x="480" y="300" />
<omgdi:waypoint x="268" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615440940" bpmnElement="flow1568615440940">
<omgdi:waypoint x="265" y="160" />
<omgdi:waypoint x="480" y="160" />
<omgdi:waypoint x="480" y="211" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615434460" bpmnElement="flow1568615434460">
<omgdi:waypoint x="218" y="333" />
<omgdi:waypoint x="218" y="398" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615431826" bpmnElement="flow1568615431826">
<omgdi:waypoint x="215" y="79" />
<omgdi:waypoint x="215" y="128" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="200" y="49" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="203" y="398" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1568615412011" bpmnElement="task1568615412011">
<omgdc:Bounds x="170" y="133" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1568615414124" bpmnElement="task1568615414124">
<omgdc:Bounds x="173" y="273" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_callSubProcess1568615439083" bpmnElement="callSubProcess1568615439083">
<omgdc:Bounds x="465" y="211" width="30" height="30" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="joa_loan" name="借款申请(子流程)">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.SubProcessStartListener" event="start" id="64d675c1a3adcb514ea5f9835093c29b" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1554898063090" name="部门领导审批" flowable:assignee="admin" />
<userTask id="task1554898171984" name="会计审批" flowable:assignee="admin" />
<userTask id="task1554898182628" name="出纳放款" flowable:assignee="admin" />
<sequenceFlow id="flow1554898068323" name="" sourceRef="start1" targetRef="task1554898063090" />
<sequenceFlow id="flow1554898196767" name="" sourceRef="task1554898171984" targetRef="task1554898182628" />
<sequenceFlow id="flow1554898198653" name="" sourceRef="task1554898182628" targetRef="end" />
<sequenceFlow id="flow1554898455196" name="" sourceRef="task1554898063090" targetRef="task1554898171984" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_joa_loan">
<bpmndi:BPMNPlane id="BPMNPlane_joa_loan" bpmnElement="joa_loan">
<bpmndi:BPMNEdge id="BPMNEdge_flow1554898455196" bpmnElement="flow1554898455196">
<omgdi:waypoint x="358" y="142" />
<omgdi:waypoint x="406" y="142" />
<omgdi:waypoint x="406" y="141" />
<omgdi:waypoint x="454" y="141" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554898198653" bpmnElement="flow1554898198653">
<omgdi:waypoint x="746" y="141" />
<omgdi:waypoint x="786" y="141" />
<omgdi:waypoint x="786" y="142" />
<omgdi:waypoint x="825" y="142" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554898196767" bpmnElement="flow1554898196767">
<omgdi:waypoint x="544" y="141" />
<omgdi:waypoint x="656" y="141" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554898068323" bpmnElement="flow1554898068323">
<omgdi:waypoint x="175" y="142" />
<omgdi:waypoint x="268" y="142" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="145" y="127" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="138" y="157" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="825" y="127" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="818" y="157" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554898063090" bpmnElement="task1554898063090">
<omgdc:Bounds x="268" y="115" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554898171984" bpmnElement="task1554898171984">
<omgdc:Bounds x="454" y="114" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554898182628" bpmnElement="task1554898182628">
<omgdc:Bounds x="656" y="114" width="90" height="55" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="joa_bustrip" name="出差申请(主子流程)">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1554897424379" name="主管领导" flowable:assignee="admin" />
<userTask id="task1554897440265" name="部门领导" flowable:assignee="admin" />
<userTask id="task1554897494372" name="借款申请" flowable:assignee="${applyUserId}" />
<userTask id="task1554897568627" name="归档" flowable:assignee="admin" />
<exclusiveGateway id="exclusiveGateway1554897478398" name="" />
<callActivity id="callSubProcess1554897534417" name="" calledElement="joa_loan">
<extensionElements>
<flowable:in source="apply_no" target="id" />
<flowable:in source="applyUserId" target="applyUserId" />
<flowable:in source="JG_LOCAL_PROCESS_ID" target="JG_SUB_MAIN_PROCESS_ID" />
<flowable:out source="applyUserId" target="applyUserId" />
</extensionElements>
</callActivity>
<sequenceFlow id="flow1554897446155" name="" sourceRef="start1" targetRef="task1554897424379" />
<sequenceFlow id="flow1554897480649" name="" sourceRef="task1554897440265" targetRef="exclusiveGateway1554897478398" />
<sequenceFlow id="flow1554897483571" name="" sourceRef="task1554897424379" targetRef="task1554897440265" />
<sequenceFlow id="flow1554897522558" name="预支借款" sourceRef="exclusiveGateway1554897478398" targetRef="task1554897494372">
<conditionExpression xsi:type="tFormalExpression">${travel_expenses_type=='1'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1554897536153" name="" sourceRef="task1554897494372" targetRef="callSubProcess1554897534417" />
<sequenceFlow id="flow1554897581547" name="" sourceRef="callSubProcess1554897534417" targetRef="task1554897568627" />
<sequenceFlow id="flow1554897591480" name="" sourceRef="task1554897568627" targetRef="end" />
<sequenceFlow id="flow1554897613063" name="个人垫付" sourceRef="exclusiveGateway1554897478398" targetRef="task1554897568627">
<conditionExpression xsi:type="tFormalExpression">${travel_expenses_type=='2'}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_joa_bustrip">
<bpmndi:BPMNPlane id="BPMNPlane_joa_bustrip" bpmnElement="joa_bustrip">
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897613063" bpmnElement="flow1554897613063">
<omgdi:waypoint x="670" y="158" />
<omgdi:waypoint x="670" y="302" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="638" y="214" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897591480" bpmnElement="flow1554897591480">
<omgdi:waypoint x="625" y="329" />
<omgdi:waypoint x="477" y="329" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897581547" bpmnElement="flow1554897581547">
<omgdi:waypoint x="875" y="329" />
<omgdi:waypoint x="715" y="329" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897536153" bpmnElement="flow1554897536153">
<omgdi:waypoint x="890" y="266" />
<omgdi:waypoint x="890" y="314" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897522558" bpmnElement="flow1554897522558">
<omgdi:waypoint x="690" y="138" />
<omgdi:waypoint x="890" y="138" />
<omgdi:waypoint x="890" y="211" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="829" y="143" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897483571" bpmnElement="flow1554897483571">
<omgdi:waypoint x="305" y="138" />
<omgdi:waypoint x="405" y="138" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897480649" bpmnElement="flow1554897480649">
<omgdi:waypoint x="495" y="138" />
<omgdi:waypoint x="650" y="138" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554897446155" bpmnElement="flow1554897446155">
<omgdi:waypoint x="125" y="138" />
<omgdi:waypoint x="215" y="138" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="95" y="123" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="89" y="153" width="43" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="447" y="314" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="440" y="344" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554897424379" bpmnElement="task1554897424379">
<omgdc:Bounds x="215" y="111" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554897440265" bpmnElement="task1554897440265">
<omgdc:Bounds x="405" y="111" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554897494372" bpmnElement="task1554897494372">
<omgdc:Bounds x="845" y="211" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554897568627" bpmnElement="task1554897568627">
<omgdc:Bounds x="625" y="302" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_exclusiveGateway1554897478398" bpmnElement="exclusiveGateway1554897478398" isMarkerVisible="true">
<omgdc:Bounds x="650" y="118" width="40" height="40" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="631" y="80.5" width="85" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_callSubProcess1554897534417" bpmnElement="callSubProcess1554897534417">
<omgdc:Bounds x="875" y="314" width="30" height="30" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.com">
<process id="process1609125744738" name="包含网关测试">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1609125750431" name="领取体检单" flowable:assignee="admin" />
<userTask id="task1609125786551" name="常规体检" flowable:assignee="admin" />
<userTask id="task1609125793898" name="抽血化验" flowable:assignee="admin" />
<userTask id="task1609125799296" name="深度体检" flowable:assignee="admin" />
<userTask id="task1609125820935" name="领取早餐" flowable:assignee="admin" />
<inclusiveGateway id="inclusiveGateway1609125773518" name="" />
<inclusiveGateway id="inclusiveGateway1609125834234" name="" />
<sequenceFlow id="flow1609125751935" name="" sourceRef="start" targetRef="task1609125750431" />
<sequenceFlow id="flow1609125775311" name="" sourceRef="task1609125750431" targetRef="inclusiveGateway1609125773518" />
<sequenceFlow id="flow1609125788617" name="普通员工" sourceRef="inclusiveGateway1609125773518" targetRef="task1609125786551">
<conditionExpression xsi:type="tFormalExpression">${user_type=='1'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1609125802774" name="全部" sourceRef="inclusiveGateway1609125773518" targetRef="task1609125793898">
<conditionExpression xsi:type="tFormalExpression">${user_type=='1' || user_type=='2'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1609125805530" name="领导" sourceRef="inclusiveGateway1609125773518" targetRef="task1609125799296">
<conditionExpression xsi:type="tFormalExpression">${user_type=='2'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1609125822376" name="" sourceRef="task1609125793898" targetRef="task1609125820935" />
<sequenceFlow id="flow1609125836653" name="" sourceRef="task1609125786551" targetRef="inclusiveGateway1609125834234" />
<sequenceFlow id="flow1609125838174" name="" sourceRef="task1609125820935" targetRef="inclusiveGateway1609125834234" />
<sequenceFlow id="flow1609125840922" name="" sourceRef="task1609125799296" targetRef="inclusiveGateway1609125834234" />
<sequenceFlow id="flow1609125859731" name="" sourceRef="inclusiveGateway1609125834234" targetRef="end" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_process1609125744738">
<bpmndi:BPMNPlane id="BPMNPlane_process1609125744738" bpmnElement="process1609125744738">
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125859731" bpmnElement="flow1609125859731">
<omgdi:waypoint x="648" y="553" />
<omgdi:waypoint x="648" y="616" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125840922" bpmnElement="flow1609125840922">
<omgdi:waypoint x="839" y="404" />
<omgdi:waypoint x="839" y="533" />
<omgdi:waypoint x="668" y="533" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125838174" bpmnElement="flow1609125838174">
<omgdi:waypoint x="648" y="474" />
<omgdi:waypoint x="648" y="513" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125836653" bpmnElement="flow1609125836653">
<omgdi:waypoint x="468" y="401" />
<omgdi:waypoint x="468" y="533" />
<omgdi:waypoint x="628" y="533" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125822376" bpmnElement="flow1609125822376">
<omgdi:waypoint x="648" y="357" />
<omgdi:waypoint x="648" y="409" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125805530" bpmnElement="flow1609125805530">
<omgdi:waypoint x="668" y="218" />
<omgdi:waypoint x="839" y="218" />
<omgdi:waypoint x="839" y="339" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125802774" bpmnElement="flow1609125802774">
<omgdi:waypoint x="648" y="238" />
<omgdi:waypoint x="648" y="292" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125788617" bpmnElement="flow1609125788617">
<omgdi:waypoint x="628" y="218" />
<omgdi:waypoint x="468" y="218" />
<omgdi:waypoint x="468" y="336" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125775311" bpmnElement="flow1609125775311">
<omgdi:waypoint x="648" y="161" />
<omgdi:waypoint x="648" y="198" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1609125751935" bpmnElement="flow1609125751935">
<omgdi:waypoint x="648" y="58" />
<omgdi:waypoint x="648" y="96" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start" bpmnElement="start">
<omgdc:Bounds x="633" y="28" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="633" y="616" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1609125750431" bpmnElement="task1609125750431">
<omgdc:Bounds x="603" y="101" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1609125786551" bpmnElement="task1609125786551">
<omgdc:Bounds x="423" y="341" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1609125793898" bpmnElement="task1609125793898">
<omgdc:Bounds x="603" y="297" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1609125799296" bpmnElement="task1609125799296">
<omgdc:Bounds x="794" y="344" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1609125820935" bpmnElement="task1609125820935">
<omgdc:Bounds x="603" y="414" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_inclusiveGateway1609125773518" bpmnElement="inclusiveGateway1609125773518">
<omgdc:Bounds x="628" y="198" width="40" height="40" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_inclusiveGateway1609125834234" bpmnElement="inclusiveGateway1609125834234">
<omgdc:Bounds x="628" y="513" width="40" height="40" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,444 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1756775525804_Copy1773212842337" name="合同付款审批单(港口建设)">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_194ke75</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:exclusiveGateway id="Gateway_1hewqcs">
<bpmn2:incoming>Flow_1hfpycx</bpmn2:incoming>
<bpmn2:outgoing>Flow_1xvhzh0</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0305r4s</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="Task_0xmeul8" name="部门负责人意见1">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:true,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0z0d1ip</bpmn2:incoming>
<bpmn2:outgoing>Flow_0iht4oy</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1xvhzh0" name="拟稿部门为&#39;控股集团/天津临港建设开发有限公司/综合业务部&#39;" sourceRef="Gateway_1hewqcs" targetRef="Task_039xymg">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImluIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NjA5NjI4NDQ5MzIwODM3MTMifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_1mu35nc" name="请款部门负责人意见" flowable:candidateUsers="${flowNodeExecution.getDepartLeaders(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:4,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0305r4s</bpmn2:incoming>
<bpmn2:outgoing>Flow_1q3qzvz</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0305r4s" name="拟稿部门不为&#39;控股集团/天津临港建设开发有限公司/综合业务部&#39;" sourceRef="Gateway_1hewqcs" targetRef="Task_1mu35nc">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5vdF9pbiIsImZpZWxkIjoiYXBwbHlVc2VyRGVwdCIsImV4cGVjdGVkVmFsdWUiOiIxOTYwOTYyODQ0OTMyMDgzNzEzIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0dmir1x" name="合约审核" flowable:assignee="wangpinglikg">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0iht4oy</bpmn2:incoming>
<bpmn2:incoming>Flow_1q3qzvz</bpmn2:incoming>
<bpmn2:outgoing>Flow_1efh09l</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0iht4oy" sourceRef="Task_0xmeul8" targetRef="Task_0dmir1x" />
<bpmn2:sequenceFlow id="Flow_1q3qzvz" sourceRef="Task_1mu35nc" targetRef="Task_0dmir1x" />
<bpmn2:userTask id="Task_13o510x" name="合约部长意见" flowable:assignee="songzhenhuajs">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1efh09l</bpmn2:incoming>
<bpmn2:outgoing>Flow_19j5ppn</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1efh09l" sourceRef="Task_0dmir1x" targetRef="Task_13o510x" />
<bpmn2:userTask id="Task_19afnod" name="财务部审核" flowable:assignee="chenyuqinggx">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_19j5ppn</bpmn2:incoming>
<bpmn2:outgoing>Flow_0yojr3f</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_19j5ppn" sourceRef="Task_13o510x" targetRef="Task_19afnod" />
<bpmn2:userTask id="Task_0ov26ij" name="财务部部长意见" flowable:candidateGroups="1960962847985537025" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0yojr3f</bpmn2:incoming>
<bpmn2:outgoing>Flow_0dy83mm</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0yojr3f" sourceRef="Task_19afnod" targetRef="Task_0ov26ij" />
<bpmn2:userTask id="Task_1iv6eda" name="财务部分管意见" flowable:candidateGroups="1968884577609592833" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0dy83mm</bpmn2:incoming>
<bpmn2:outgoing>Flow_1yp3e5y</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0dy83mm" sourceRef="Task_0ov26ij" targetRef="Task_1iv6eda" />
<bpmn2:exclusiveGateway id="Gateway_1ol0mu2" name="财务部分管条件">
<bpmn2:incoming>Flow_1yp3e5y</bpmn2:incoming>
<bpmn2:outgoing>Flow_0lgv1a0</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1tjmne2</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1y9an67</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0suiubw</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="Task_0k698zx" name="分发分管" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1tjmne2</bpmn2:incoming>
<bpmn2:outgoing>Flow_1ttkksl</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_1lh31tb" name="请款分管(部长)" flowable:candidateUsers="${flowNodeExecution.getUserSuperPositionLevel1(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0suiubw</bpmn2:incoming>
<bpmn2:outgoing>Flow_1tmacbb</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0cemvm9" name="董事长意见" flowable:candidateGroups="1966071463369428994" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1y9an67</bpmn2:incoming>
<bpmn2:incoming>Flow_1xw77jf</bpmn2:incoming>
<bpmn2:incoming>Flow_1tmacbb</bpmn2:incoming>
<bpmn2:incoming>Flow_1skcnfe</bpmn2:incoming>
<bpmn2:outgoing>Flow_1vssh8x</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0wj5cc8" name="分发分管" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0lgv1a0</bpmn2:incoming>
<bpmn2:outgoing>Flow_0cr0plz</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_1cvoviy" name="归档" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0hq3im2</bpmn2:incoming>
<bpmn2:outgoing>Flow_09ydmz6</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0sjwgg6" name="财务出纳归档" flowable:assignee="lingyunlongjs">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_09ydmz6</bpmn2:incoming>
<bpmn2:outgoing>Flow_0cuolg2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_09ydmz6" sourceRef="Task_1cvoviy" targetRef="Task_0sjwgg6" />
<bpmn2:endEvent id="End_0zgs7h0">
<bpmn2:incoming>Flow_0cuolg2</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_0cuolg2" sourceRef="Task_0sjwgg6" targetRef="End_0zgs7h0" />
<bpmn2:userTask id="Task_0ho8mjr" name="请款分管领导意见1">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:true,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0cr0plz</bpmn2:incoming>
<bpmn2:outgoing>Flow_1xw77jf</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1yp3e5y" sourceRef="Task_1iv6eda" targetRef="Gateway_1ol0mu2" />
<bpmn2:sequenceFlow id="Flow_0lgv1a0" name="拟稿部门是 &#39;控股集团/天津临港建设开发有限公司/综合业务部&#39;" sourceRef="Gateway_1ol0mu2" targetRef="Task_0wj5cc8">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImluIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NjA5NjI4NDQ1NjI5ODQ5NjIsMTk2MDk2Mjg0NDkzMjA4MzcxMyJ9XX1d', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_1tjmne2" name="拟稿人职级不为“部长”;拟稿部门不是&#39;控股集团/天津临港建设开发有限公司/综合管理部、综合业务部&#39;" sourceRef="Gateway_1ol0mu2" targetRef="Task_0k698zx">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5vdF9jb250YWlucyIsImZpZWxkIjoiYXBwbHlVc2VyUG9zdExldmVsIiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NTg0NzA5MTIyMTQzNjgyNTgifSx7Im9wZXJhdG9yIjoibm90X2luIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NjA5NjI4NDQ1NjI5ODQ5NjIsMTk2MDk2Mjg0NDkzMjA4MzcxMywxOTYwOTYyODQ2NDUwNDIxNzYyIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_1y9an67" name="拟稿部门是 &#39;控股集团/天津临港建设开发有限公司/综合管理部&#39;" sourceRef="Gateway_1ol0mu2" targetRef="Task_0cemvm9">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImluIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NjA5NjI4NDY0NTA0MjE3NjIifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0suiubw" name="拟稿人职级是“部长”;拟稿部门不是&#39;控股集团/天津临港建设开发有限公司/综合管理部、综合业务部&#39;" sourceRef="Gateway_1ol0mu2" targetRef="Task_1lh31tb">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImNvbnRhaW5zIiwiZmllbGQiOiJhcHBseVVzZXJQb3N0TGV2ZWwiLCJleHBlY3RlZFZhbHVlIjoiMTk1ODQ3MDkxMjIxNDM2ODI1OCJ9LHsib3BlcmF0b3IiOiJub3RfaW4iLCJmaWVsZCI6ImFwcGx5VXNlckRlcHQiLCJleHBlY3RlZFZhbHVlIjoiMTk2MDk2Mjg0NDkzMjA4MzcxMywxOTYwOTYyODQ2NDUwNDIxNzYyIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0cr0plz" sourceRef="Task_0wj5cc8" targetRef="Task_0ho8mjr" />
<bpmn2:sequenceFlow id="Flow_1xw77jf" sourceRef="Task_0ho8mjr" targetRef="Task_0cemvm9" />
<bpmn2:sequenceFlow id="Flow_1tmacbb" sourceRef="Task_1lh31tb" targetRef="Task_0cemvm9" />
<bpmn2:userTask id="Task_1r80a8r" name="管理公司总经理意见" flowable:assignee="yuanfangjs">
<bpmn2:incoming>Flow_1vssh8x</bpmn2:incoming>
<bpmn2:outgoing>Flow_0gvx3zp</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1vssh8x" sourceRef="Task_0cemvm9" targetRef="Task_1r80a8r" />
<bpmn2:userTask id="Task_19muqhk" name="管理公司董事长意见" flowable:assignee="liushuchaozd">
<bpmn2:incoming>Flow_0gvx3zp</bpmn2:incoming>
<bpmn2:outgoing>Flow_0hq3im2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0gvx3zp" sourceRef="Task_1r80a8r" targetRef="Task_19muqhk" />
<bpmn2:sequenceFlow id="Flow_0hq3im2" sourceRef="Task_19muqhk" targetRef="Task_1cvoviy" />
<bpmn2:userTask id="Task_0de4dzb" name="请款分管领导意见">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:true,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1ttkksl</bpmn2:incoming>
<bpmn2:outgoing>Flow_1skcnfe</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1ttkksl" sourceRef="Task_0k698zx" targetRef="Task_0de4dzb" />
<bpmn2:sequenceFlow id="Flow_1skcnfe" sourceRef="Task_0de4dzb" targetRef="Task_0cemvm9" />
<bpmn2:userTask id="Task_0vdkqa0" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_194ke75</bpmn2:incoming>
<bpmn2:outgoing>Flow_1hfpycx</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_194ke75" sourceRef="start" targetRef="Task_0vdkqa0" />
<bpmn2:sequenceFlow id="Flow_1hfpycx" sourceRef="Task_0vdkqa0" targetRef="Gateway_1hewqcs" />
<bpmn2:userTask id="Task_039xymg" name="分发" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1xvhzh0</bpmn2:incoming>
<bpmn2:outgoing>Flow_0z0d1ip</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0z0d1ip" sourceRef="Task_039xymg" targetRef="Task_0xmeul8" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1756775525804_Copy1773212842337">
<bpmndi:BPMNEdge id="Flow_0z0d1ip_di" bpmnElement="Flow_0z0d1ip">
<di:waypoint x="420" y="30" />
<di:waypoint x="420" y="110" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hfpycx_di" bpmnElement="Flow_1hfpycx">
<di:waypoint x="210" y="230" />
<di:waypoint x="235" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_194ke75_di" bpmnElement="Flow_194ke75">
<di:waypoint x="68" y="230" />
<di:waypoint x="110" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1skcnfe_di" bpmnElement="Flow_1skcnfe">
<di:waypoint x="1350" y="220" />
<di:waypoint x="1350" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ttkksl_di" bpmnElement="Flow_1ttkksl">
<di:waypoint x="1180" y="200" />
<di:waypoint x="1180" y="180" />
<di:waypoint x="1300" y="180" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0hq3im2_di" bpmnElement="Flow_0hq3im2">
<di:waypoint x="1690" y="330" />
<di:waypoint x="1750" y="330" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0gvx3zp_di" bpmnElement="Flow_0gvx3zp">
<di:waypoint x="1540" y="330" />
<di:waypoint x="1590" y="330" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1vssh8x_di" bpmnElement="Flow_1vssh8x">
<di:waypoint x="1400" y="330" />
<di:waypoint x="1440" y="330" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1tmacbb_di" bpmnElement="Flow_1tmacbb">
<di:waypoint x="1235" y="440" />
<di:waypoint x="1350" y="440" />
<di:waypoint x="1350" y="370" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1xw77jf_di" bpmnElement="Flow_1xw77jf">
<di:waypoint x="1400" y="60" />
<di:waypoint x="1460" y="60" />
<di:waypoint x="1460" y="250" />
<di:waypoint x="1370" y="250" />
<di:waypoint x="1370" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0cr0plz_di" bpmnElement="Flow_0cr0plz">
<di:waypoint x="1230" y="60" />
<di:waypoint x="1300" y="60" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0suiubw_di" bpmnElement="Flow_0suiubw">
<di:waypoint x="865" y="130" />
<di:waypoint x="930" y="130" />
<di:waypoint x="930" y="440" />
<di:waypoint x="1125" y="440" />
<bpmndi:BPMNLabel>
<dc:Bounds x="985" y="360" width="89" height="80" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1y9an67_di" bpmnElement="Flow_1y9an67">
<di:waypoint x="865" y="130" />
<di:waypoint x="930" y="130" />
<di:waypoint x="930" y="330" />
<di:waypoint x="1300" y="330" />
<bpmndi:BPMNLabel>
<dc:Bounds x="985" y="273" width="89" height="53" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1tjmne2_di" bpmnElement="Flow_1tjmne2">
<di:waypoint x="865" y="130" />
<di:waypoint x="930" y="130" />
<di:waypoint x="930" y="240" />
<di:waypoint x="1130" y="240" />
<bpmndi:BPMNLabel>
<dc:Bounds x="985" y="153" width="89" height="93" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0lgv1a0_di" bpmnElement="Flow_0lgv1a0">
<di:waypoint x="840" y="105" />
<di:waypoint x="840" y="60" />
<di:waypoint x="1130" y="60" />
<bpmndi:BPMNLabel>
<dc:Bounds x="976" y="3" width="89" height="53" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1yp3e5y_di" bpmnElement="Flow_1yp3e5y">
<di:waypoint x="840" y="220" />
<di:waypoint x="840" y="155" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0cuolg2_di" bpmnElement="Flow_0cuolg2">
<di:waypoint x="1800" y="170" />
<di:waypoint x="1800" y="128" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_09ydmz6_di" bpmnElement="Flow_09ydmz6">
<di:waypoint x="1800" y="290" />
<di:waypoint x="1800" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0dy83mm_di" bpmnElement="Flow_0dy83mm">
<di:waypoint x="745" y="260" />
<di:waypoint x="790" y="260" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1446" y="212" width="89" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0yojr3f_di" bpmnElement="Flow_0yojr3f">
<di:waypoint x="695" y="170" />
<di:waypoint x="695" y="220" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1191" y="212" width="78" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_19j5ppn_di" bpmnElement="Flow_19j5ppn">
<di:waypoint x="590" y="130" />
<di:waypoint x="645" y="130" />
<bpmndi:BPMNLabel>
<dc:Bounds x="926" y="212" width="89" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1efh09l_di" bpmnElement="Flow_1efh09l">
<di:waypoint x="540" y="220" />
<di:waypoint x="540" y="170" />
<bpmndi:BPMNLabel>
<dc:Bounds x="667" y="212" width="86" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1q3qzvz_di" bpmnElement="Flow_1q3qzvz">
<di:waypoint x="420" y="300" />
<di:waypoint x="420" y="260" />
<di:waypoint x="490" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0iht4oy_di" bpmnElement="Flow_0iht4oy">
<di:waypoint x="420" y="190" />
<di:waypoint x="420" y="260" />
<di:waypoint x="490" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0305r4s_di" bpmnElement="Flow_0305r4s">
<di:waypoint x="260" y="255" />
<di:waypoint x="260" y="340" />
<di:waypoint x="370" y="340" />
<bpmndi:BPMNLabel>
<dc:Bounds x="265" y="283" width="89" height="53" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1xvhzh0_di" bpmnElement="Flow_1xvhzh0">
<di:waypoint x="260" y="205" />
<di:waypoint x="260" y="-10" />
<di:waypoint x="340" y="-10" />
<bpmndi:BPMNLabel>
<dc:Bounds x="149" y="43.000000000000284" width="81" height="53" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="32" y="212" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="39" y="255" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1hewqcs_di" bpmnElement="Gateway_1hewqcs" isMarkerVisible="true">
<dc:Bounds x="235" y="205" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="299" y="223" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0xmeul8_di" bpmnElement="Task_0xmeul8">
<dc:Bounds x="370" y="110" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mu35nc_di" bpmnElement="Task_1mu35nc">
<dc:Bounds x="370" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0dmir1x_di" bpmnElement="Task_0dmir1x">
<dc:Bounds x="490" y="220" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_13o510x_di" bpmnElement="Task_13o510x">
<dc:Bounds x="490" y="90" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_19afnod_di" bpmnElement="Task_19afnod">
<dc:Bounds x="645" y="90" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ov26ij_di" bpmnElement="Task_0ov26ij">
<dc:Bounds x="645" y="220" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1iv6eda_di" bpmnElement="Task_1iv6eda">
<dc:Bounds x="790" y="220" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1ol0mu2_di" bpmnElement="Gateway_1ol0mu2" isMarkerVisible="true">
<dc:Bounds x="815" y="105" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="727.5" y="123" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0k698zx_di" bpmnElement="Task_0k698zx">
<dc:Bounds x="1130" y="200" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1lh31tb_di" bpmnElement="Task_1lh31tb">
<dc:Bounds x="1125" y="400" width="110" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0cemvm9_di" bpmnElement="Task_0cemvm9">
<dc:Bounds x="1300" y="290" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wj5cc8_di" bpmnElement="Task_0wj5cc8">
<dc:Bounds x="1130" y="20" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1cvoviy_di" bpmnElement="Task_1cvoviy">
<dc:Bounds x="1750" y="290" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0sjwgg6_di" bpmnElement="Task_0sjwgg6">
<dc:Bounds x="1750" y="170" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0zgs7h0_di" bpmnElement="End_0zgs7h0">
<dc:Bounds x="1782" y="92" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ho8mjr_di" bpmnElement="Task_0ho8mjr">
<dc:Bounds x="1300" y="20" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1r80a8r_di" bpmnElement="Task_1r80a8r">
<dc:Bounds x="1440" y="290" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_19muqhk_di" bpmnElement="Task_19muqhk">
<dc:Bounds x="1590" y="290" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0de4dzb_di" bpmnElement="Task_0de4dzb">
<dc:Bounds x="1300" y="140" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0vdkqa0_di" bpmnElement="Task_0vdkqa0">
<dc:Bounds x="110" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_039xymg_di" bpmnElement="Task_039xymg">
<dc:Bounds x="350" y="-50" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,398 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1757598885161_Copy1769744302823" name="合同审批单(津保农科)">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_0yb0cn8</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="Task_0iow9ab" name="选择部长" flowable:assignee="${applyUserId}">
<bpmn2:incoming>Flow_1hbdhol</bpmn2:incoming>
<bpmn2:outgoing>Flow_1xbxp0f</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1og68yt</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:endEvent id="End_13hztj7">
<bpmn2:incoming>Flow_0gtibrb</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:userTask id="Task_1deyg2s" name="部门副部长" flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, &#39;1958470865577902082&#39;)}" flowable:groupType="position">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1xbxp0f</bpmn2:incoming>
<bpmn2:outgoing>Flow_0xvcnmm</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1xbxp0f" name="部门副部长" sourceRef="Task_0iow9ab" targetRef="Task_1deyg2s" />
<bpmn2:userTask id="Task_0bpjtwx" name="部门负责人" flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, &#39;1958470912214368258&#39;)}" flowable:groupType="position">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1og68yt</bpmn2:incoming>
<bpmn2:incoming>Flow_0xvcnmm</bpmn2:incoming>
<bpmn2:outgoing>Flow_0r60abv</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1og68yt" name="部门负责人" sourceRef="Task_0iow9ab" targetRef="Task_0bpjtwx" />
<bpmn2:sequenceFlow id="Flow_0xvcnmm" sourceRef="Task_1deyg2s" targetRef="Task_0bpjtwx" />
<bpmn2:userTask id="Task_0xx203f" name="成本采购部长" flowable:candidateGroups="1960962870865465345" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0r60abv</bpmn2:incoming>
<bpmn2:outgoing>Flow_1e5tjly</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0r60abv" sourceRef="Task_0bpjtwx" targetRef="Task_0xx203f" />
<bpmn2:userTask id="Task_0a0p4gn" name="法律顾问" flowable:candidateGroups="1960962862476857345" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1e5tjly</bpmn2:incoming>
<bpmn2:outgoing>Flow_05uouf2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1e5tjly" sourceRef="Task_0xx203f" targetRef="Task_0a0p4gn" />
<bpmn2:userTask id="Task_0g460ja" name="公司法务" flowable:assignee="sunjingyu">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_05uouf2</bpmn2:incoming>
<bpmn2:outgoing>Flow_0awgo05</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_05uouf2" sourceRef="Task_0a0p4gn" targetRef="Task_0g460ja" />
<bpmn2:userTask id="Task_075tij5" name="风控部长意见" flowable:candidateGroups="1962405428149764097" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0awgo05</bpmn2:incoming>
<bpmn2:outgoing>Flow_1q9efh1</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0awgo05" sourceRef="Task_0g460ja" targetRef="Task_075tij5" />
<bpmn2:userTask id="Task_17iuxyd" name="选择协办" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1q9efh1</bpmn2:incoming>
<bpmn2:outgoing>Flow_1o3qg32</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1sdeni7</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1q9efh1" sourceRef="Task_075tij5" targetRef="Task_17iuxyd" />
<bpmn2:userTask id="Task_1mx9pdx" name="协办主管意见" flowable:assignee="${assigneeUserId}" flowable:candidateUsers="${flowUtil.getUsersByFormData(execution,&#39;select_user_1757424592515_554890&#39;,&#39;select-user&#39;)}" flowable:groupType="formData" flowable:countersignRule="countersign_all">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskCountersignExtendJson value="eyJhdWRpdG9yVXNlclR5cGUiOiJmb3JtRGF0YSIsImF1ZGl0b3JDb3VudGVyc2lnbkZvcm1GaWVsZCI6InNlbGVjdF91c2VyXzE3NTc0MjQ1OTI1MTVfNTU0ODkwIiwiYXVkaXRvckNvdW50ZXJzaWduRm9ybUZpZWxkVHlwZSI6InNlbGVjdC11c2VyIiwidGltZXN0YW1wIjoxNzY5NzQzNzM2ODczfQ==" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1o3qg32</bpmn2:incoming>
<bpmn2:outgoing>Flow_0o6i6r8</bpmn2:outgoing>
<bpmn2:multiInstanceLoopCharacteristics flowable:collection="${flowUtil.getAssigneeUsers(execution,&#39;eyJhdWRpdG9yVXNlclR5cGUiOiJmb3JtRGF0YSIsImF1ZGl0b3JDb3VudGVyc2lnbkZvcm1GaWVsZCI6InNlbGVjdF91c2VyXzE3NTc0MjQ1OTI1MTVfNTU0ODkwIiwiYXVkaXRvckNvdW50ZXJzaWduRm9ybUZpZWxkVHlwZSI6InNlbGVjdC11c2VyIiwiZGVzZm9ybUNvZGUiOiJndW9qdS1oZV90b25nX3NoZW5fcGlfZGFuX2ppbmJhb3poaWtlIn0=&#39;)}" flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">${nrOfCompletedInstances/nrOfInstances==1}</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1o3qg32" name="协办主管" sourceRef="Task_17iuxyd" targetRef="Task_1mx9pdx" />
<bpmn2:userTask id="Task_19z078t" name="财务部长意见" flowable:candidateGroups="1960962863265386498" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1sdeni7</bpmn2:incoming>
<bpmn2:incoming>Flow_0o6i6r8</bpmn2:incoming>
<bpmn2:outgoing>Flow_12wit1t</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1sdeni7" name="财务部长" sourceRef="Task_17iuxyd" targetRef="Task_19z078t" />
<bpmn2:sequenceFlow id="Flow_0o6i6r8" sourceRef="Task_1mx9pdx" targetRef="Task_19z078t" />
<bpmn2:exclusiveGateway id="Gateway_1wx2g6v">
<bpmn2:incoming>Flow_12wit1t</bpmn2:incoming>
<bpmn2:outgoing>Flow_0otfktt</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1wblljm</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_12wit1t" sourceRef="Task_19z078t" targetRef="Gateway_1wx2g6v" />
<bpmn2:userTask id="Task_0ka84im" name="分管领导(员工)" flowable:candidateUsers="${flowNodeExecution.getUserSuperPositionLevel2(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0otfktt</bpmn2:incoming>
<bpmn2:outgoing>Flow_0bvgove</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0otfktt" name="拟稿人职位级别不是部长" sourceRef="Gateway_1wx2g6v" targetRef="Task_0ka84im">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5lIiwiZmllbGQiOiJhcHBseVVzZXJQb3N0TGV2ZWwiLCJleHBlY3RlZFZhbHVlIjoiMTk1ODQ3MDkxMjIxNDM2ODI1OCJ9XX1d', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_17lx9tw" name="分管领导(部长)" flowable:candidateUsers="${flowNodeExecution.getUserSuperPositionLevel1(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1wblljm</bpmn2:incoming>
<bpmn2:outgoing>Flow_0hnodme</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1wblljm" name="拟稿人职位级别是部长" sourceRef="Gateway_1wx2g6v" targetRef="Task_17lx9tw">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJhcHBseVVzZXJQb3N0TGV2ZWwiLCJleHBlY3RlZFZhbHVlIjoiMTk1ODQ3MDkxMjIxNDM2ODI1OCJ9XX1d', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_19h0git" name="成本采购副总" flowable:candidateGroups="1962787693681852417" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0bvgove</bpmn2:incoming>
<bpmn2:incoming>Flow_0hnodme</bpmn2:incoming>
<bpmn2:outgoing>Flow_0mut7pk</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0bvgove" sourceRef="Task_0ka84im" targetRef="Task_19h0git" />
<bpmn2:sequenceFlow id="Flow_0hnodme" sourceRef="Task_17lx9tw" targetRef="Task_19h0git" />
<bpmn2:userTask id="Task_0xvphxx" name="总经理意见" flowable:candidateGroups="1960962863860977666" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0mut7pk</bpmn2:incoming>
<bpmn2:outgoing>Flow_11emv9k</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0mut7pk" sourceRef="Task_19h0git" targetRef="Task_0xvphxx" />
<bpmn2:exclusiveGateway id="Gateway_01ih3l6">
<bpmn2:incoming>Flow_11emv9k</bpmn2:incoming>
<bpmn2:outgoing>Flow_1gq2o33</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0kso016</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_11emv9k" sourceRef="Task_0xvphxx" targetRef="Gateway_01ih3l6" />
<bpmn2:userTask id="Task_04yadz6" name="董事长意见" flowable:candidateGroups="1960962864179744770" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0kso016</bpmn2:incoming>
<bpmn2:outgoing>Flow_1nd4qv7</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0zkraig" name="通知拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:incoming>Flow_1gq2o33</bpmn2:incoming>
<bpmn2:incoming>Flow_1nd4qv7</bpmn2:incoming>
<bpmn2:outgoing>Flow_0gtibrb</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1gq2o33" name="合同金额小于等于1000000" sourceRef="Gateway_01ih3l6" targetRef="Task_0zkraig">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Imx0ZSIsImZpZWxkIjoibW9uZXlfMTc1NzQyMTQ3Mjc5N183NDYwMTYiLCJmaWVsZFR5cGUiOiJtb25leSIsImZpZWxkTmFtZSI6IuWQiOWQjOS7t+asvuWwj+WGmSIsImV4cGVjdGVkVmFsdWUiOiIxMDAwMDAwIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0kso016" name="合同金额大于1000000" sourceRef="Gateway_01ih3l6" targetRef="Task_04yadz6">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Imd0IiwiZmllbGQiOiJtb25leV8xNzU3NDIxNDcyNzk3Xzc0NjAxNiIsImZpZWxkVHlwZSI6Im1vbmV5IiwiZmllbGROYW1lIjoi5ZCI5ZCM5Lu35qy+5bCP5YaZIiwiZXhwZWN0ZWRWYWx1ZSI6IjEwMDAwMDAifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_1nd4qv7" sourceRef="Task_04yadz6" targetRef="Task_0zkraig" />
<bpmn2:sequenceFlow id="Flow_0gtibrb" sourceRef="Task_0zkraig" targetRef="End_13hztj7" />
<bpmn2:userTask id="Task_0z2ffc7" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0yb0cn8</bpmn2:incoming>
<bpmn2:outgoing>Flow_1hbdhol</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0yb0cn8" sourceRef="start" targetRef="Task_0z2ffc7" />
<bpmn2:sequenceFlow id="Flow_1hbdhol" sourceRef="Task_0z2ffc7" targetRef="Task_0iow9ab" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1757598885161_Copy1769744302823">
<bpmndi:BPMNEdge id="Flow_1hbdhol_di" bpmnElement="Flow_1hbdhol">
<di:waypoint x="330" y="230" />
<di:waypoint x="390" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0yb0cn8_di" bpmnElement="Flow_0yb0cn8">
<di:waypoint x="280" y="138" />
<di:waypoint x="280" y="190" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0gtibrb_di" bpmnElement="Flow_0gtibrb">
<di:waypoint x="300" y="650" />
<di:waypoint x="300" y="712" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1nd4qv7_di" bpmnElement="Flow_1nd4qv7">
<di:waypoint x="300" y="510" />
<di:waypoint x="300" y="570" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kso016_di" bpmnElement="Flow_0kso016">
<di:waypoint x="420" y="505" />
<di:waypoint x="420" y="470" />
<di:waypoint x="350" y="470" />
<bpmndi:BPMNLabel>
<dc:Bounds x="393" y="476" width="85" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1gq2o33_di" bpmnElement="Flow_1gq2o33">
<di:waypoint x="420" y="555" />
<di:waypoint x="420" y="610" />
<di:waypoint x="350" y="610" />
<bpmndi:BPMNLabel>
<dc:Bounds x="391" y="580" width="88" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_11emv9k_di" bpmnElement="Flow_11emv9k">
<di:waypoint x="500" y="530" />
<di:waypoint x="445" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0mut7pk_di" bpmnElement="Flow_0mut7pk">
<di:waypoint x="640" y="530" />
<di:waypoint x="600" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0hnodme_di" bpmnElement="Flow_0hnodme">
<di:waypoint x="810" y="610" />
<di:waypoint x="775" y="610" />
<di:waypoint x="775" y="530" />
<di:waypoint x="740" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0bvgove_di" bpmnElement="Flow_0bvgove">
<di:waypoint x="810" y="460" />
<di:waypoint x="775" y="460" />
<di:waypoint x="775" y="530" />
<di:waypoint x="740" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1wblljm_di" bpmnElement="Flow_1wblljm">
<di:waypoint x="950" y="555" />
<di:waypoint x="950" y="610" />
<di:waypoint x="910" y="610" />
<bpmndi:BPMNLabel>
<dc:Bounds x="927" y="580" width="76" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0otfktt_di" bpmnElement="Flow_0otfktt">
<di:waypoint x="950" y="505" />
<di:waypoint x="950" y="460" />
<di:waypoint x="910" y="460" />
<bpmndi:BPMNLabel>
<dc:Bounds x="912" y="476" width="76" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_12wit1t_di" bpmnElement="Flow_12wit1t">
<di:waypoint x="1020" y="530" />
<di:waypoint x="975" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0o6i6r8_di" bpmnElement="Flow_0o6i6r8">
<di:waypoint x="1190" y="610" />
<di:waypoint x="1165" y="610" />
<di:waypoint x="1165" y="530" />
<di:waypoint x="1120" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1sdeni7_di" bpmnElement="Flow_1sdeni7">
<di:waypoint x="1190" y="470" />
<di:waypoint x="1160" y="470" />
<di:waypoint x="1160" y="530" />
<di:waypoint x="1120" y="530" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1138" y="483" width="43" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1o3qg32_di" bpmnElement="Flow_1o3qg32">
<di:waypoint x="1240" y="510" />
<di:waypoint x="1240" y="570" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1217" y="537" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1q9efh1_di" bpmnElement="Flow_1q9efh1">
<di:waypoint x="1240" y="380" />
<di:waypoint x="1240" y="430" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0awgo05_di" bpmnElement="Flow_0awgo05">
<di:waypoint x="1130" y="340" />
<di:waypoint x="1190" y="340" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_05uouf2_di" bpmnElement="Flow_05uouf2">
<di:waypoint x="970" y="340" />
<di:waypoint x="1030" y="340" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1e5tjly_di" bpmnElement="Flow_1e5tjly">
<di:waypoint x="810" y="340" />
<di:waypoint x="870" y="340" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0r60abv_di" bpmnElement="Flow_0r60abv">
<di:waypoint x="660" y="340" />
<di:waypoint x="710" y="340" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0xvcnmm_di" bpmnElement="Flow_0xvcnmm">
<di:waypoint x="610" y="270" />
<di:waypoint x="610" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1og68yt_di" bpmnElement="Flow_1og68yt">
<di:waypoint x="490" y="230" />
<di:waypoint x="520" y="230" />
<di:waypoint x="520" y="340" />
<di:waypoint x="560" y="340" />
<bpmndi:BPMNLabel>
<dc:Bounds x="492" y="293" width="56" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1xbxp0f_di" bpmnElement="Flow_1xbxp0f">
<di:waypoint x="490" y="230" />
<di:waypoint x="560" y="230" />
<bpmndi:BPMNLabel>
<dc:Bounds x="498" y="212" width="54" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="262" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="268" y="78" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0iow9ab_di" bpmnElement="Task_0iow9ab">
<dc:Bounds x="390" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_13hztj7_di" bpmnElement="End_13hztj7">
<dc:Bounds x="282" y="712" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1deyg2s_di" bpmnElement="Task_1deyg2s">
<dc:Bounds x="560" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0bpjtwx_di" bpmnElement="Task_0bpjtwx">
<dc:Bounds x="560" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0xx203f_di" bpmnElement="Task_0xx203f">
<dc:Bounds x="710" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0a0p4gn_di" bpmnElement="Task_0a0p4gn">
<dc:Bounds x="870" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0g460ja_di" bpmnElement="Task_0g460ja">
<dc:Bounds x="1030" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_075tij5_di" bpmnElement="Task_075tij5">
<dc:Bounds x="1190" y="300" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_17iuxyd_di" bpmnElement="Task_17iuxyd">
<dc:Bounds x="1190" y="430" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mx9pdx_di" bpmnElement="Task_1mx9pdx">
<dc:Bounds x="1190" y="570" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_19z078t_di" bpmnElement="Task_19z078t">
<dc:Bounds x="1020" y="490" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1wx2g6v_di" bpmnElement="Gateway_1wx2g6v" isMarkerVisible="true">
<dc:Bounds x="925" y="505" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ka84im_di" bpmnElement="Task_0ka84im">
<dc:Bounds x="810" y="420" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_17lx9tw_di" bpmnElement="Task_17lx9tw">
<dc:Bounds x="810" y="570" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_19h0git_di" bpmnElement="Task_19h0git">
<dc:Bounds x="640" y="490" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0xvphxx_di" bpmnElement="Task_0xvphxx">
<dc:Bounds x="500" y="490" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_01ih3l6_di" bpmnElement="Gateway_01ih3l6" isMarkerVisible="true">
<dc:Bounds x="395" y="505" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_04yadz6_di" bpmnElement="Task_04yadz6">
<dc:Bounds x="250" y="430" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0zkraig_di" bpmnElement="Task_0zkraig">
<dc:Bounds x="250" y="570" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0z2ffc7_di" bpmnElement="Task_0z2ffc7">
<dc:Bounds x="230" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="subflow" name="子流程(会签主子流程)">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener" event="start" id="1177167770459070465" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1568615166625" name="子流程任务1" flowable:assignee="${assigneeUserId}" />
<userTask id="task1568615170581" name="子流程任务2" flowable:assignee="${assigneeUserId}" />
<sequenceFlow id="flow1568615185359" name="" sourceRef="start1" targetRef="task1568615166625" />
<sequenceFlow id="flow1568615187311" name="" sourceRef="task1568615166625" targetRef="task1568615170581" />
<sequenceFlow id="flow1568615188931" name="" sourceRef="task1568615170581" targetRef="end" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_subflow">
<bpmndi:BPMNPlane id="BPMNPlane_subflow" bpmnElement="subflow">
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615188931" bpmnElement="flow1568615188931">
<omgdi:waypoint x="220" y="343" />
<omgdi:waypoint x="220" y="394" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615187311" bpmnElement="flow1568615187311">
<omgdi:waypoint x="220" y="233" />
<omgdi:waypoint x="220" y="278" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1568615185359" bpmnElement="flow1568615185359">
<omgdi:waypoint x="220" y="98" />
<omgdi:waypoint x="220" y="168" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="205" y="68" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="205" y="394" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1568615166625" bpmnElement="task1568615166625">
<omgdc:Bounds x="175" y="173" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1568615170581" bpmnElement="task1568615170581">
<omgdc:Bounds x="175" y="283" width="90" height="55" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="joa_onl_bthuiq" name="并行会签测试">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1557561204791" name="选择会签人员" flowable:assignee="${applyUserId}" />
<userTask id="task1557561208150" name="会签审阅" flowable:assignee="${assigneeUserId}">
<multiInstanceLoopCharacteristics flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId" />
</userTask>
<sequenceFlow id="flow1557561259013" name="" sourceRef="start1" targetRef="task1557561204791" />
<sequenceFlow id="flow1557561260674" name="" sourceRef="task1557561204791" targetRef="task1557561208150" />
<sequenceFlow id="flow1557561265853" name="" sourceRef="task1557561208150" targetRef="end" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_joa_onl_bthuiq">
<bpmndi:BPMNPlane id="BPMNPlane_joa_onl_bthuiq" bpmnElement="joa_onl_bthuiq">
<bpmndi:BPMNEdge id="BPMNEdge_flow1557561265853" bpmnElement="flow1557561265853">
<omgdi:waypoint x="215" y="337" />
<omgdi:waypoint x="215" y="400" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1557561260674" bpmnElement="flow1557561260674">
<omgdi:waypoint x="215" y="206" />
<omgdi:waypoint x="215" y="272" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1557561259013" bpmnElement="flow1557561259013">
<omgdi:waypoint x="215" y="80" />
<omgdi:waypoint x="215" y="141" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="200" y="50" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="200" y="400" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1557561204791" bpmnElement="task1557561204791">
<omgdc:Bounds x="170" y="146" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1557561208150" bpmnElement="task1557561208150">
<omgdc:Bounds x="170" y="277" width="90" height="55" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,283 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1770171465054" name="档案查借阅审批表财务_津保建工">
<bpmn2:documentation>辛圣-488</bpmn2:documentation>
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_1lfex13</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:exclusiveGateway id="Gateway_0iodhu1" name="拟稿人部门判断">
<bpmn2:incoming>Flow_1oy9cwp</bpmn2:incoming>
<bpmn2:outgoing>Flow_1ukgpce</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1p7q68w</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="Task_1axmobm" name="部长" flowable:candidateUsers="${flowNodeExecution.getDepartLeaders(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1ukgpce</bpmn2:incoming>
<bpmn2:outgoing>Flow_00sne96</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1ukgpce" name="不等于财务部" sourceRef="Gateway_0iodhu1" targetRef="Task_1axmobm">
<bpmn2:documentation>拟稿部门 不等于 '控股集团/天津临港建设开发有限公司/财务部' AND 拟稿部门 不等于 '控股集团/天津临港建设开发有限公司/综合业务部'</bpmn2:documentation>
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5lIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjIwMDQwNzQ4NzgxNTg0MzQzMDUifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0q5x40k" name="财务部长审批" flowable:candidateGroups="2004447454765576194" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1p7q68w</bpmn2:incoming>
<bpmn2:incoming>Flow_1oazprh</bpmn2:incoming>
<bpmn2:incoming>Flow_1hz4oth</bpmn2:incoming>
<bpmn2:outgoing>Flow_0txpi3x</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1p7q68w" name="等于财务部中心" sourceRef="Gateway_0iodhu1" targetRef="Task_0q5x40k">
<bpmn2:documentation>拟稿人是财务部</bpmn2:documentation>
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjIwMDQwNzQ4NzgxNTg0MzQzMDUifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0u5r15n" name="综合管理部分管领导" flowable:candidateGroups="2004447105202712577" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1442ka9</bpmn2:incoming>
<bpmn2:outgoing>Flow_1hz4oth</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0s10sxf" name="分管领导" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;2004720656484859905&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0vc1pbk</bpmn2:incoming>
<bpmn2:outgoing>Flow_1oazprh</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_00sne96" sourceRef="Task_1axmobm" targetRef="Gateway_04s5k5c" />
<bpmn2:sequenceFlow id="Flow_1oazprh" sourceRef="Task_0s10sxf" targetRef="Task_0q5x40k" />
<bpmn2:sequenceFlow id="Flow_1hz4oth" sourceRef="Task_0u5r15n" targetRef="Task_0q5x40k" />
<bpmn2:userTask id="Task_0b2oy6g" name="财务分管领导" flowable:candidateGroups="2004447353945911297" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0txpi3x</bpmn2:incoming>
<bpmn2:outgoing>Flow_1le9mul</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0txpi3x" sourceRef="Task_0q5x40k" targetRef="Task_0b2oy6g" />
<bpmn2:userTask id="Task_0et8d23" name="总经理" flowable:candidateGroups="2004447190382993410" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_16asn4s</bpmn2:incoming>
<bpmn2:outgoing>Flow_09oe88o</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0kjzelu" name="档案管理员" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;2032291035773501441&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_09oe88o</bpmn2:incoming>
<bpmn2:incoming>Flow_0sof4uo</bpmn2:incoming>
<bpmn2:outgoing>Flow_0uf4o1g</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_09oe88o" sourceRef="Task_0et8d23" targetRef="Task_0kjzelu" />
<bpmn2:userTask id="Task_01bwpxc" name="通知拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0uf4o1g</bpmn2:incoming>
<bpmn2:outgoing>Flow_0pe9z7z</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0uf4o1g" sourceRef="Task_0kjzelu" targetRef="Task_01bwpxc" />
<bpmn2:endEvent id="End_1l91ykf">
<bpmn2:incoming>Flow_0pe9z7z</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_0pe9z7z" sourceRef="Task_01bwpxc" targetRef="End_1l91ykf" />
<bpmn2:userTask id="Task_1bvodcd" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1lfex13</bpmn2:incoming>
<bpmn2:outgoing>Flow_1oy9cwp</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1lfex13" sourceRef="start" targetRef="Task_1bvodcd" />
<bpmn2:sequenceFlow id="Flow_1oy9cwp" sourceRef="Task_1bvodcd" targetRef="Gateway_0iodhu1" />
<bpmn2:exclusiveGateway id="Gateway_05hr90o">
<bpmn2:incoming>Flow_1le9mul</bpmn2:incoming>
<bpmn2:outgoing>Flow_16asn4s</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0sof4uo</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_1le9mul" sourceRef="Task_0b2oy6g" targetRef="Gateway_05hr90o" />
<bpmn2:sequenceFlow id="Flow_16asn4s" name="借阅" sourceRef="Gateway_05hr90o" targetRef="Task_0et8d23">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJzZWxlY3RfMTc1NjQyODcxOTk5OV83OTc0NDgiLCJmaWVsZFR5cGUiOiJzZWxlY3QiLCJmaWVsZE5hbWUiOiLnsbvlnosiLCJleHBlY3RlZFZhbHVlIjoi5YCf6ZiFIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0sof4uo" name="查阅" sourceRef="Gateway_05hr90o" targetRef="Task_0kjzelu">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJzZWxlY3RfMTc1NjQyODcxOTk5OV83OTc0NDgiLCJmaWVsZFR5cGUiOiJzZWxlY3QiLCJmaWVsZE5hbWUiOiLnsbvlnosiLCJleHBlY3RlZFZhbHVlIjoi5p+l6ZiFIn1dfV0=', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway id="Gateway_04s5k5c" name="部门判断">
<bpmn2:incoming>Flow_00sne96</bpmn2:incoming>
<bpmn2:outgoing>Flow_1442ka9</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0vc1pbk</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_1442ka9" name="等于综合管理部" sourceRef="Gateway_04s5k5c" targetRef="Task_0u5r15n">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjE5NjA5NjI4NDQ5MzIwODM3MTMifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0vc1pbk" name="不等于综合管理部" sourceRef="Gateway_04s5k5c" targetRef="Task_0s10sxf">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5lIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjIwMDQwNzQ4MTg0NTY3MTExNzAifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1770171465054">
<bpmndi:BPMNEdge id="Flow_0vc1pbk_di" bpmnElement="Flow_0vc1pbk">
<di:waypoint x="440" y="205" />
<di:waypoint x="440" y="160" />
<di:waypoint x="720" y="160" />
<di:waypoint x="720" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="536" y="142" width="88" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1442ka9_di" bpmnElement="Flow_1442ka9">
<di:waypoint x="465" y="230" />
<di:waypoint x="580" y="230" />
<di:waypoint x="580" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="484" y="212" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0sof4uo_di" bpmnElement="Flow_0sof4uo">
<di:waypoint x="810" y="445" />
<di:waypoint x="810" y="350" />
<di:waypoint x="930" y="350" />
<bpmndi:BPMNLabel>
<dc:Bounds x="819" y="393" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16asn4s_di" bpmnElement="Flow_16asn4s">
<di:waypoint x="835" y="470" />
<di:waypoint x="930" y="470" />
<bpmndi:BPMNLabel>
<dc:Bounds x="869" y="443" width="21" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1le9mul_di" bpmnElement="Flow_1le9mul">
<di:waypoint x="750" y="470" />
<di:waypoint x="785" y="470" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oy9cwp_di" bpmnElement="Flow_1oy9cwp">
<di:waypoint x="30" y="230" />
<di:waypoint x="75" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1lfex13_di" bpmnElement="Flow_1lfex13">
<di:waypoint x="-20" y="312" />
<di:waypoint x="-20" y="270" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pe9z7z_di" bpmnElement="Flow_0pe9z7z">
<di:waypoint x="1030" y="230" />
<di:waypoint x="1062" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0uf4o1g_di" bpmnElement="Flow_0uf4o1g">
<di:waypoint x="980" y="310" />
<di:waypoint x="980" y="270" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_09oe88o_di" bpmnElement="Flow_09oe88o">
<di:waypoint x="980" y="430" />
<di:waypoint x="980" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0txpi3x_di" bpmnElement="Flow_0txpi3x">
<di:waypoint x="460" y="470" />
<di:waypoint x="650" y="470" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hz4oth_di" bpmnElement="Flow_1hz4oth">
<di:waypoint x="580" y="360" />
<di:waypoint x="580" y="400" />
<di:waypoint x="430" y="400" />
<di:waypoint x="430" y="430" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oazprh_di" bpmnElement="Flow_1oazprh">
<di:waypoint x="720" y="360" />
<di:waypoint x="720" y="400" />
<di:waypoint x="430" y="400" />
<di:waypoint x="430" y="430" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_00sne96_di" bpmnElement="Flow_00sne96">
<di:waypoint x="350" y="230" />
<di:waypoint x="415" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1p7q68w_di" bpmnElement="Flow_1p7q68w">
<di:waypoint x="100" y="255" />
<di:waypoint x="100" y="470" />
<di:waypoint x="360" y="470" />
<bpmndi:BPMNLabel>
<dc:Bounds x="207" y="443" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ukgpce_di" bpmnElement="Flow_1ukgpce">
<di:waypoint x="125" y="230" />
<di:waypoint x="250" y="230" />
<bpmndi:BPMNLabel>
<dc:Bounds x="156" y="212" width="66" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="-38" y="312" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="-31" y="355" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0iodhu1_di" bpmnElement="Gateway_0iodhu1" isMarkerVisible="true">
<dc:Bounds x="75" y="205" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="62" y="181" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1axmobm_di" bpmnElement="Task_1axmobm">
<dc:Bounds x="250" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0q5x40k_di" bpmnElement="Task_0q5x40k">
<dc:Bounds x="360" y="430" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0u5r15n_di" bpmnElement="Task_0u5r15n">
<dc:Bounds x="530" y="280" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0s10sxf_di" bpmnElement="Task_0s10sxf">
<dc:Bounds x="670" y="280" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0b2oy6g_di" bpmnElement="Task_0b2oy6g">
<dc:Bounds x="650" y="430" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0et8d23_di" bpmnElement="Task_0et8d23">
<dc:Bounds x="930" y="430" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0kjzelu_di" bpmnElement="Task_0kjzelu">
<dc:Bounds x="930" y="310" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_01bwpxc_di" bpmnElement="Task_01bwpxc">
<dc:Bounds x="930" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1l91ykf_di" bpmnElement="End_1l91ykf">
<dc:Bounds x="1062" y="212" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1bvodcd_di" bpmnElement="Task_1bvodcd">
<dc:Bounds x="-70" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_05hr90o_di" bpmnElement="Gateway_05hr90o" isMarkerVisible="true">
<dc:Bounds x="785" y="445" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_04s5k5c_di" bpmnElement="Gateway_04s5k5c" isMarkerVisible="true">
<dc:Bounds x="415" y="205" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="418" y="181" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,299 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1757312337590_Copy1770686679981" name="用章申请建设(测试)">
<bpmn2:documentation>辛圣-494</bpmn2:documentation>
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_0sye7h6</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="Task_076yim1" name="财务部部长" flowable:candidateGroups="1960962847985537025" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:true,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0zje6mx</bpmn2:incoming>
<bpmn2:outgoing>Flow_0t1dicm</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0q5k3ss" name="财务部分管领导" flowable:candidateGroups="1960962848656625665" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0lcmkhr" name="总经理1" flowable:candidateGroups="1960962848568545281" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1taf8qs</bpmn2:incoming>
<bpmn2:outgoing>Flow_1a6f0q0</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0c54gz0" name="董事长" flowable:candidateGroups="1960962848744706050" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1gr9954</bpmn2:incoming>
<bpmn2:outgoing>Flow_0pv1dn1</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0q2j4cs" name="财务管理中心负责人" flowable:candidateGroups="1961318320341422081" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:outgoing>Flow_0m6zmyi</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_1p5kogt" name="控股财务分管领导" flowable:candidateGroups="1960962855795331073" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0m6zmyi</bpmn2:incoming>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0m6zmyi" sourceRef="Task_0q2j4cs" targetRef="Task_1p5kogt" />
<bpmn2:userTask id="Task_1o5iu31" name="通知拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1nj1flm</bpmn2:incoming>
<bpmn2:incoming>Flow_0pv1dn1</bpmn2:incoming>
<bpmn2:incoming>Flow_1a6f0q0</bpmn2:incoming>
<bpmn2:outgoing>Flow_1avwi93</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:endEvent id="End_0038yc9">
<bpmn2:incoming>Flow_1avwi93</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_1avwi93" sourceRef="Task_1o5iu31" targetRef="End_0038yc9" />
<bpmn2:userTask id="Task_10tyj1y" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0sye7h6</bpmn2:incoming>
<bpmn2:outgoing>Flow_14r6jea</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0sye7h6" sourceRef="start" targetRef="Task_10tyj1y" />
<bpmn2:userTask id="Task_09us30l" name="部门负责人" />
<bpmn2:userTask id="Task_1g0ku03" name="分管领导1">
<bpmn2:incoming>Flow_1cuat3d</bpmn2:incoming>
<bpmn2:outgoing>Flow_1taf8qs</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="Gateway_0re23c5" name="是否需要法律顾问">
<bpmn2:incoming>Flow_14r6jea</bpmn2:incoming>
<bpmn2:outgoing>Flow_1dmn5sk</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0ertfyv</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_14r6jea" sourceRef="Task_10tyj1y" targetRef="Gateway_0re23c5" />
<bpmn2:userTask id="Task_1k7tqhu" name="法律顾问">
<bpmn2:incoming>Flow_1dmn5sk</bpmn2:incoming>
<bpmn2:outgoing>Flow_1fejo5s</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1dmn5sk" name="是" sourceRef="Gateway_0re23c5" targetRef="Task_1k7tqhu" />
<bpmn2:exclusiveGateway id="Gateway_04mzo8k" name="用章类型">
<bpmn2:incoming>Flow_04klp00</bpmn2:incoming>
<bpmn2:outgoing>Flow_1cuat3d</bpmn2:outgoing>
<bpmn2:outgoing>Flow_16xz1k0</bpmn2:outgoing>
<bpmn2:outgoing>Flow_1nj1flm</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0zje6mx</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="Task_00fvrl8" name="部长">
<bpmn2:incoming>Flow_0ertfyv</bpmn2:incoming>
<bpmn2:incoming>Flow_1fejo5s</bpmn2:incoming>
<bpmn2:outgoing>Flow_04klp00</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0ertfyv" sourceRef="Gateway_0re23c5" targetRef="Task_00fvrl8" />
<bpmn2:sequenceFlow id="Flow_1fejo5s" sourceRef="Task_1k7tqhu" targetRef="Task_00fvrl8" />
<bpmn2:sequenceFlow id="Flow_04klp00" sourceRef="Task_00fvrl8" targetRef="Gateway_04mzo8k" />
<bpmn2:sequenceFlow id="Flow_1cuat3d" name="公章" sourceRef="Gateway_04mzo8k" targetRef="Task_1g0ku03" />
<bpmn2:sequenceFlow id="Flow_16xz1k0" name="法人章" sourceRef="Gateway_04mzo8k" targetRef="Task_1t7oi9c" />
<bpmn2:sequenceFlow id="Flow_1nj1flm" name="部门章" sourceRef="Gateway_04mzo8k" targetRef="Task_1o5iu31" />
<bpmn2:sequenceFlow id="Flow_0zje6mx" name="财务章" sourceRef="Gateway_04mzo8k" targetRef="Task_076yim1" />
<bpmn2:sequenceFlow id="Flow_1taf8qs" sourceRef="Task_1g0ku03" targetRef="Task_0lcmkhr" />
<bpmn2:userTask id="Task_1t7oi9c" name="分管领导2">
<bpmn2:incoming>Flow_16xz1k0</bpmn2:incoming>
<bpmn2:outgoing>Flow_1jbmurf</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_1rfaocq" name="总经理2">
<bpmn2:incoming>Flow_1jbmurf</bpmn2:incoming>
<bpmn2:outgoing>Flow_1gr9954</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1jbmurf" sourceRef="Task_1t7oi9c" targetRef="Task_1rfaocq" />
<bpmn2:userTask id="Task_15d69it" name="财务部分管领导">
<bpmn2:incoming>Flow_0t1dicm</bpmn2:incoming>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0t1dicm" sourceRef="Task_076yim1" targetRef="Task_15d69it" />
<bpmn2:sequenceFlow id="Flow_1gr9954" sourceRef="Task_1rfaocq" targetRef="Task_0c54gz0" />
<bpmn2:sequenceFlow id="Flow_0pv1dn1" sourceRef="Task_0c54gz0" targetRef="Task_1o5iu31" />
<bpmn2:sequenceFlow id="Flow_1a6f0q0" sourceRef="Task_0lcmkhr" targetRef="Task_1o5iu31" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1757312337590_Copy1770686679981">
<bpmndi:BPMNEdge id="Flow_1a6f0q0_di" bpmnElement="Flow_1a6f0q0">
<di:waypoint x="730" y="50" />
<di:waypoint x="980" y="50" />
<di:waypoint x="980" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pv1dn1_di" bpmnElement="Flow_0pv1dn1">
<di:waypoint x="890" y="160" />
<di:waypoint x="930" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1gr9954_di" bpmnElement="Flow_1gr9954">
<di:waypoint x="730" y="160" />
<di:waypoint x="790" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0t1dicm_di" bpmnElement="Flow_0t1dicm">
<di:waypoint x="570" y="280" />
<di:waypoint x="630" y="280" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1jbmurf_di" bpmnElement="Flow_1jbmurf">
<di:waypoint x="570" y="160" />
<di:waypoint x="630" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1taf8qs_di" bpmnElement="Flow_1taf8qs">
<di:waypoint x="570" y="50" />
<di:waypoint x="630" y="50" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0zje6mx_di" bpmnElement="Flow_0zje6mx">
<di:waypoint x="100" y="255" />
<di:waypoint x="100" y="280" />
<di:waypoint x="470" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="292" y="265" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1nj1flm_di" bpmnElement="Flow_1nj1flm">
<di:waypoint x="100" y="255" />
<di:waypoint x="100" y="350" />
<di:waypoint x="980" y="350" />
<di:waypoint x="980" y="200" />
<bpmndi:BPMNLabel>
<dc:Bounds x="127" y="332" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16xz1k0_di" bpmnElement="Flow_16xz1k0">
<di:waypoint x="100" y="205" />
<di:waypoint x="100" y="160" />
<di:waypoint x="470" y="160" />
<bpmndi:BPMNLabel>
<dc:Bounds x="239" y="143" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1cuat3d_di" bpmnElement="Flow_1cuat3d">
<di:waypoint x="100" y="205" />
<di:waypoint x="100" y="50" />
<di:waypoint x="470" y="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="248" y="33" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_04klp00_di" bpmnElement="Flow_04klp00">
<di:waypoint x="40" y="230" />
<di:waypoint x="75" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1fejo5s_di" bpmnElement="Flow_1fejo5s">
<di:waypoint x="-30" y="130" />
<di:waypoint x="-10" y="130" />
<di:waypoint x="-10" y="190" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ertfyv_di" bpmnElement="Flow_0ertfyv">
<di:waypoint x="-135" y="230" />
<di:waypoint x="-60" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dmn5sk_di" bpmnElement="Flow_1dmn5sk">
<di:waypoint x="-160" y="205" />
<di:waypoint x="-160" y="130" />
<di:waypoint x="-130" y="130" />
<bpmndi:BPMNLabel>
<dc:Bounds x="-150" y="163" width="11" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_14r6jea_di" bpmnElement="Flow_14r6jea">
<di:waypoint x="-230" y="230" />
<di:waypoint x="-185" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0sye7h6_di" bpmnElement="Flow_0sye7h6">
<di:waypoint x="-392" y="230" />
<di:waypoint x="-330" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1avwi93_di" bpmnElement="Flow_1avwi93">
<di:waypoint x="1030" y="160" />
<di:waypoint x="1072" y="160" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0m6zmyi_di" bpmnElement="Flow_0m6zmyi">
<di:waypoint x="940" y="770" />
<di:waypoint x="1000" y="770" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="-428" y="212" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="-421" y="255" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_076yim1_di" bpmnElement="Task_076yim1">
<dc:Bounds x="470" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0q5k3ss_di" bpmnElement="Task_0q5k3ss">
<dc:Bounds x="570" y="730" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0lcmkhr_di" bpmnElement="Task_0lcmkhr">
<dc:Bounds x="630" y="10" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0c54gz0_di" bpmnElement="Task_0c54gz0">
<dc:Bounds x="790" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0q2j4cs_di" bpmnElement="Task_0q2j4cs">
<dc:Bounds x="840" y="730" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1p5kogt_di" bpmnElement="Task_1p5kogt">
<dc:Bounds x="1000" y="730" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1o5iu31_di" bpmnElement="Task_1o5iu31">
<dc:Bounds x="930" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0038yc9_di" bpmnElement="End_0038yc9">
<dc:Bounds x="1072" y="142" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_10tyj1y_di" bpmnElement="Task_10tyj1y">
<dc:Bounds x="-330" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_09us30l_di" bpmnElement="Task_09us30l">
<dc:Bounds x="710" y="730" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1g0ku03_di" bpmnElement="Task_1g0ku03">
<dc:Bounds x="470" y="10" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0re23c5_di" bpmnElement="Gateway_0re23c5" isMarkerVisible="true">
<dc:Bounds x="-185" y="205" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="-154" y="193" width="88" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1k7tqhu_di" bpmnElement="Task_1k7tqhu">
<dc:Bounds x="-130" y="90" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_04mzo8k_di" bpmnElement="Gateway_04mzo8k" isMarkerVisible="true">
<dc:Bounds x="75" y="205" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="108" y="193" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_00fvrl8_di" bpmnElement="Task_00fvrl8">
<dc:Bounds x="-60" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1t7oi9c_di" bpmnElement="Task_1t7oi9c">
<dc:Bounds x="470" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1rfaocq_di" bpmnElement="Task_1rfaocq">
<dc:Bounds x="630" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_15d69it_di" bpmnElement="Task_15d69it">
<dc:Bounds x="630" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1753949287150" name="督办流程">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_1c1lhf3</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="Task_1bhxpt0" name="发起人填写" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener" event="complete" id="1491326598389403649" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1c1lhf3</bpmn2:incoming>
<bpmn2:outgoing>Flow_0c2l5vy</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1c1lhf3" sourceRef="start" targetRef="Task_1bhxpt0" />
<bpmn2:userTask id="Task_0ky3mjv" name="合规管理员审核" flowable:assignee="${assigneeUserId}" flowable:countersignRule="countersign_custom">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener" event="complete" id="1491326598389403649" />
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0c2l5vy</bpmn2:incoming>
<bpmn2:outgoing>Flow_03py5rl</bpmn2:outgoing>
<bpmn2:multiInstanceLoopCharacteristics flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">${nrOfCompletedInstances/nrOfInstances&gt;=1}</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0c2l5vy" sourceRef="Task_1bhxpt0" targetRef="Task_0ky3mjv" />
<bpmn2:userTask id="Task_0stqdxz" name="部门负责人审核" flowable:candidateUsers="${oaFlowExpression.getApplyUserDeptPositionLevel(sys_org_code, applyUserId, &#39;1958470912214368258&#39;)}" flowable:groupType="position">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener" event="complete" id="1491326598389403649" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_03py5rl</bpmn2:incoming>
<bpmn2:outgoing>Flow_1sznlmk</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_03py5rl" sourceRef="Task_0ky3mjv" targetRef="Task_0stqdxz" />
<bpmn2:userTask id="Task_0cev5o9" name="风控审计负责" flowable:assignee="admin">
<bpmn2:incoming>Flow_0jclra9</bpmn2:incoming>
<bpmn2:outgoing>Flow_08t2045</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:endEvent id="End_14rgup0">
<bpmn2:incoming>Flow_0wvfsc5</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_1sznlmk" sourceRef="Task_0stqdxz" targetRef="Gateway_1pymmuq" />
<bpmn2:sequenceFlow id="Flow_0jclra9" name="有风险" sourceRef="Gateway_1pymmuq" targetRef="Task_0cev5o9">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger== '1' }</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0xohdkk" name="无风险" sourceRef="Gateway_1pymmuq" targetRef="Gateway_1yzffyx">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger=='0'}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0xphdf0" name="部门分管领导" flowable:assignee="admin">
<bpmn2:incoming>Flow_0iktgdi</bpmn2:incoming>
<bpmn2:outgoing>Flow_00dut1a</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:inclusiveGateway id="Gateway_1pymmuq">
<bpmn2:incoming>Flow_1sznlmk</bpmn2:incoming>
<bpmn2:outgoing>Flow_0jclra9</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0xohdkk</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0iktgdi</bpmn2:outgoing>
</bpmn2:inclusiveGateway>
<bpmn2:sequenceFlow id="Flow_0iktgdi" name="有风险" sourceRef="Gateway_1pymmuq" targetRef="Task_0xphdf0">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${iz_danger== '1' }</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_08t2045" sourceRef="Task_0cev5o9" targetRef="Gateway_1yzffyx" />
<bpmn2:inclusiveGateway id="Gateway_1yzffyx">
<bpmn2:incoming>Flow_08t2045</bpmn2:incoming>
<bpmn2:incoming>Flow_00dut1a</bpmn2:incoming>
<bpmn2:incoming>Flow_0xohdkk</bpmn2:incoming>
<bpmn2:outgoing>Flow_0wvfsc5</bpmn2:outgoing>
</bpmn2:inclusiveGateway>
<bpmn2:sequenceFlow id="Flow_00dut1a" sourceRef="Task_0xphdf0" targetRef="Gateway_1yzffyx" />
<bpmn2:sequenceFlow id="Flow_0wvfsc5" sourceRef="Gateway_1yzffyx" targetRef="End_14rgup0" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1753949287150">
<bpmndi:BPMNEdge id="Flow_0wvfsc5_di" bpmnElement="Flow_0wvfsc5">
<di:waypoint x="1175" y="233" />
<di:waypoint x="1312" y="233" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_00dut1a_di" bpmnElement="Flow_00dut1a">
<di:waypoint x="1020" y="233" />
<di:waypoint x="1125" y="233" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_08t2045_di" bpmnElement="Flow_08t2045">
<di:waypoint x="1020" y="130" />
<di:waypoint x="1150" y="130" />
<di:waypoint x="1150" y="208" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0iktgdi_di" bpmnElement="Flow_0iktgdi">
<di:waypoint x="765" y="230" />
<di:waypoint x="920" y="230" />
<bpmndi:BPMNLabel>
<dc:Bounds x="826" y="212" width="34" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0xohdkk_di" bpmnElement="Flow_0xohdkk">
<di:waypoint x="740" y="255" />
<di:waypoint x="740" y="370" />
<di:waypoint x="1150" y="370" />
<di:waypoint x="1150" y="263" />
<bpmndi:BPMNLabel>
<dc:Bounds x="766" y="383" width="34" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0jclra9_di" bpmnElement="Flow_0jclra9">
<di:waypoint x="740" y="205" />
<di:waypoint x="740" y="130" />
<di:waypoint x="920" y="130" />
<bpmndi:BPMNLabel>
<dc:Bounds x="738" y="165" width="34" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1sznlmk_di" bpmnElement="Flow_1sznlmk">
<di:waypoint x="650" y="230" />
<di:waypoint x="715" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03py5rl_di" bpmnElement="Flow_03py5rl">
<di:waypoint x="490" y="230" />
<di:waypoint x="550" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0c2l5vy_di" bpmnElement="Flow_0c2l5vy">
<di:waypoint x="330" y="230" />
<di:waypoint x="390" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1c1lhf3_di" bpmnElement="Flow_1c1lhf3">
<di:waypoint x="178" y="230" />
<di:waypoint x="230" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="142" y="212" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="149" y="255" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1bhxpt0_di" bpmnElement="Task_1bhxpt0">
<dc:Bounds x="230" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ky3mjv_di" bpmnElement="Task_0ky3mjv">
<dc:Bounds x="390" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0stqdxz_di" bpmnElement="Task_0stqdxz">
<dc:Bounds x="550" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0cev5o9_di" bpmnElement="Task_0cev5o9">
<dc:Bounds x="920" y="90" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_14rgup0_di" bpmnElement="End_14rgup0">
<dc:Bounds x="1312" y="215" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0xphdf0_di" bpmnElement="Task_0xphdf0">
<dc:Bounds x="920" y="195" width="100" height="75" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_00i8d2v_di" bpmnElement="Gateway_1pymmuq">
<dc:Bounds x="715" y="205" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1dcidyu_di" bpmnElement="Gateway_1yzffyx">
<dc:Bounds x="1125" y="208" width="50" height="50" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="joa_leave_cp1670333" name="示例测排他网关">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1554878137217" name="部门领导审批" flowable:assignee="admin" />
<exclusiveGateway id="exclusiveGateway1554878161805">
<outgoing>Flow_163pv7t</outgoing>
</exclusiveGateway>
<userTask id="task1554878168361" name="总经理审批" flowable:assignee="admin">
<incoming>Flow_1o8rizw</incoming>
</userTask>
<userTask id="task1554878176409" name="行政审批" flowable:assignee="admin" />
<sequenceFlow id="flow1554878182573" name="大于三天" sourceRef="exclusiveGateway1554878161805" targetRef="task1554878168361">
<conditionExpression xsi:type="tFormalExpression">${total&gt;3}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1554878185509" name="小于等于三天" sourceRef="exclusiveGateway1554878161805" targetRef="task1554878176409">
<conditionExpression xsi:type="tFormalExpression">${total&lt;=3}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow1554878187307" name="" sourceRef="task1554878137217" targetRef="exclusiveGateway1554878161805" />
<sequenceFlow id="flow1554878190715" name="" sourceRef="start1" targetRef="task1554878137217" />
<sequenceFlow id="flow1554878266602" name="" sourceRef="task1554878168361" targetRef="task1554878176409" />
<sequenceFlow id="flow1554878268869" name="" sourceRef="task1554878176409" targetRef="end" />
<userTask id="Task_0kktl0p" name="3天审批" flowable:assignee="admin">
<incoming>Flow_163pv7t</incoming>
<outgoing>Flow_1o8rizw</outgoing>
</userTask>
<sequenceFlow id="Flow_163pv7t" sourceRef="exclusiveGateway1554878161805" targetRef="Task_0kktl0p">
<conditionExpression xsi:type="tFormalExpression">${total==3}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="Flow_1o8rizw" sourceRef="Task_0kktl0p" targetRef="task1554878168361" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_joa_leave_Copy1670333057204">
<bpmndi:BPMNPlane id="BPMNPlane_joa_leave_Copy1670333057204" bpmnElement="joa_leave_cp1670333">
<bpmndi:BPMNEdge id="Flow_1o8rizw_di" bpmnElement="Flow_1o8rizw">
<omgdi:waypoint x="557" y="100" />
<omgdi:waypoint x="557" y="136" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_163pv7t_di" bpmnElement="Flow_163pv7t">
<omgdi:waypoint x="390" y="208" />
<omgdi:waypoint x="390" y="60" />
<omgdi:waypoint x="507" y="60" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878268869" bpmnElement="flow1554878268869">
<omgdi:waypoint x="557" y="370" />
<omgdi:waypoint x="557" y="455" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878266602" bpmnElement="flow1554878266602">
<omgdi:waypoint x="557" y="213" />
<omgdi:waypoint x="557" y="285" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878190715" bpmnElement="flow1554878190715">
<omgdi:waypoint x="124" y="228" />
<omgdi:waypoint x="214" y="228" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878187307" bpmnElement="flow1554878187307">
<omgdi:waypoint x="310" y="228" />
<omgdi:waypoint x="370" y="228" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878185509" bpmnElement="flow1554878185509">
<omgdi:waypoint x="390" y="248" />
<omgdi:waypoint x="390" y="312" />
<omgdi:waypoint x="512" y="312" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="375" y="271" width="67" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1554878182573" bpmnElement="flow1554878182573">
<omgdi:waypoint x="390" y="208" />
<omgdi:waypoint x="390" y="163" />
<omgdi:waypoint x="512" y="163" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="383" y="176" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="94" y="213" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="87" y="243" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="542" y="455" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="535" y="485" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554878137217" bpmnElement="task1554878137217">
<omgdc:Bounds x="214" y="201" width="96" height="84" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_exclusiveGateway1554878161805" bpmnElement="exclusiveGateway1554878161805" isMarkerVisible="true">
<omgdc:Bounds x="370" y="208" width="40" height="40" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554878168361" bpmnElement="task1554878168361">
<omgdc:Bounds x="512" y="136" width="90" height="77" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1554878176409" bpmnElement="task1554878176409">
<omgdc:Bounds x="512" y="285" width="90" height="85" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0kktl0p_di" bpmnElement="Task_0kktl0p">
<omgdc:Bounds x="507" y="20" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1770095700158" name="车辆维修保养审批单(津保建工)">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_1jz2g6e</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="Task_1ci2ng6" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:true,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1jz2g6e</bpmn2:incoming>
<bpmn2:outgoing>Flow_1hfu0pz</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1jz2g6e" sourceRef="start" targetRef="Task_1ci2ng6" />
<bpmn2:userTask id="Task_0ezmxip" name="车辆管理员" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;2028664690455707650&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1hfu0pz</bpmn2:incoming>
<bpmn2:outgoing>Flow_02kwl5l</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1hfu0pz" sourceRef="Task_1ci2ng6" targetRef="Task_0ezmxip" />
<bpmn2:userTask id="Task_14tej44" name="综合管理部负责人" flowable:candidateGroups="2004446846302089217" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_02kwl5l</bpmn2:incoming>
<bpmn2:outgoing>Flow_1aquqfe</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_02kwl5l" sourceRef="Task_0ezmxip" targetRef="Task_14tej44" />
<bpmn2:exclusiveGateway id="Gateway_0gk94sl">
<bpmn2:incoming>Flow_1aquqfe</bpmn2:incoming>
<bpmn2:outgoing>Flow_16ojsk8</bpmn2:outgoing>
<bpmn2:outgoing>Flow_09uj66v</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_1aquqfe" sourceRef="Task_14tej44" targetRef="Gateway_0gk94sl" />
<bpmn2:userTask id="Task_07ew4xw" name="其他部门分管领导" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;2004720656484859905&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_16ojsk8</bpmn2:incoming>
<bpmn2:outgoing>Flow_0k7nc33</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_16ojsk8" name="其他部门" sourceRef="Gateway_0gk94sl" targetRef="Task_07ew4xw">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6Im5lIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjIwMDQwNzQ4MTg0NTY3MTExNzAifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0n91lwg" name="综合管理部分管领导" flowable:candidateGroups="2004447105202712577" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_09uj66v</bpmn2:incoming>
<bpmn2:outgoing>Flow_0266loo</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_09uj66v" name="综合管理部" sourceRef="Gateway_0gk94sl" targetRef="Task_0n91lwg">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJhcHBseVVzZXJEZXB0IiwiZXhwZWN0ZWRWYWx1ZSI6IjIwMDQwNzQ4MTg0NTY3MTExNzAifV19XQ==', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:userTask id="Task_0lyoju5" name="通知拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:false,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0k7nc33</bpmn2:incoming>
<bpmn2:incoming>Flow_0266loo</bpmn2:incoming>
<bpmn2:outgoing>Flow_0zaaewh</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0k7nc33" sourceRef="Task_07ew4xw" targetRef="Task_0lyoju5" />
<bpmn2:userTask id="Task_0wy6ktd" name="归档" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;2026853145785352193&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0zaaewh</bpmn2:incoming>
<bpmn2:outgoing>Flow_0rk36g9</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0zaaewh" sourceRef="Task_0lyoju5" targetRef="Task_0wy6ktd" />
<bpmn2:endEvent id="End_03g9hew">
<bpmn2:incoming>Flow_0rk36g9</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_0rk36g9" sourceRef="Task_0wy6ktd" targetRef="End_03g9hew" />
<bpmn2:sequenceFlow id="Flow_0266loo" sourceRef="Task_0n91lwg" targetRef="Task_0lyoju5" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1770095700158">
<bpmndi:BPMNEdge id="Flow_0266loo_di" bpmnElement="Flow_0266loo">
<di:waypoint x="680" y="350" />
<di:waypoint x="760" y="350" />
<di:waypoint x="760" y="270" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0rk36g9_di" bpmnElement="Flow_0rk36g9">
<di:waypoint x="890" y="270" />
<di:waypoint x="890" y="322" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0zaaewh_di" bpmnElement="Flow_0zaaewh">
<di:waypoint x="810" y="230" />
<di:waypoint x="840" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0k7nc33_di" bpmnElement="Flow_0k7nc33">
<di:waypoint x="680" y="230" />
<di:waypoint x="710" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_09uj66v_di" bpmnElement="Flow_09uj66v">
<di:waypoint x="510" y="255" />
<di:waypoint x="510" y="350" />
<di:waypoint x="580" y="350" />
<bpmndi:BPMNLabel>
<dc:Bounds x="512" y="333" width="55" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16ojsk8_di" bpmnElement="Flow_16ojsk8">
<di:waypoint x="535" y="230" />
<di:waypoint x="580" y="230" />
<bpmndi:BPMNLabel>
<dc:Bounds x="528" y="212" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1aquqfe_di" bpmnElement="Flow_1aquqfe">
<di:waypoint x="460" y="230" />
<di:waypoint x="485" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_02kwl5l_di" bpmnElement="Flow_02kwl5l">
<di:waypoint x="410" y="310" />
<di:waypoint x="410" y="270" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hfu0pz_di" bpmnElement="Flow_1hfu0pz">
<di:waypoint x="330" y="350" />
<di:waypoint x="360" y="350" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1jz2g6e_di" bpmnElement="Flow_1jz2g6e">
<di:waypoint x="280" y="248" />
<di:waypoint x="280" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="262" y="212" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="269" y="188" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1ci2ng6_di" bpmnElement="Task_1ci2ng6">
<dc:Bounds x="230" y="310" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ezmxip_di" bpmnElement="Task_0ezmxip">
<dc:Bounds x="360" y="310" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_14tej44_di" bpmnElement="Task_14tej44">
<dc:Bounds x="360" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0gk94sl_di" bpmnElement="Gateway_0gk94sl" isMarkerVisible="true">
<dc:Bounds x="485" y="205" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_07ew4xw_di" bpmnElement="Task_07ew4xw">
<dc:Bounds x="580" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0n91lwg_di" bpmnElement="Task_0n91lwg">
<dc:Bounds x="580" y="310" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0lyoju5_di" bpmnElement="Task_0lyoju5">
<dc:Bounds x="710" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wy6ktd_di" bpmnElement="Task_0wy6ktd">
<dc:Bounds x="840" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_03g9hew_di" bpmnElement="End_03g9hew">
<dc:Bounds x="872" y="322" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:flowable="http://flowable.org/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process_1773198067483" name="采购申请单(铁路)">
<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>
<bpmn2:startEvent id="start" name="开始" flowable:initiator="applyUserId">
<bpmn2:outgoing>Flow_1hsrr7l</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="Task_1t9i19k" name="拟稿人" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener" event="create" id="9c3064baa7074eab62e3c5b3b5458691" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1hsrr7l</bpmn2:incoming>
<bpmn2:outgoing>Flow_1qti4ia</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1hsrr7l" sourceRef="start" targetRef="Task_1t9i19k" />
<bpmn2:userTask id="Task_1pb8vkv" name="部门负责人" flowable:candidateUsers="${flowNodeExecution.getDepartLeaders(execution)}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1qti4ia</bpmn2:incoming>
<bpmn2:outgoing>Flow_03c2u7y</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1qti4ia" sourceRef="Task_1t9i19k" targetRef="Task_1pb8vkv" />
<bpmn2:userTask id="Task_0mh0bzt" name="关联部门负责人" flowable:candidateUsers="${flowUtil.getUsersByFormData(execution,&#39;select_user_1773283169997_557924&#39;,&#39;select-user&#39;)}" flowable:groupType="formData" flowable:countersignRule="countersign_custom">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0achk6n</bpmn2:incoming>
<bpmn2:outgoing>Flow_0x92f56</bpmn2:outgoing>
<bpmn2:multiInstanceLoopCharacteristics flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">${nrOfCompletedInstances/nrOfInstances&gt;=1}</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0x7t6mg" name="申请部门分管领导" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;1977974561067126786&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1dxtd7r</bpmn2:incoming>
<bpmn2:outgoing>Flow_0ns8ob6</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_16dcemd" name="关联分管领导意见" flowable:candidateUsers="${flowUtil.getUsersByFormData(execution,&#39;select_user_1773283205332_942723&#39;,&#39;select-user&#39;)}" flowable:groupType="formData" flowable:countersignRule="countersign_custom">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0x92f56</bpmn2:incoming>
<bpmn2:outgoing>Flow_1dxtd7r</bpmn2:outgoing>
<bpmn2:multiInstanceLoopCharacteristics flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId">
<bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">${nrOfCompletedInstances/nrOfInstances&gt;=1}</bpmn2:completionCondition>
</bpmn2:multiInstanceLoopCharacteristics>
</bpmn2:userTask>
<bpmn2:userTask id="Task_0st5yv4" name="总经理" flowable:candidateGroups="1960962884220129282" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0d5tzbd</bpmn2:incoming>
<bpmn2:incoming>Flow_0ns8ob6</bpmn2:incoming>
<bpmn2:outgoing>Flow_1qrb9ky</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="Task_1gymdtu" name="董事长" flowable:candidateGroups="1962716087018209281" flowable:groupType="deptPosition">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1qrb9ky</bpmn2:incoming>
<bpmn2:outgoing>Flow_0effwrq</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1qrb9ky" sourceRef="Task_0st5yv4" targetRef="Task_1gymdtu" />
<bpmn2:userTask id="Task_0p2sdi0" name="归档" flowable:assignee="${applyUserId}">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:false,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0effwrq</bpmn2:incoming>
<bpmn2:outgoing>Flow_0zcndas</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_0effwrq" sourceRef="Task_1gymdtu" targetRef="Task_0p2sdi0" />
<bpmn2:endEvent id="End_0myyr3w">
<bpmn2:incoming>Flow_0zcndas</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="Flow_0zcndas" sourceRef="Task_0p2sdi0" targetRef="End_0myyr3w" />
<bpmn2:exclusiveGateway id="Gateway_1068ktr">
<bpmn2:incoming>Flow_03c2u7y</bpmn2:incoming>
<bpmn2:outgoing>Flow_1h7xgjs</bpmn2:outgoing>
<bpmn2:outgoing>Flow_0achk6n</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="Flow_03c2u7y" sourceRef="Task_1pb8vkv" targetRef="Gateway_1068ktr" />
<bpmn2:userTask id="Task_0et9vrx" name="申请部门分管领导2" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,&#39;1977974561067126786&#39;)}" flowable:groupType="approvalRole">
<bpmn2:extensionElements>
<flowable:taskExtendJson value="{&#34;sameMode&#34;:0,&#34;isSkipAssigneeEmpty&#34;:false,&#34;isSkipAssigneeOnePersion&#34;:true,&#34;isSkipApproval&#34;:false,&#34;isAssignedByPreviousNode&#34;:false,&#34;isEmptyAssignedByPreviousNode&#34;:true,&#34;isSkipApprovedOnCountersignReturn&#34;:false}" />
<flowable:taskListener class="org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener" event="create" />
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_1h7xgjs</bpmn2:incoming>
<bpmn2:outgoing>Flow_0d5tzbd</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="Flow_1h7xgjs" sourceRef="Gateway_1068ktr" targetRef="Task_0et9vrx">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJyYWRpb18xNzczMjgzMTI3NDYwXzUzMjgwMyIsImZpZWxkVHlwZSI6InJhZGlvIiwiZmllbGROYW1lIjoi5piv5ZCm6ZyA6KaB5YWz6IGU6YOo6Zeo6LSf6LSj5Lq677yM5Y+K5YWz6IGU6YOo6Zeo5YiG566h6aKG5a+8IiwiZXhwZWN0ZWRWYWx1ZSI6IuWQpiJ9XX1d', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0d5tzbd" sourceRef="Task_0et9vrx" targetRef="Task_0st5yv4" />
<bpmn2:sequenceFlow id="Flow_0achk6n" sourceRef="Gateway_1068ktr" targetRef="Task_0mh0bzt">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${flowUtil.evaluateExpression(execution, 'W3sibG9naWMiOiJhbmQiLCJjb25kaXRpb25zIjpbeyJvcGVyYXRvciI6ImVxIiwiZmllbGQiOiJyYWRpb18xNzczMjgzMTI3NDYwXzUzMjgwMyIsImZpZWxkVHlwZSI6InJhZGlvIiwiZmllbGROYW1lIjoi5piv5ZCm6ZyA6KaB5YWz6IGU6YOo6Zeo6LSf6LSj5Lq677yM5Y+K5YWz6IGU6YOo6Zeo5YiG566h6aKG5a+8IiwiZXhwZWN0ZWRWYWx1ZSI6IuaYryJ9XX1d', 'and')}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="Flow_0x92f56" sourceRef="Task_0mh0bzt" targetRef="Task_16dcemd" />
<bpmn2:sequenceFlow id="Flow_1dxtd7r" sourceRef="Task_16dcemd" targetRef="Task_0x7t6mg" />
<bpmn2:sequenceFlow id="Flow_0ns8ob6" sourceRef="Task_0x7t6mg" targetRef="Task_0st5yv4" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process_1773198067483">
<bpmndi:BPMNEdge id="Flow_0ns8ob6_di" bpmnElement="Flow_0ns8ob6">
<di:waypoint x="980" y="100" />
<di:waypoint x="1085" y="100" />
<di:waypoint x="1085" y="230" />
<di:waypoint x="1190" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dxtd7r_di" bpmnElement="Flow_1dxtd7r">
<di:waypoint x="790" y="100" />
<di:waypoint x="880" y="100" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0x92f56_di" bpmnElement="Flow_0x92f56">
<di:waypoint x="620" y="100" />
<di:waypoint x="690" y="100" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0achk6n_di" bpmnElement="Flow_0achk6n">
<di:waypoint x="420" y="205" />
<di:waypoint x="420" y="100" />
<di:waypoint x="520" y="100" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0d5tzbd_di" bpmnElement="Flow_0d5tzbd">
<di:waypoint x="610" y="230" />
<di:waypoint x="1190" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1h7xgjs_di" bpmnElement="Flow_1h7xgjs">
<di:waypoint x="445" y="230" />
<di:waypoint x="510" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03c2u7y_di" bpmnElement="Flow_03c2u7y">
<di:waypoint x="350" y="230" />
<di:waypoint x="395" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0zcndas_di" bpmnElement="Flow_0zcndas">
<di:waypoint x="1610" y="230" />
<di:waypoint x="1672" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0effwrq_di" bpmnElement="Flow_0effwrq">
<di:waypoint x="1450" y="230" />
<di:waypoint x="1510" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1qrb9ky_di" bpmnElement="Flow_1qrb9ky">
<di:waypoint x="1290" y="230" />
<di:waypoint x="1350" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1qti4ia_di" bpmnElement="Flow_1qti4ia">
<di:waypoint x="210" y="230" />
<di:waypoint x="250" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hsrr7l_di" bpmnElement="Flow_1hsrr7l">
<di:waypoint x="58" y="230" />
<di:waypoint x="110" y="230" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="start">
<dc:Bounds x="22" y="212" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="29" y="255" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1t9i19k_di" bpmnElement="Task_1t9i19k">
<dc:Bounds x="110" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1pb8vkv_di" bpmnElement="Task_1pb8vkv">
<dc:Bounds x="250" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0mh0bzt_di" bpmnElement="Task_0mh0bzt">
<dc:Bounds x="520" y="60" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0x7t6mg_di" bpmnElement="Task_0x7t6mg">
<dc:Bounds x="880" y="60" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_16dcemd_di" bpmnElement="Task_16dcemd">
<dc:Bounds x="690" y="60" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0st5yv4_di" bpmnElement="Task_0st5yv4">
<dc:Bounds x="1190" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1gymdtu_di" bpmnElement="Task_1gymdtu">
<dc:Bounds x="1350" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0p2sdi0_di" bpmnElement="Task_0p2sdi0">
<dc:Bounds x="1510" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0myyr3w_di" bpmnElement="End_0myyr3w">
<dc:Bounds x="1672" y="212" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1068ktr_di" bpmnElement="Gateway_1068ktr" isMarkerVisible="true">
<dc:Bounds x="395" y="205" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0et9vrx_di" bpmnElement="Task_0et9vrx">
<dc:Bounds x="510" y="190" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.jeecg.org">
<process id="joa_onl_sxhuiq" name="顺序会签流程">
<documentation>流程描述</documentation>
<extensionElements>
<flowable:executionListener class="org.jeecg.modules.extbpm.listener.execution.ProcessEndListener" event="end" id="402880e54803a496014805e5d9190012" />
</extensionElements>
<startEvent id="start1" name="开始节点" flowable:initiator="applyUserId" />
<endEvent id="end" name="结束节点" />
<userTask id="task1557560183848" name="选择会签人员" flowable:assignee="${applyUserId}" />
<userTask id="task1557560206142" name="会签审阅" flowable:assignee="${assigneeUserId}">
<multiInstanceLoopCharacteristics isSequential="true" flowable:collection="${flowUtil.stringToList(assigneeUserIdList)}" flowable:elementVariable="assigneeUserId" />
</userTask>
<sequenceFlow id="flow1557560225476" name="" sourceRef="start1" targetRef="task1557560183848" />
<sequenceFlow id="flow1557560227264" name="" sourceRef="task1557560183848" targetRef="task1557560206142" />
<sequenceFlow id="flow1557560228916" name="" sourceRef="task1557560206142" targetRef="end" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_joa_onl_sxhuiq">
<bpmndi:BPMNPlane id="BPMNPlane_joa_onl_sxhuiq" bpmnElement="joa_onl_sxhuiq">
<bpmndi:BPMNEdge id="BPMNEdge_flow1557560228916" bpmnElement="flow1557560228916">
<omgdi:waypoint x="215" y="336" />
<omgdi:waypoint x="215" y="400" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1557560227264" bpmnElement="flow1557560227264">
<omgdi:waypoint x="215" y="203" />
<omgdi:waypoint x="215" y="271" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_flow1557560225476" bpmnElement="flow1557560225476">
<omgdi:waypoint x="215" y="80" />
<omgdi:waypoint x="215" y="138" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_start1" bpmnElement="start1">
<omgdc:Bounds x="200" y="50" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<omgdc:Bounds x="200" y="400" width="30" height="30" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1557560183848" bpmnElement="task1557560183848">
<omgdc:Bounds x="170" y="143" width="90" height="55" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_task1557560206142" bpmnElement="task1557560206142">
<omgdc:Bounds x="170" y="276" width="90" height="55" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>