Skip to content

Commit d2b9933

Browse files
YunaiVgitee-org
authored andcommitted
!735 2.4.2:工作流的更新
Merge pull request !735 from 芋道源码/feature/bpm
2 parents b63179e + b452b08 commit d2b9933

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2922
-1486
lines changed

README.md

+55-32
Original file line numberDiff line numberDiff line change
@@ -117,54 +117,77 @@
117117

118118
### 工作流程
119119

120-
| | 功能 | 描述 |
121-
|----|-------|-----------------------------------------|
122-
| 🚀 | 流程模型 | 配置工作流的流程模型,支持 BPMN 和仿钉钉/飞书设计器 |
123-
| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 |
124-
| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 |
125-
| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 |
126-
| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转派、委派、退回、加减签等操作 |
127-
| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,支持流程预测,展示未来审批人信息 |
128-
| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
129-
130120
![功能图](/.image/common/bpm-feature.png)
131121

122+
基于 Flowable 构建,可支持信创(国产)数据库,满足中国特色流程操作:
123+
132124
| BPMN 设计器 | 钉钉/飞书设计器 |
133125
|------------------------------|--------------------------------|
134126
| ![](/.image/工作流设计器-bpmn.jpg) | ![](/.image/工作流设计器-simple.jpg) |
135127

128+
> 历经头部企业生产验证,工作流引擎须标配仿钉钉/飞书 + BPMN 双设计器!!!
129+
>
130+
> 前者支持轻量配置简单流程,后者实现复杂场景深度编排
131+
132+
| 功能列表 | 功能描述 | 是否完成 |
133+
|------------|-------------------------------------------------------------------------------------|------|
134+
| SIMPLE 设计器 | 仿钉钉/飞书设计器,支持拖拽搭建表单流程,10 分钟快速完成审批流程配置 ||
135+
| BPMN 设计器 | 基于 BPMN 标准开发,适配复杂业务场景,满足多层级审批及流程自动化需求 ||
136+
| 会签 | 同一个审批节点设置多个人(如 A、B、C 三人,三人会同时收到待办任务),需全部同意之后,审批才可到下一审批节点 ||
137+
| 或签 | 同一个审批节点设置多个人,任意一个人处理后,就能进入下一个节点 ||
138+
| 依次审批 | (顺序会签)同一个审批节点设置多个人(如 A、B、C 三人),三人按顺序依次收到待办,即 A 先审批,A 提交后 B 才能审批,需全部同意之后,审批才可到下一审批节点 ||
139+
| 抄送 | 将审批结果通知给抄送人,同一个审批默认排重,不重复抄送给同一人 ||
140+
| 驳回 | (退回)将审批重置发送给某节点,重新审批。可驳回至发起人、上一节点、任意节点 ||
141+
| 转办 | A 转给其 B 审批,B 审批后,进入下一节点 ||
142+
| 委派 | A 转给其 B 审批,B 审批后,转给 A,A 继续审批后进入下一节点 ||
143+
| 加签 | 允许当前审批人根据需要,自行增加当前节点的审批人,支持向前、向后加签 ||
144+
| 减签 | (取消加签)在当前审批人操作之前,减少审批人 ||
145+
| 撤销 | (取消流程)流程发起人,可以对流程进行撤销处理 ||
146+
| 终止 | 系统管理员,在任意节点终止流程实例 ||
147+
| 表单权限 | 支持拖拉拽配置表单,每个审批节点可配置只读、编辑、隐藏权限 ||
148+
| 超时审批 | 配置超时审批时间,超时后自动触发审批通过、不通过、驳回等操作 ||
149+
| 自动提醒 | 配置提醒时间,到达时间后自动触发短信、邮箱、站内信等通知提醒,支持自定义重复提醒频次 ||
150+
| 父子流程 | 主流程设置子流程节点,子流程节点会自动触发子流程。子流程结束后,主流程才会执行(继续往下下执行),支持同步子流程、异步子流程 ||
151+
| 条件分支 | (排它分支)用于在流程中实现决策,即根据条件选择一个分支执行 ||
152+
| 并行分支 | 允许将流程分成多条分支,不进行条件判断,所有分支都会执行 ||
153+
| 包容分支 | (条件分支 + 并行分支的结合体)允许基于条件选择多条分支执行,但如果没有任何一个分支满足条件,则可以选择默认分支 ||
154+
| 路由分支 | 根据条件选择一个分支执行(重定向到指定配置节点),也可以选择默认分支执行(继续往下执行) ||
155+
| 触发节点 | 执行到该节点,触发 HTTP 请求、HTTP 回调、更新数据、删除数据等 ||
156+
| 延迟节点 | 执行到该节点,审批等待一段时间再执行,支持固定时长、固定日期等 ||
157+
| 拓展设置 | 流程前置/后置通知,节点(任务)前置、后置通知,流程报表,自动审批去重,自定流程编号、标题、摘要,流程报表等 ||
158+
136159
### 支付系统
137160

