flowable工作流使用讲解-230109

1、程序运行

程序首次运行之后需要运行一下运行以下sql文件,此sql文件影响流程测试中的功能使用:

请假申请建表sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DROP TABLE IF EXISTS leaveapply;
CREATE SEQUENCE leaveapply_seq;
CREATE TABLE leaveapply(
id int NOT NULL DEFAULT NEXTVAL ('leaveapply_seq'),
user_id varchar(20) NULL DEFAULT NULL ,
start_time timestamp(0) NULL DEFAULT NULL ,
end_time timestamp(0) NULL DEFAULT NULL ,
leave_type varchar(45) NULL DEFAULT NULL ,
reason varchar(400) NULL DEFAULT NULL ,
apply_time timestamp(0) NULL DEFAULT NULL ,
reality_start_time timestamp(0) NULL DEFAULT NULL ,
reality_end_time timestamp(0) NULL DEFAULT NULL ,
PRIMARY KEY (id)
);

ALTER SEQUENCE leaveapply_seq RESTART WITH 1;


COMMENT ON TABLE public.leaveapply IS '请假表';

COMMENT ON COLUMN public.leaveapply.id IS '主键';
COMMENT ON COLUMN public.leaveapply.user_id IS '请假人';
COMMENT ON COLUMN public.leaveapply.start_time IS '起始时间';
COMMENT ON COLUMN public.leaveapply.end_time IS '结束时间';
COMMENT ON COLUMN public.leaveapply.leave_type IS '类型';
COMMENT ON COLUMN public.leaveapply.reason IS '原因';
COMMENT ON COLUMN public.leaveapply.apply_time IS '申请时间';
COMMENT ON COLUMN public.leaveapply.reality_start_time IS '实际起始时间';
COMMENT ON COLUMN public.leaveapply.reality_end_time IS '实际结束时间';

采购申请建表sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP TABLE IF EXISTS purchase;
-- SQLINES LICENSE FOR EVALUATION USE ONLY
CREATE SEQUENCE purchase_seq;

CREATE TABLE purchase (
id int NOT NULL DEFAULT NEXTVAL ('purchase_seq'),
itemlist text NOT NULL,
total varchar(10) NOT NULL,
applytime timestamp(0) NULL DEFAULT NULL,
applyer varchar(45) NULL DEFAULT NULL,
processinstanceid varchar(50) NULL DEFAULT NULL,
PRIMARY KEY (id)
);

ALTER SEQUENCE purchase_seq RESTART WITH 4;

发起会议建表sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DROP TABLE IF EXISTS meeting;
-- SQLINES LICENSE FOR EVALUATION USE ONLY
CREATE SEQUENCE meeting_seq;

CREATE TABLE meeting (
id int NOT NULL DEFAULT NEXTVAL ('meeting_seq') ,
topic varchar(100) NULL DEFAULT NULL ,
host varchar(50) NULL DEFAULT NULL ,
place varchar(50) NULL DEFAULT NULL ,
peoplelist varchar(255) NULL DEFAULT NULL ,
start_time timestamp(0) NULL DEFAULT NULL ,
end_time timestamp(0) NULL DEFAULT NULL ,
content text NULL ,
PRIMARY KEY (id)
);

ALTER SEQUENCE meeting_seq RESTART WITH 1;

执行完成之后,流程测试下的三个功能即可使用。

2、系统原流程的初步介绍

本节以请假申请(Leaveapply)为例

2.1、程序的层级结构

LeaveapplyController:控制层,控制业务逻辑流程。
Controller层负责具体的业务模块流程的控制,主要调用Service层里面的接口去控制具体的业务流程,控制的配置也需要在配置文件中进行配置。
与Service层不同,Controller层负责具体的业务模块流程的控制,Service层负责业务模块的逻辑应用设置。
Controller层一般会与前台的js文件进行数据的交互。

Leaveapply:实体层,用于存放实体类,与数据库中的属性值基本保持一致,包含有该实体类的属性和对应属性的get、set方法。

ILeaveapplyService:Service接口
LeaveapplyServiceImpl:Service业务层处理
Service层主要负责业务模块的逻辑应用设计,先创建接口,再创建相应的实现类,然后在配置文件里进行配置实现其关联,接着就可以调用service层的接口进行业务逻辑应用的处理。
对Service层的业务逻辑进行封装有利于业务逻辑的独立性和重复利用性。

