新增JeecgBoot BPM流程自动生成器,包含流程创建、修改及审批人配置功能,支持自然语言描述转化为BPMN XML,并通过API与JeecgBoot系统交互。
This commit is contained in:
280
.trae/skills/jeecg-bpmn/SKILL.md
Normal file
280
.trae/skills/jeecg-bpmn/SKILL.md
Normal file
@@ -0,0 +1,280 @@
|
||||
---
|
||||
name: jeecg-bpmn
|
||||
description: "Use when user asks to create/generate a BPM workflow, design a Flowable BPMN process, or says \"创建流程\", \"生成流程\", \"新建流程\", \"设计流程\", \"画流程\", \"审批流程\", \"工作流\", \"BPM\", \"BPMN\", \"create flow\", \"create process\", \"new workflow\", \"generate workflow\". Also triggers when user describes an approval chain like \"先经理审批再HR审批\" or mentions process nodes like \"开始→审批→网关→结束\"."
|
||||
---
|
||||
|
||||
# JeecgBoot BPM 流程自动生成器
|
||||
|
||||
将自然语言的流程描述转换为 Flowable BPMN 2.0 XML,并通过 API 在 JeecgBoot 系统中自动创建流程。
|
||||
|
||||
## 前置条件
|
||||
|
||||
用户必须提供以下信息(或由 AI 引导确认):
|
||||
|
||||
1. **API 地址**:JeecgBoot 后端地址(如 `https://api3.boot.jeecg.com`)
|
||||
2. **X-Access-Token**:JWT 登录令牌(从浏览器 F12 获取)
|
||||
|
||||
如果用户未提供,提示:
|
||||
> 请提供 JeecgBoot 后端地址和 X-Access-Token(从浏览器 F12 → Network → 任意请求的 Request Headers 中复制)。
|
||||
|
||||
## 交互流程
|
||||
|
||||
### Step 0: 解析用户需求
|
||||
|
||||
从用户描述中提取以下信息:
|
||||
|
||||
| 信息 | 默认值 | 示例 |
|
||||
|------|--------|------|
|
||||
| 流程名称 | 用户指定或自动生成 | "员工请假审批流程" |
|
||||
| 流程类型 | `oa` | 字典 `bpm_process_type` 的值 |
|
||||
| 节点列表 | 从描述中解析 | 开始→员工提交→经理审批→HR审批→结束 |
|
||||
| 网关逻辑 | 从描述中解析 | "通过→下一步,拒绝→结束" |
|
||||
| 审批人配置 | 从描述中解析 | assignee/candidateUsers/candidateGroups/表达式 |
|
||||
|
||||
### Step 1: 识别节点并构建流程结构
|
||||
|
||||
**支持的节点类型:**
|
||||
|
||||
| 用户描述关键词 | BPMN 节点类型 | XML 元素 |
|
||||
|---------------|---------------|----------|
|
||||
| 开始 | 开始事件 | `startEvent` |
|
||||
| 结束 | 结束事件 | `endEvent` |
|
||||
| 审批/审核/处理/提交 | 用户任务 | `userTask` |
|
||||
| 条件判断/分支/通过或拒绝 | 排他网关 | `exclusiveGateway` |
|
||||
| 同时/并行 | 并行网关 | `parallelGateway` |
|
||||
| 条件并行/部分并行 | 包含网关 | `inclusiveGateway` |
|
||||
| 子流程/嵌套 | 内嵌子流程 | `subProcess` |
|
||||
| 调用子流程/主子流程 | 调用子流程 | `callActivity` |
|
||||
| 会签子流程 | 调用子流程+多实例 | `callActivity` + `multiInstance` |
|
||||
|
||||
**审批人配置映射:**
|
||||
|
||||
| 用户描述 | BPMN 属性 | 示例 |
|
||||
|----------|-----------|------|
|
||||
| "发起人/申请人" | `flowable:assignee="${applyUserId}"` | 流程发起人自动填充 |
|
||||
| "admin/指定用户名" | `flowable:assignee="admin"` | 固定指定人 |
|
||||
| "经理角色/角色组" | `flowable:candidateGroups="manager"` + `groupType="role"` | 系统角色候选 |
|
||||
| "审批角色" | `flowable:candidateGroups="xxx"` + `groupType="approvalRole"` | 审批专用角色 |
|
||||
| "张三或李四" | `flowable:candidateUsers="zhangsan,lisi"` | 多候选人 |
|
||||
| "某部门审批" | `flowable:candidateGroups="部门ID"` + `groupType="dept"` | 部门审批 |
|
||||
| "某岗位审批" | `flowable:candidateGroups="岗位ID"` + `groupType="deptPosition"` | 部门岗位审批 |
|
||||
| "职级审批" | 表达式 + `groupType="position"` | 职务级别审批 |
|
||||
| "部门负责人(表达式)" | `flowable:assignee="${deptLeader}"` | 表达式动态 |
|
||||
| "上一节点指派" | `isAssignedByPreviousNode=true` | 上一审批人选择 |
|
||||
| "草稿/驳回发起人" | `flowable:assignee="${applyUserId}"` + `sameMode=2` | 草稿节点 |
|
||||
| "会签/多人同时审批" | `flowable:countersignRule` + 多实例 | 并行/顺序会签 |
|
||||
| "表单字段选人" | `groupType="formData"` | 从表单动态获取 |
|
||||
|
||||
**审批人数据查询:** 当用户提到具体角色/用户/部门名称时,可查数据库获取准确编码:
|
||||
- 角色编码:`SELECT role_code, role_name FROM sys_role`
|
||||
- 用户名:`SELECT username, realname FROM sys_user`
|
||||
- 部门/岗位ID:`SELECT id, depart_name, org_category FROM sys_depart`(org_category: 1=公司, 2=部门, 3=岗位, 4=子公司)
|
||||
|
||||
### Step 2: 展示流程摘要并确认
|
||||
|
||||
**必须展示以下内容,等待用户确认后再执行:**
|
||||
|
||||
```
|
||||
## 流程摘要
|
||||
|
||||
- 流程名称:员工请假审批流程
|
||||
- 流程类型:oa
|
||||
- 目标环境:https://api3.boot.jeecg.com
|
||||
|
||||
### 流程节点
|
||||
|
||||
| 序号 | 节点名称 | 类型 | 审批人 |
|
||||
|------|---------|------|--------|
|
||||
| 1 | 开始 | startEvent | - |
|
||||
| 2 | 员工提交申请 | userTask | ${applyUserId} |
|
||||
| 3 | 部门经理审批 | userTask | manager (角色组) |
|
||||
| 4 | 审批结果 | exclusiveGateway | 条件分支 |
|
||||
| 5 | HR审批 | userTask | hr (角色组) |
|
||||
| 6 | 结束 | endEvent | - |
|
||||
|
||||
### 连线与条件
|
||||
|
||||
开始 → 员工提交申请 → 部门经理审批 → 审批结果
|
||||
├─ 通过 (result==1) → HR审批 → 结束
|
||||
└─ 拒绝 (result==0) → 结束
|
||||
|
||||
确认以上信息正确?(y/n)
|
||||
```
|
||||
|
||||
### Step 3: 生成 BPMN XML 并调用 API
|
||||
|
||||
用户确认后,执行以下步骤:
|
||||
|
||||
#### 3.1 生成唯一标识
|
||||
|
||||
```python
|
||||
import time
|
||||
ts = str(int(time.time() * 1000))
|
||||
process_key = f"process_{ts}"
|
||||
```
|
||||
|
||||
#### 3.2 构造 BPMN XML
|
||||
|
||||
阅读以下参考文件(按需):
|
||||
- `references/bpmn-xml-skeleton.md` — XML 骨架 + 基本节点模板(必读)
|
||||
- `references/bpmn-assignee-types.md` — 审批人配置 + 表达式审批人 + groupType速查(必读)
|
||||
- `references/bpmn-layout.md` — 节点ID命名 + 布局计算(必读)
|
||||
- `references/bpmn-countersign.md` — 会签配置(需要会签时读)
|
||||
- `references/bpmn-task-extend.md` — taskExtendJson + 监听器完整清单(配置节点行为时读)
|
||||
- `references/bpmn-examples.md` — 完整示例 + Python脚本 + 流程模式
|
||||
- `references/bpmn-advanced.md` — 条件表达式 + 抄送 + 按钮 + 服务任务 + API
|
||||
- `references/bpmn-subprocess-gateway.md` — 网关 + 子流程(子流程/网关时读)
|
||||
- `references/bpmn-db-config.md` — 数据库配置表
|
||||
- `references/example/*.bpmn` — **生产环境真实流程示例**(生成前先阅读最相似的示例学习写法)
|
||||
|
||||
核心要点:
|
||||
- 使用 `bpmn2:` 命名空间前缀(新版设计器规范)
|
||||
- 必须包含流程结束监听器和任务创建监听器
|
||||
- 必须包含 `bpmndi:BPMNDiagram` 图形布局信息
|
||||
- 节点 ID 使用有意义的命名(如 `task_apply`、`gateway_result`)
|
||||
|
||||
#### 3.3 构造 nodes 参数
|
||||
|
||||
从所有 `userTask` 节点中提取,格式:
|
||||
```
|
||||
id=<节点ID>###nodeName=<节点名称>@@@id=<节点ID>###nodeName=<节点名称>@@@
|
||||
```
|
||||
|
||||
#### 3.4 使用 Python 调用 API(必须用 Python,不要用 curl)
|
||||
|
||||
**重要限制(实战踩坑):**
|
||||
1. **Windows 环境下 curl 发送中文会乱码**,必须使用 Python 的 urllib 确保 UTF-8 编码
|
||||
2. **禁止使用 `python3 -c "..."` 内联方式**,因为 BPMN XML 中的 `${applyUserId}` 等表达式会被 bash 当作 shell 变量展开,导致 `unexpected EOF` 错误
|
||||
3. **必须先用 Write 工具写入 `.py` 临时文件,再用 Bash 执行,最后删除临时文件**
|
||||
|
||||
**执行步骤:**
|
||||
```
|
||||
1. Write 工具 → 写入 create_process.py(项目根目录)
|
||||
2. Bash 工具 → python create_process.py
|
||||
3. Bash 工具 → rm create_process.py(清理)
|
||||
```
|
||||
|
||||
**Python f-string 中的转义要点:**
|
||||
- BPMN 表达式 `${applyUserId}` → f-string 中写作 `${{applyUserId}}`(双花括号转义)
|
||||
- taskExtendJson 的 `value` 属性用**单引号**包裹 JSON → `value='{{"sameMode":2,...}}'`(避免与 XML 双引号冲突,同时 JSON 花括号也需双花括号转义)
|
||||
- `flowable:candidateUsers="${flowNodeExecution.getDepartLeaders(execution)}"` → f-string 中写作 `${{flowNodeExecution.getDepartLeaders(execution)}}`
|
||||
|
||||
**Python 脚本模板:**
|
||||
|
||||
```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 构造 XML,注意 ${{}} 双花括号转义
|
||||
bpmn_xml = f'''<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn2:definitions ...>
|
||||
<bpmn2:process id="{process_key}" name="{process_name}">
|
||||
...
|
||||
<bpmn2:userTask id="task_apply" name="申请人填写" flowable:assignee="${{applyUserId}}">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value='{{"sameMode":2,...}}' />
|
||||
...
|
||||
</bpmn2:extensionElements>
|
||||
</bpmn2:userTask>
|
||||
...
|
||||
</bpmn2:process>
|
||||
<bpmndi:BPMNDiagram>...</bpmndi:BPMNDiagram>
|
||||
</bpmn2:definitions>'''
|
||||
|
||||
nodes_str = 'id=task_apply###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}')
|
||||
```
|
||||
|
||||
#### 3.5 检查结果
|
||||
|
||||
- `success: true` → 流程创建成功,记录返回的 `obj`(流程ID)
|
||||
- `success: false` → 输出错误信息,检查 processkey 是否重复等
|
||||
|
||||
### Step 4: 输出结果
|
||||
|
||||
```
|
||||
## 流程创建成功
|
||||
|
||||
- 流程ID:{obj}
|
||||
- 流程名称:{processName}
|
||||
- 流程Key:{processkey}
|
||||
- 目标环境:{API_BASE}
|
||||
|
||||
请在流程设计器中查看:打开 JeecgBoot 后台 → 流程管理 → 流程设计 → 找到该流程
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 编辑已有流程
|
||||
|
||||
如果用户要修改已有流程,需提供 `processDefinitionId`(流程数据表ID),调用同一接口,将 `processDefinitionId` 改为实际ID 即可。
|
||||
|
||||
---
|
||||
|
||||
## 错误处理
|
||||
|
||||
| 错误 | 解决方案 |
|
||||
|------|---------|
|
||||
| Token 过期(401/认证失败) | 提示用户重新获取 X-Access-Token |
|
||||
| `流程ID重复` | 重新生成时间戳作为 processkey |
|
||||
| `不是最新版本` | 先查询最新的 processDefinitionId 再保存 |
|
||||
| 中文乱码 | 确认使用 Python urllib(不要用 curl) |
|
||||
| 连接超时 | 确认后端地址可达,检查网络 |
|
||||
|
||||
## 数据库配置表
|
||||
|
||||
流程创建后,可通过以下数据库表进一步配置节点行为、表单绑定和字段权限:
|
||||
|
||||
| 表名 | 说明 | 用途 |
|
||||
|------|------|------|
|
||||
| `ext_act_process` | 流程主表 | 流程属性、XML、发起方式、催办/撤回/通知等 |
|
||||
| `ext_act_process_form` | 表单绑定 | 流程与业务表单关联,标题表达式,表单类型(1=Online/2=DesForm/3=自定义) |
|
||||
| `ext_act_process_node` | 节点配置 | 每个审批节点的功能开关(编辑/抄送/转办/加签/驳回等) |
|
||||
| `ext_act_process_node_auth` | 字段权限 | 每个节点上表单字段的显示/隐藏/可编辑/禁用控制 |
|
||||
|
||||
详细的字段说明和取值参见 `references/bpmn-db-config.md`。
|
||||
|
||||
## 参考文档
|
||||
|
||||
- 阅读 `references/bpmn-templates.md` 获取参考文件索引(已拆分为 8 个子文件)
|
||||
199
.trae/skills/jeecg-bpmn/docs/skill-usage-guide.md
Normal file
199
.trae/skills/jeecg-bpmn/docs/skill-usage-guide.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# JeecgBoot BPM 流程自动生成 — Skills 使用指南
|
||||
|
||||
> 通过自然语言描述,AI 自动生成 Flowable BPMN 2.0 XML 并调用 API 创建/修改流程。
|
||||
|
||||
## 前置准备
|
||||
|
||||
使用前需准备两样东西:
|
||||
|
||||
| 信息 | 获取方式 | 示例 |
|
||||
|------|---------|------|
|
||||
| **后端地址** | 运维/开发提供 | `https://api3.boot.jeecg.com` |
|
||||
| **X-Access-Token** | 浏览器 F12 → Network → 任意请求 Headers | `eyJhbGciOiJIUzI1NiJ9...` |
|
||||
|
||||
---
|
||||
|
||||
## 实战案例:车辆出差申请流程
|
||||
|
||||
以下是一个完整的流程创建和迭代修改过程,展示了 skill 的实际使用方式。
|
||||
|
||||
### 第一步:创建基础流程
|
||||
|
||||
**用户输入:**
|
||||
```
|
||||
创建一个车辆出差申请流程
|
||||
```
|
||||
|
||||
**AI 交互过程:**
|
||||
|
||||
1. AI 询问后端地址和 Token
|
||||
2. 用户提供凭据后,AI 设计流程并展示摘要:
|
||||
|
||||
```
|
||||
## 流程摘要
|
||||
|
||||
- 流程名称:车辆出差申请流程
|
||||
- 流程类型:oa
|
||||
|
||||
### 流程节点
|
||||
|
||||
| 序号 | 节点名称 | 类型 | 审批人 |
|
||||
|------|---------|------|--------|
|
||||
| 1 | 开始 | startEvent | - |
|
||||
| 2 | 申请人填写 | userTask (草稿) | ${applyUserId} |
|
||||
| 3 | 部门负责人审批 | userTask | 表达式(部门负责人) |
|
||||
| 4 | 分管领导审批 | userTask | 表达式(上一级部门负责人) |
|
||||
| 5 | 车辆调度确认 | userTask | 上一节点指派 |
|
||||
| 6 | 结束 | endEvent | - |
|
||||
|
||||
确认以上信息正确?(y/n)
|
||||
```
|
||||
|
||||
3. 用户确认 `y` 后,AI 自动生成 BPMN XML 并调用 API
|
||||
4. 返回结果:
|
||||
|
||||
```
|
||||
## 流程创建成功
|
||||
|
||||
- 流程ID:2032497475959439362
|
||||
- 流程Key:process_1773420125267
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 第二步:增加审批节点
|
||||
|
||||
**用户输入:**
|
||||
```
|
||||
修改刚才的流程,加入一个总经理审批节点,最后一个节点
|
||||
```
|
||||
|
||||
**AI 交互过程:**
|
||||
|
||||
1. AI 基于已有流程信息,展示修改后的摘要(标注变更项):
|
||||
|
||||
```
|
||||
| 序号 | 节点名称 | 类型 | 审批人 | 变更 |
|
||||
|------|---------|------|--------|------|
|
||||
| ... | (原有节点) | ... | ... | |
|
||||
| 6 | 总经理审批 | userTask | 表达式(上两级部门负责人) | 新增 |
|
||||
| 7 | 结束 | endEvent | - | |
|
||||
```
|
||||
|
||||
2. 用户确认后,AI 使用相同的 `processDefinitionId` 和 `processkey` 调用 API 更新流程
|
||||
3. 流程修改成功
|
||||
|
||||
---
|
||||
|
||||
### 第三步:增加条件分支
|
||||
|
||||
**用户输入:**
|
||||
```
|
||||
在部门负责人审批节点后面增加分支条件,如果用车时间超过3天则需要人力审批,然后再流向车辆调度确认
|
||||
```
|
||||
|
||||
**AI 交互过程:**
|
||||
|
||||
1. AI 识别出需要排他网关(exclusiveGateway),展示分支逻辑:
|
||||
|
||||
```
|
||||
开始 → 申请人填写 → 部门负责人审批 → 用车天数判断
|
||||
├─ ≤3天 ──────────────→ 分管领导审批 → 车辆调度确认 → 总经理审批 → 结束
|
||||
└─ >3天 → 人力审批(hr角色) ↗
|
||||
```
|
||||
|
||||
2. 用户确认后,API 更新流程
|
||||
|
||||
**最终流程图效果:**
|
||||
|
||||
```
|
||||
○ 开始
|
||||
↓
|
||||
[申请人填写] ← 草稿节点,首次自动跳过
|
||||
↓
|
||||
[部门负责人审批] ← 表达式: getDepartLeaders
|
||||
↓
|
||||
◇ 用车天数判断
|
||||
↙ ↘
|
||||
≤3天 >3天
|
||||
↓ ↓
|
||||
│ [人力审批] ← hr 角色组
|
||||
↓ ↙
|
||||
[分管领导审批] ← 表达式: getLevel1DepartLeaders
|
||||
↓
|
||||
[车辆调度确认] ← 上一节点指派
|
||||
↓
|
||||
[总经理审批] ← 表达式: getLevel2DepartLeaders
|
||||
↓
|
||||
● 结束
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用技巧
|
||||
|
||||
### 1. 描述流程的多种方式
|
||||
|
||||
```
|
||||
# 简单描述
|
||||
创建一个请假审批流程,先经理审批再HR审批
|
||||
|
||||
# 指定审批人
|
||||
创建流程:开始 → admin审批 → hr角色组审批 → 结束
|
||||
|
||||
# 描述条件分支
|
||||
报销流程,金额大于1万需要总监审批,否则经理审批即可
|
||||
|
||||
# 描述会签
|
||||
创建合同审批流程,需要法务部和财务部同时会签
|
||||
```
|
||||
|
||||
### 2. 修改已有流程
|
||||
|
||||
```
|
||||
# 增加节点
|
||||
在经理审批后面加一个总监审批
|
||||
|
||||
# 增加条件分支
|
||||
在提交节点后加一个金额判断,超过5000走总监审批
|
||||
|
||||
# 修改审批人
|
||||
把部门经理审批改成角色组 manager
|
||||
|
||||
# 删除节点
|
||||
去掉HR审批节点
|
||||
```
|
||||
|
||||
### 3. 支持的审批人类型
|
||||
|
||||
| 说法 | AI 识别为 |
|
||||
|------|----------|
|
||||
| "admin审批" | 固定指定人 |
|
||||
| "发起人/申请人" | `${applyUserId}` 表达式 |
|
||||
| "部门负责人" | `getDepartLeaders` 表达式 |
|
||||
| "分管领导" | `getLevel1DepartLeaders` 表达式 |
|
||||
| "hr角色" / "角色组" | `candidateGroups` + `groupType="role"` |
|
||||
| "上一节点指派" | `isAssignedByPreviousNode=true` |
|
||||
| "张三或李四" | `candidateUsers` 候选人 |
|
||||
| "会签/多人同时审批" | 多实例 + `countersignRule` |
|
||||
|
||||
### 4. 支持的条件分支
|
||||
|
||||
| 说法 | AI 生成 |
|
||||
|------|--------|
|
||||
| "金额大于1万" | `${amount > 10000}` |
|
||||
| "天数超过3天" | `${use_days > 3}` |
|
||||
| "通过/拒绝" | `${result == 1}` / `${result == 0}` |
|
||||
| "部长以上职务" | `${oaUtil.branchConditionByPost(...)}` |
|
||||
|
||||
> 条件变量名需与业务表单字段名一致。
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **Token 有效期**:JWT Token 有过期时间,过期后需重新从浏览器获取
|
||||
2. **流程字段绑定**:条件分支中的变量名(如 `use_days`)需与关联表单的字段名一致
|
||||
3. **同一会话内可连续修改**:AI 会记住当前流程的 ID 和 Key,无需重复提供
|
||||
4. **修改是覆盖式的**:每次修改会提交完整的 BPMN XML,不是增量更新
|
||||
5. **创建后需绑定表单**:流程创建后,需在 JeecgBoot 后台绑定业务表单才能正常发起
|
||||
155
.trae/skills/jeecg-bpmn/references/bpmn-advanced.md
Normal file
155
.trae/skills/jeecg-bpmn/references/bpmn-advanced.md
Normal 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` | 获取职级列表 |
|
||||
356
.trae/skills/jeecg-bpmn/references/bpmn-assignee-types.md
Normal file
356
.trae/skills/jeecg-bpmn/references/bpmn-assignee-types.md
Normal 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="{
|
||||
"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>
|
||||
```
|
||||
|
||||
## 5. 部门审批 — candidateGroups + groupType="dept"
|
||||
|
||||
按部门 ID 分配,部门下所有用户都可处理:
|
||||
|
||||
```xml
|
||||
<bpmn2:userTask id="task_xxx" name="部门审批"
|
||||
flowable:candidateGroups="6d35e179cd814e3299bd588ea7daed3f,c6d7cb4deeac411cb3384b1b31278596"
|
||||
flowable:groupType="dept">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{
|
||||
"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>
|
||||
```
|
||||
|
||||
## 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="{"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>
|
||||
```
|
||||
|
||||
### 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="{"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="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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":false,"isSkipApprovedOnCountersignReturn":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>
|
||||
```
|
||||
242
.trae/skills/jeecg-bpmn/references/bpmn-countersign.md
Normal file
242
.trae/skills/jeecg-bpmn/references/bpmn-countersign.md
Normal 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 中 `>=` 需要写成 `>=`,如 `${nrOfCompletedInstances/nrOfInstances>=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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":false,"isSkipApprovedOnCountersignReturn":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>=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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":false,"isSkipApprovedOnCountersignReturn":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动态获取用户列表
|
||||
176
.trae/skills/jeecg-bpmn/references/bpmn-db-config.md
Normal file
176
.trae/skills/jeecg-bpmn/references/bpmn-db-config.md
Normal 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 XML(longblob) | 完整 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": "[...]"
|
||||
}
|
||||
```
|
||||
394
.trae/skills/jeecg-bpmn/references/bpmn-examples.md
Normal file
394
.trae/skills/jeecg-bpmn/references/bpmn-examples.md
Normal 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="{"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="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` 用单引号包裹 JSON,JSON 花括号用 `{{}}` 转义
|
||||
4. 执行完毕后删除临时 `.py` 文件
|
||||
125
.trae/skills/jeecg-bpmn/references/bpmn-layout.md
Normal file
125
.trae/skills/jeecg-bpmn/references/bpmn-layout.md
Normal 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>
|
||||
```
|
||||
325
.trae/skills/jeecg-bpmn/references/bpmn-subprocess-gateway.md
Normal file
325
.trae/skills/jeecg-bpmn/references/bpmn-subprocess-gateway.md
Normal 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"`(新版设计器),两种都可用。
|
||||
187
.trae/skills/jeecg-bpmn/references/bpmn-task-extend.md
Normal file
187
.trae/skills/jeecg-bpmn/references/bpmn-task-extend.md
Normal 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=执行监听器(executionListener),2=任务监听器(taskListener)
|
||||
|
||||
**listener_value_type:** `javaClass`=Java类,`expression`=表达式,`delegateExpression`=Spring委托表达式
|
||||
|
||||
### 3.1 执行监听器(type=1,用于流程级/节点级)
|
||||
|
||||
| 名称 | 事件 | 类型 | 完整类路径 |
|
||||
|------|------|------|-----------|
|
||||
| 平台通用流程结束监听 | end | javaClass | `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener` |
|
||||
| 公文收文分发 | end | javaClass | `org.jeecg.modules.listener.easyoa.ReveicedStartListener` |
|
||||
| 子流程会签开始监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener` |
|
||||
| 子流程开始监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SubProcessStartListener` |
|
||||
| 信号启动流程监听 | start | javaClass | `org.jeecg.modules.extbpm.listener.execution.SignalProcessStartListener` |
|
||||
| 表单设计器生成自动编号 | start | javaClass | `org.jeecg.modules.designform.listener.DesformAutoNumberListener` |
|
||||
| 公文表单监听 | start | javaClass | `org.jeecg.modules.listener.easyoa.OaOfficialdocStartListener` |
|
||||
|
||||
### 3.2 任务监听器(type=2,用于 userTask 级)
|
||||
|
||||
| 名称 | 事件 | 类型 | 完整类路径/表达式 |
|
||||
|------|------|------|-----------------|
|
||||
| 用户审核节点跳过规则监听 | create | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener` |
|
||||
| 首任务节点自动提交监听 | create | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener` |
|
||||
| 子流程 | create | expression | `${subProcessListener}` |
|
||||
| spring表达式监听 | create | delegateExpression | `${someJavaDelegateBean}` |
|
||||
| 节点监听更新业务数据到流程变量 | complete | javaClass | `org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener` |
|
||||
| 公告审核监听 | complete | javaClass | `org.jeecg.modules.listener.announcement.NoticeReviewEndListener` |
|
||||
| 新闻审核监听 | complete | javaClass | `org.jeecg.modules.listener.easyoa.NewsReviewEndListener` |
|
||||
| 公文发文分发 | complete | javaClass | `org.jeecg.modules.listener.easyoa.DistributeIssuedEndListener` |
|
||||
|
||||
### 3.3 常用监听器使用场景
|
||||
|
||||
| 监听器 | 使用场景 | 是否必需 |
|
||||
|--------|---------|---------|
|
||||
| `ProcessEndListener` | 所有流程都要挂,流程结束时更新业务状态 | 必需 |
|
||||
| `TaskSkipApprovalListener` | 使用 taskExtendJson 时挂载,实现跳过审批逻辑 | 配合 taskExtendJson 必需 |
|
||||
| `TaskCreatedAutoSubmitListener` | 草稿节点(sameMode=2),首次自动跳过 | 草稿节点必需 |
|
||||
| `TaskUpdateFormDataListener` | 节点完成时将表单数据同步到流程变量 | 按需 |
|
||||
| `SubProcessStartListener` | 子流程启动时的初始化 | 子流程必需 |
|
||||
| `SubProcessHqStartListener` | 子流程会签场景 | 子流程会签必需 |
|
||||
| `DesformAutoNumberListener` | DesForm 表单自动编号 | DesForm 自动编号时需要 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 源码级监听器完整清单
|
||||
|
||||
以下从源码中扫描所有 `implements TaskListener` 和 `implements ExecutionListener` 的实现类。
|
||||
|
||||
### 4.1 TaskListener 实现类(11个)
|
||||
|
||||
#### 平台核心(jeecg-boot-module-bpm-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.extbpm.listener.task.TaskSkipApprovalListener` | create | 节点审批自动跳过(发起人=审批人跳过、审批人为空跳过、已审批免二次等) |
|
||||
| `org.jeecg.modules.extbpm.listener.task.TaskUpdateFormDataListener` | create | 同步表单字段到流程变量,更新业务标题,触发简流事件 |
|
||||
| `org.jeecg.modules.extbpm.listener.task.TaskCreatedAutoSubmitListener` | create | 草稿节点首次自动提交(sameMode=2),自动设置发起人并完成任务 |
|
||||
| `org.jeecg.modules.extbpm.listener.task.SubProcessListener` | create | 子流程启动时传递主流程标题和业务号 |
|
||||
|
||||
#### 简流(jeecg-boot-module-mindesflow-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.listener.easyoa.TaskApprovalListener` | create | 简流版审批跳过监听 |
|
||||
| `org.jeecg.modules.extbpm.process.adapter.listener.ApproveResultBranchListener` | create | 审批结果分支标识变量设置 |
|
||||
| `org.jeecg.modules.extbpm.process.adapter.listener.BeforeEditListener` | create | 填写节点自定义表单数据ID设置 |
|
||||
|
||||
#### 业务(jeecg-boot-module-joa-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.testListenerExpression.TestTaskListener` | create/assign/complete/delete | 测试用监听器,记录各事件日志 |
|
||||
| `org.jeecg.modules.listener.announcement.NoticeReviewEndListener` | complete | 公告审核完成自动发布 |
|
||||
| `org.jeecg.modules.listener.easyoa.DistributeIssuedEndListener` | complete | 公文发文分发,按抄送部门创建分发记录 |
|
||||
| `org.jeecg.modules.listener.easyoa.NewsReviewEndListener` | complete | 新闻审核完成自动发布 |
|
||||
|
||||
### 4.2 ExecutionListener 实现类(12个)
|
||||
|
||||
#### 平台核心(jeecg-boot-module-bpm-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener` | end | 流程结束更新状态、处理表单数据、清Redis缓存(**必需**) |
|
||||
| `org.jeecg.modules.extbpm.listener.execution.SignalProcessStartListener` | start | 信号启动流程初始化变量、获取表单数据、设置业务key |
|
||||
| `org.jeecg.modules.extbpm.listener.execution.SubProcessStartListener` | start | 子流程启动传递主流程标题、表单key、数据ID |
|
||||
| `org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener` | start | 会签子流程启动传递主流程变量、表单URL和业务数据 |
|
||||
|
||||
#### 简流(jeecg-boot-module-mindesflow-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.minides.listener.ProcessEndRemoveRedisListener` | end | 简流结束清Redis缓存 |
|
||||
| `org.jeecg.modules.minides.listener.MiniSubProcessStartListener` | start | 简流子流程启动初始化,传递流程变量 |
|
||||
| `org.jeecg.modules.extbpm.process.adapter.delegate.MiniCallActivityListener` | start | 简流调用活动参数传递,处理系统变量和工作表映射 |
|
||||
|
||||
#### 业务(jeecg-boot-module-joa-flowable)
|
||||
|
||||
| 完整类路径 | 事件 | 说明 |
|
||||
|-----------|------|------|
|
||||
| `org.jeecg.modules.designform.listener.DesformAutoNumberListener` | start | 表单设计器自动编号 |
|
||||
| `org.jeecg.modules.testListenerExpression.TestExecutionListener` | start/end | 测试用执行监听器 |
|
||||
| `org.jeecg.modules.listener.easyoa.ReveicedStartListener` | end | 公文收文分发,根据部门信息分发任务 |
|
||||
| `org.jeecg.modules.listener.easyoa.OaOfficialdocStartListener` | start | 公文表单监听,校验各节点意见字段 |
|
||||
| `org.jeecg.modules.extbpm.listener.execution.ProcessEndListener`(JOA副本) | end | OA模块流程结束处理(与平台核心同类名,不同模块) |
|
||||
41
.trae/skills/jeecg-bpmn/references/bpmn-templates.md
Normal file
41
.trae/skills/jeecg-bpmn/references/bpmn-templates.md
Normal 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`
|
||||
121
.trae/skills/jeecg-bpmn/references/bpmn-xml-skeleton.md
Normal file
121
.trae/skills/jeecg-bpmn/references/bpmn-xml-skeleton.md
Normal 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" />
|
||||
```
|
||||
63
.trae/skills/jeecg-bpmn/references/example/主流程(会签主子流程).bpmn
Normal file
63
.trae/skills/jeecg-bpmn/references/example/主流程(会签主子流程).bpmn
Normal 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>
|
||||
64
.trae/skills/jeecg-bpmn/references/example/借款申请(子流程).bpmn
Normal file
64
.trae/skills/jeecg-bpmn/references/example/借款申请(子流程).bpmn
Normal 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>
|
||||
112
.trae/skills/jeecg-bpmn/references/example/出差申请(主子流程).bpmn
Normal file
112
.trae/skills/jeecg-bpmn/references/example/出差申请(主子流程).bpmn
Normal 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>
|
||||
109
.trae/skills/jeecg-bpmn/references/example/包含网关测试.bpmn
Normal file
109
.trae/skills/jeecg-bpmn/references/example/包含网关测试.bpmn
Normal 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>
|
||||
444
.trae/skills/jeecg-bpmn/references/example/合同付款审批单.bpmn
Normal file
444
.trae/skills/jeecg-bpmn/references/example/合同付款审批单.bpmn
Normal 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":true,"isEmptyAssignedByPreviousNode":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="拟稿部门为'控股集团/天津临港建设开发有限公司/综合业务部'" 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="{"sameMode":4,"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:incoming>Flow_0305r4s</bpmn2:incoming>
|
||||
<bpmn2:outgoing>Flow_1q3qzvz</bpmn2:outgoing>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:sequenceFlow id="Flow_0305r4s" name="拟稿部门不为'控股集团/天津临港建设开发有限公司/综合业务部'" 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"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: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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"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: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="{"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: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="{"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: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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":true,"isEmptyAssignedByPreviousNode":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="拟稿部门是 '控股集团/天津临港建设开发有限公司/综合业务部'" 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="拟稿人职级不为“部长”;拟稿部门不是'控股集团/天津临港建设开发有限公司/综合管理部、综合业务部'" 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="拟稿部门是 '控股集团/天津临港建设开发有限公司/综合管理部'" 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="拟稿人职级是“部长”;拟稿部门不是'控股集团/天津临港建设开发有限公司/综合管理部、综合业务部'" 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":true,"isEmptyAssignedByPreviousNode":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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>
|
||||
398
.trae/skills/jeecg-bpmn/references/example/合同审批单.bpmn
Normal file
398
.trae/skills/jeecg-bpmn/references/example/合同审批单.bpmn
Normal 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, '1958470865577902082')}" flowable:groupType="position">
|
||||
<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: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, '1958470912214368258')}" flowable:groupType="position">
|
||||
<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: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="{"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: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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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,'select_user_1757424592515_554890','select-user')}" flowable:groupType="formData" flowable:countersignRule="countersign_all">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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,'eyJhdWRpdG9yVXNlclR5cGUiOiJmb3JtRGF0YSIsImF1ZGl0b3JDb3VudGVyc2lnbkZvcm1GaWVsZCI6InNlbGVjdF91c2VyXzE3NTc0MjQ1OTI1MTVfNTU0ODkwIiwiYXVkaXRvckNvdW50ZXJzaWduRm9ybUZpZWxkVHlwZSI6InNlbGVjdC11c2VyIiwiZGVzZm9ybUNvZGUiOiJndW9qdS1oZV90b25nX3NoZW5fcGlfZGFuX2ppbmJhb3poaWtlIn0=')}" 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="{"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: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="{"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: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="{"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: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="{"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: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="{"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: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="{"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: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>
|
||||
45
.trae/skills/jeecg-bpmn/references/example/子流程(会签主子流程).bpmn
Normal file
45
.trae/skills/jeecg-bpmn/references/example/子流程(会签主子流程).bpmn
Normal 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>
|
||||
46
.trae/skills/jeecg-bpmn/references/example/并行会签测试.bpmn
Normal file
46
.trae/skills/jeecg-bpmn/references/example/并行会签测试.bpmn
Normal 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>
|
||||
283
.trae/skills/jeecg-bpmn/references/example/档案查借阅审批表.bpmn
Normal file
283
.trae/skills/jeecg-bpmn/references/example/档案查借阅审批表.bpmn
Normal 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="{"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: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="{"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: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="{"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:incoming>Flow_1442ka9</bpmn2:incoming>
|
||||
<bpmn2:outgoing>Flow_1hz4oth</bpmn2:outgoing>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:userTask id="Task_0s10sxf" name="分管领导" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,'2004720656484859905')}" flowable:groupType="approvalRole">
|
||||
<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: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="{"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: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="{"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:incoming>Flow_16asn4s</bpmn2:incoming>
|
||||
<bpmn2:outgoing>Flow_09oe88o</bpmn2:outgoing>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:userTask id="Task_0kjzelu" name="档案管理员" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,'2032291035773501441')}" flowable:groupType="approvalRole">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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>
|
||||
299
.trae/skills/jeecg-bpmn/references/example/用章申请建设.bpmn
Normal file
299
.trae/skills/jeecg-bpmn/references/example/用章申请建设.bpmn
Normal 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":true,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"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_0lcmkhr" name="总经理1" flowable:candidateGroups="1960962848568545281" flowable:groupType="deptPosition">
|
||||
<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: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="{"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: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="{"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:outgoing>Flow_0m6zmyi</bpmn2:outgoing>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:userTask id="Task_1p5kogt" name="控股财务分管领导" flowable:candidateGroups="1960962855795331073" flowable:groupType="deptPosition">
|
||||
<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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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>
|
||||
164
.trae/skills/jeecg-bpmn/references/example/督办流程.bpmn
Normal file
164
.trae/skills/jeecg-bpmn/references/example/督办流程.bpmn
Normal 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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>=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, '1958470912214368258')}" 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>
|
||||
109
.trae/skills/jeecg-bpmn/references/example/示例测排他网关.bpmn
Normal file
109
.trae/skills/jeecg-bpmn/references/example/示例测排他网关.bpmn
Normal 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>3}</conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow1554878185509" name="小于等于三天" sourceRef="exclusiveGateway1554878161805" targetRef="task1554878176409">
|
||||
<conditionExpression xsi:type="tFormalExpression">${total<=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>
|
||||
177
.trae/skills/jeecg-bpmn/references/example/车辆维修保养审批单.bpmn
Normal file
177
.trae/skills/jeecg-bpmn/references/example/车辆维修保养审批单.bpmn
Normal 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":true,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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,'2028664690455707650')}" flowable:groupType="approvalRole">
|
||||
<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: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="{"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: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,'2004720656484859905')}" flowable:groupType="approvalRole">
|
||||
<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: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="{"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: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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":false,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":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,'2026853145785352193')}" flowable:groupType="approvalRole">
|
||||
<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: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>
|
||||
208
.trae/skills/jeecg-bpmn/references/example/采购申请单.bpmn
Normal file
208
.trae/skills/jeecg-bpmn/references/example/采购申请单.bpmn
Normal 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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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,'select_user_1773283169997_557924','select-user')}" flowable:groupType="formData" flowable:countersignRule="countersign_custom">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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>=1}</bpmn2:completionCondition>
|
||||
</bpmn2:multiInstanceLoopCharacteristics>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:userTask id="Task_0x7t6mg" name="申请部门分管领导" flowable:candidateUsers="${flowUtil.getUsersByApprRole(execution,'1977974561067126786')}" flowable:groupType="approvalRole">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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,'select_user_1773283205332_942723','select-user')}" flowable:groupType="formData" flowable:countersignRule="countersign_custom">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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>=1}</bpmn2:completionCondition>
|
||||
</bpmn2:multiInstanceLoopCharacteristics>
|
||||
</bpmn2:userTask>
|
||||
<bpmn2:userTask id="Task_0st5yv4" name="总经理" flowable:candidateGroups="1960962884220129282" flowable:groupType="deptPosition">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":false,"isSkipApprovedOnCountersignReturn":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,'1977974561067126786')}" flowable:groupType="approvalRole">
|
||||
<bpmn2:extensionElements>
|
||||
<flowable:taskExtendJson value="{"sameMode":0,"isSkipAssigneeEmpty":false,"isSkipAssigneeOnePersion":true,"isSkipApproval":false,"isAssignedByPreviousNode":false,"isEmptyAssignedByPreviousNode":true,"isSkipApprovedOnCountersignReturn":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>
|
||||
46
.trae/skills/jeecg-bpmn/references/example/顺序会签流程.bpmn
Normal file
46
.trae/skills/jeecg-bpmn/references/example/顺序会签流程.bpmn
Normal 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>
|
||||
Reference in New Issue
Block a user