138161
| | 功能 | 描述 |
139162
|-----|------|---------------------------|
140-
| 🚀 | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能 |
141163
| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 |
142164
| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 |
143165
| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 |
144-
145-
ps:核心功能已经实现,正在对接微信小程序中...
166+
| 🚀 | 回调通知 | 查看支付回调业务的【支付】【退款】的通知结果 |
167+
| 🚀 | 接入示例 | 提供接入支付系统的【支付】【退款】的功能实战 |
146168

147169
### 基础设施
148170

149-
| | 功能 | 描述 |
150-
|----|----------|----------------------------------------------|
151-
| 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 |
152-
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
153-
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
154-
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 |
155-
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
156-
| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
157-
| 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 |
158-
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
159-
| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 |
160-
| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
161-
| 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 |
162-
| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
163-
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
164-
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
165-
| 🚀 | 服务保障 | 基于 Redis 实现分布式锁、幂等、限流功能,满足高并发场景 |
166-
| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
167-
| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
171+
| | 功能 | 描述 |
172+
|-----|-----------|----------------------------------------------|
173+
| 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 |
174+
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
175+
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
176+
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 |
177+
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
178+
| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
179+
| 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 |
180+
| 🚀 | WebSocket | 提供 WebSocket 接入示例,支持一对一、一对多发送方式 |
181+
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
182+
| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 |
183+
| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
184+
| 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 |
185+
| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
186+
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
187+
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
188+
| 🚀 | 服务保障 | 基于 Redis 实现分布式锁、幂等、限流功能,满足高并发场景 |
189+
| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
190+
| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
168191

169192
![功能图](/.image/common/infra-feature.png)
170193

build/vite/optimize.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ const include = [
114114
'element-plus/es/components/segmented/style/css',
115115
'@element-plus/icons-vue',
116116
'element-plus/es/components/footer/style/css',
117-
'element-plus/es/components/empty/style/css'
117+
'element-plus/es/components/empty/style/css',
118+
'element-plus/es/components/mention/style/css'
118119
]
119120

120121
const exclude = ['@iconify/json']

src/api/bpm/definition/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,9 @@ export const getProcessDefinitionList = async (params) => {
2020
params
2121
})
2222
}
23+
24+
export const getSimpleProcessDefinitionList = async () => {
25+
return await request.get({
26+
url: '/bpm/process-definition/simple-list'
27+
})
28+
}