LeaveapplyMapper.java:Mapper接口,在mybatis中主要与xxx.xml内相互一一映射。
LeaveapplyMapper.xml:映射文件。
dao(mapper)层:数据访问层
DAO层首先会创建DAO接口,然后在配置文件中定义该接口的具体实现类,接着就可以在模块中调用DAO的接口并进行相应数据业务的处理,不需要去关注该接口的具体实现类是什么。
DAO层的数据源和数据库连接的参数都是在配置文件中进行配置的,主要对数据进行持久化操作,对外提供对数据库的增删改查操作。

前端页面,主要与控制层进行数据交互。

2.2、工作流的运行流程

2.2.1、通过flowable UI搭建流程图

请假流程信息图如下:

1、创建流程:流程标识以及流程名称的填写,此处在构建流程的时候进行编辑

2、用户任务:分配用户和表单标识的填写
分配用户:

表单标识:

3、异或网关的使用,与流程线上的表达式配合使用

流程线上设置流通过条件

注:
1、在进行流程图绘制的时候注意保存,此UI界面会出现不稳定的状况,多保存有百利而无一害。
2、此流程图只是用到的最基本的组件,其还有更多的功能可以探索和配置。

2.2.2、流程的使用

2.2.2.1、发起请假申请

下一步接受保存之后的数据传输状况:

service接口层

service业务处理层

1、将相关数据更新的数据库中,对其进行持久化

2、每次新增一条请假信息的时候,都需要新增一个流程,所以需要对流程进行初始化。

其在生成的xml文件对应的信息为:

此处填写完成applyuserid与deptleader的值也是为了完成第一个任务
3、因已经完成相关信息的填写,所以也需要结束第一个任务。

其根据key值以及id确定流程,然后对其进行完成。
此时流程所处的位置:

2.2.2.2、部门领导审批

办理人确认

下方所展示的为生成流程文件中对应的信息

controller层的整理数据,引出前端页面

前端页面:

对应的前端页面所在位置:rain-workflow/src/main/resources/templates/flowable/leaveapply/deptleadercheck.html
关键部分的前端代码为:

对应的,JS对其进行处理的方法

对应的流程变量为:

任务处理后端实现:

此处为flowable的相关接口与语法,不再进行介绍。
执行完成之后,即完成了此节点的任务。
此时流程处于:

2.2.2.3结语

以下的相关流程均与其原理相似,可查看相关源代码学习

3、实操

3.1、业务分析

选取的流程业务如下:

红色框住的相关部分,需要在申请的时候填写,其与部分均在流程中进行填写。

3.2、设计表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DROP TABLE IF EXISTS chafengshenpibiao;
CREATE SEQUENCE chafengshenpibiao_seq;
CREATE TABLE chafengshenpibiao(
id int NOT NULL DEFAULT NEXTVAL ('chafengshenpibiao_seq'),
user_id varchar(20) NULL DEFAULT NULL ,
blbm varchar(100) NULL DEFAULT NULL ,
blbm_time timestamp(0) NULL DEFAULT NULL ,
cfky_person varchar(100) NULL DEFAULT NULL ,
qwdf varchar(100) NULL DEFAULT NULL ,
cfky_reason varchar(2000) NULL DEFAULT NULL ,
cfky_th varchar(4000) NULL DEFAULT NULL ,
blbmzr_opinion varchar(1000) NULL DEFAULT NULL ,
glwy_opinion varchar(1000) NULL DEFAULT NULL ,
glfzr_opinion varchar(1000) NULL DEFAULT NULL ,
remark_all varchar(1000) NULL DEFAULT NULL ,
PRIMARY KEY (id)
);

ALTER SEQUENCE chafengshenpibiao_seq RESTART WITH 1;

-- 注释
COMMENT ON TABLE public.chafengshenpibiao IS '查封/扣押审批表';

COMMENT ON COLUMN public.chafengshenpibiao.id IS '主键';
COMMENT ON COLUMN public.chafengshenpibiao.user_id IS '提交审批表人';
COMMENT ON COLUMN public.chafengshenpibiao.blbm IS '办理部门';
COMMENT ON COLUMN public.chafengshenpibiao.blbm_time IS '时间';
COMMENT ON COLUMN public.chafengshenpibiao.cfky_person IS '查封-扣押人物';
COMMENT ON COLUMN public.chafengshenpibiao.qwdf IS '前往地方';
COMMENT ON COLUMN public.chafengshenpibiao.cfky_reason IS '查封-扣押原因';
COMMENT ON COLUMN public.chafengshenpibiao.cfky_th IS '查封-扣押的东西';
COMMENT ON COLUMN public.chafengshenpibiao.blbmzr_opinion IS '办理部门主任意见';
COMMENT ON COLUMN public.chafengshenpibiao.glwy_opinion IS '管理委员意见';
COMMENT ON COLUMN public.chafengshenpibiao.glfzr_opinion IS '管理副主任意见';
COMMENT ON COLUMN public.chafengshenpibiao.remark_all IS '备注';