src/api/bpm/processInstance/index.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,12 @@ export const getProcessInstanceCopyPage = async (params: any) => {
9090

9191
// 获取审批详情
9292
export const getApprovalDetail = async (params: any) => {
93-
return await request.get({ url: 'bpm/process-instance/get-approval-detail', params })
93+
return await request.get({ url: '/bpm/process-instance/get-approval-detail', params })
94+
}
95+
96+
// 获取下一个执行的流程节点
97+
export const getNextApprovalNodes = async (params: any) => {
98+
return await request.get({ url: '/bpm/process-instance/get-next-approval-nodes', params })
9499
}
95100

96101
// 获取表单字段权限

src/assets/svgs/bpm/child-process.svg

+1
Loading

src/assets/svgs/bpm/transactor.svg

+1
Loading

src/components/SimpleProcessDesignerV2/src/NodeHandler.vue

+42-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
</div>
1616
<div class="handler-item-text">审批人</div>
1717
</div>
18+
<div class="handler-item" @click="addNode(NodeType.TRANSACTOR_NODE)">
19+
<div class="transactor handler-item-icon">
20+
<span class="iconfont icon-transactor icon-size"></span>
21+
</div>
22+
<div class="handler-item-text">办理人</div>
23+
</div>
1824
<div class="handler-item" @click="addNode(NodeType.COPY_TASK_NODE)">
1925
<div class="handler-item-icon copy">
2026
<span class="iconfont icon-size icon-copy"></span>
@@ -57,7 +63,13 @@
5763
</div>
5864
<div class="handler-item-text">触发器</div>
5965
</div>
60-
</div>
66+
<div class="handler-item" @click="addNode(NodeType.CHILD_PROCESS_NODE)">
67+
<div class="handler-item-icon child-process">
68+
<span class="iconfont icon-size icon-child-process"></span>
69+
</div>
70+
<div class="handler-item-text">子流程</div>
71+
</div>
72+
</div>
6173
<template #reference>
6274
<div class="add-icon"><Icon icon="ep:plus" /></div>
6375
</template>
@@ -78,7 +90,7 @@ import {
7890
SimpleFlowNode,
7991
DEFAULT_CONDITION_GROUP_VALUE
8092
} from './consts'
81-
import {generateUUID} from '@/utils'
93+
import { generateUUID } from '@/utils'
8294
8395
defineOptions({
8496
name: 'NodeHandler'
@@ -114,13 +126,13 @@ const addNode = (type: number) => {
114126
}
115127
116128
popoverShow.value = false
117-
if (type === NodeType.USER_TASK_NODE) {
129+
if (type === NodeType.USER_TASK_NODE || type === NodeType.TRANSACTOR_NODE) {
118130
const id = 'Activity_' + generateUUID()
119131
const data: SimpleFlowNode = {
120132
id: id,
121-
name: NODE_DEFAULT_NAME.get(NodeType.USER_TASK_NODE) as string,
133+
name: NODE_DEFAULT_NAME.get(type) as string,
122134
showText: '',
123-
type: NodeType.USER_TASK_NODE,
135+
type: type,
124136
approveMethod: ApproveMethodType.SEQUENTIAL_APPROVE,
125137
// 超时处理
126138
rejectHandler: {
@@ -277,6 +289,31 @@ const addNode = (type: number) => {
277289
}
278290
emits('update:childNode', data)
279291
}
292+
if (type === NodeType.CHILD_PROCESS_NODE) {
293+
const data: SimpleFlowNode = {
294+
id: 'Activity_' + generateUUID(),
295+
name: NODE_DEFAULT_NAME.get(NodeType.CHILD_PROCESS_NODE) as string,
296+
showText: '',
297+
type: NodeType.CHILD_PROCESS_NODE,
298+
childNode: props.childNode,
299+
childProcessSetting: {
300+
calledProcessDefinitionKey: '',
301+
calledProcessDefinitionName: '',
302+
async: false,
303+
skipStartUserNode: false,
304+
startUserSetting: {
305+
type: 1
306+
},
307+
timeoutSetting: {
308+
enable: false
309+
},
310+
multiInstanceSetting: {
311+
enable: false
312+
}
313+
}
314+
}
315+
emits('update:childNode', data)
316+
}
280317
}
281318
</script>
282319

src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue

+14-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
/>
77
<!-- 审批节点 -->
88
<UserTaskNode
9-
v-if="currentNode && currentNode.type === NodeType.USER_TASK_NODE"
9+
v-if="
10+
currentNode &&
11+
(currentNode.type === NodeType.USER_TASK_NODE ||
12+
currentNode.type === NodeType.TRANSACTOR_NODE)
13+
"
1014
:flow-node="currentNode"
1115
@update:flow-node="handleModelValueUpdate"
1216
@find:parent-node="findFromParentNode"
@@ -50,12 +54,18 @@
5054
:flow-node="currentNode"
5155
@update:flow-node="handleModelValueUpdate"
5256
/>
53-
<!-- 触发器节点 -->
54-
<TriggerNode
57+
<!-- 触发器节点 -->
58+
<TriggerNode
5559
v-if="currentNode && currentNode.type === NodeType.TRIGGER_NODE"
5660
:flow-node="currentNode"
5761
@update:flow-node="handleModelValueUpdate"
5862
/>
63+
<!-- 子流程节点 -->
64+
<ChildProcessNode
65+
v-if="currentNode && currentNode.type === NodeType.CHILD_PROCESS_NODE"
66+
:flow-node="currentNode"
67+
@update:flow-node="handleModelValueUpdate"
68+
/>
5969
<!-- 递归显示孩子节点 -->
6070
<ProcessNodeTree
6171
v-if="currentNode && currentNode.childNode"
@@ -81,6 +91,7 @@ import InclusiveNode from './nodes/InclusiveNode.vue'
8191
import DelayTimerNode from './nodes/DelayTimerNode.vue'
8292
import RouterNode from './nodes/RouterNode.vue'
8393
import TriggerNode from './nodes/TriggerNode.vue'
94+
import ChildProcessNode from './nodes/ChildProcessNode.vue'
8495
import { SimpleFlowNode, NodeType } from './consts'
8596
import { useWatchNode } from './node'
8697
defineOptions({

0 commit comments

Comments
 (0)