3.3、生成表单以及程序导入

注意java类型的选择,选择错误会导致程序功能报错

生成的sql语句只需要执行第一个,其他的不需要执行

程序存放地方发生变化,请注意区分:

对比此处的程序结构,其和上面所介绍的程序基本相似,所以我们在生成的表单上进行在开发。

3.4、搭建流程图

1、新建模型

2、流程图设计

3、用户任务分配

4、表单的标识:

5、流条件设计

1
${approve==''}

6、确认完成流程图之后,将流程图下载下来,放入项目中。

7、重新编译运行,查看流程是否自动发布部署。

3.5、程序的编写

3.5.1、提前需要做的

文件:

添加的代码为:

1
useGeneratedKeys="true" keyProperty="id"

文件:

添加的代码为:

1
2
3
4
5
6
7
8
@Autowired  
private ISysUserService userService;

@Resource
private RuntimeService runtimeService;

@Resource
private TaskService taskService;

文件:

添加的代码为:

1
2
3
4
5
6
7
8
9
10
11
@Resource  
private RuntimeService runtimeService;

@Resource
private TaskService taskService;

@Resource
IdentityService identityService;

@Resource
HistoryService historyService;

3.5.2、办理部门填写审批表

3.5.2.1、前端渲染

controller层

前端页面需要进行相关的修改

3.5.2.2、新建保存,流程的初始化

主要是对ChafengshenpibiaoServiceImpl.java进行编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**  
* 新增查封-扣押流程
*
* @param chafengshenpibiao 查封-扣押流程
* @return 结果
*/
@Override
public int insertChafengshenpibiao(Chafengshenpibiao chafengshenpibiao)
{
int rows = chafengshenpibiaoMapper.insertChafengshenpibiao(chafengshenpibiao);
// 发起请假流程
identityService.setAuthenticatedUserId(chafengshenpibiao.getUserId());
HashMap<String, Object> variables = new HashMap<>();
variables.put("applyuserid", chafengshenpibiao.getUserId());
variables.put("blbmzr", chafengshenpibiao.getBlbmzr());
runtimeService.startProcessInstanceByKey("chafengkouyaflow", String.valueOf(chafengshenpibiao.getId()), variables);
// 自动完成第一个任务
Task autoTask = taskService.createTaskQuery().processDefinitionKey("chafengkouyaflow").processInstanceBusinessKey(String.valueOf(chafengshenpibiao.getId())).singleResult();
taskService.complete(autoTask.getId());

return rows;
}

3.5.3、办理部门主任审批意见

controller层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 /**  
* 办理部门主任审批意见
* @return
*/
@GetMapping("/blbmzrcheck")
public String blbmzrcheck(String taskid, ModelMap mmap) {
Task t = taskService.createTaskQuery().taskId(taskid).singleResult();
String processId = t.getProcessInstanceId();
ProcessInstance p = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
if (p != null) {
Chafengshenpibiao chafengshenpibiao = chafengshenpibiaoService.selectChafengshenpibiaoById(Long.parseLong(p.getBusinessKey()));
mmap.put("chafengshenpibiao", chafengshenpibiao);
mmap.put("taskid", taskid);
mmap.put("userlist", userService.selectUserList(new SysUser()));
}
return prefix + "/blbmzrcheck";
}

本回合的重点在于前端页面的相关更改

3.5.4、管理委员意见

此处和 3.5.3 类似

3.5.6、管理副主任意见

此处和 3.5.3 类似

3.5.7、重新提交申请

controller层与 3.5.3 类似
前端需要另外操作。

4、工作流上传文件

参考链接:
https://blog.csdn.net/zhongzk69/article/details/90940280

5、flowable提升

官网:
https://www.flowable.com/

英文文档:
https://www.flowable.com/open-source/docs/bpmn/ch02-GettingStarted/

中文文档:
https://tkjohn.github.io/flowable-userguide/#_introduction
外网,不科学上网访问速度慢
http://43.142.65.122:6888/
私人服务器,访问速度尚可,将在 2023-06-09 到期。
中文文档其他相关链接
https://gitee.com/JinTianHeNinMengCha/flowable

视频教程:
https://www.bilibili.com/video/BV1PY411F7ir/
系统讲解flowable的相关原理
https://www.bilibili.com/video/BV1SG4y117fw/
RuoYi-Flowable-Plus的视频讲解


flowable工作流使用讲解-230109
http://yuanql.top/2023/01/09/40_flowable/flowable工作流使用讲解-230109/
作者
Qingli Yuan
发布于
2023年1月9日
许可协议