activity表结构
表分类 | 表名 | 解释 |
一般数据 | ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 |
ACT_GE_PROPERTY | 系统相关属性 | |
流程历史记录 | ACT_HI_ACTINST | 历史的流程实例 |
ACT_HI_ATTACHMENT | 历史的流程附件 | |
ACT_HI_COMMENT | 历史的说明性信息 | |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 | |
ACT_HI_IDENTITYLINK | 历史的流程运行过程中用户关系 | |
ACT_HI_PROCINST | 历史的流程实例 | |
ACT_HI_TASKINST | 历史的任务实例 | |
ACT_HI_VARINST | 历史的流程运行中的变量信息 | |
用户用户组表 | ACT_ID_GROUP | 身份信息-组信息 |
ACT_ID_INFO | 身份信息-组信息 | |
ACT_ID_MEMBERSHIP | 身份信息-用户和组关系的中间表 | |
ACT_ID_USER | 身份信息-用户信息 | |
流程定义表 | ACT_RE_DEPLOYMENT | 部署单元信息 |
ACT_RE_MODEL | 模型信息 | |
ACT_RE_PROCDEF | 已部署的流程定义 | |
运行实例表 | ACT_RU_EVENT_SUBSCR | 运行时事件 |
ACT_RU_EXECUTION | 运行时流程执行实例 | |
ACT_RU_IDENTITYLINK | 运行时用户关系信息 | |
ACT_RU_JOB | 运行时作业 | |
ACT_RU_TASK | 运行时任务 | |
ACT_RU_VARIABLE | 运行时变量表 |
//查询部署信息
代码:List<Deployment> list = repositoryService.createDeploymentQuery().deploymentNameLike("%" + name + "%")
.listPage(firstResult, maxResults);
SQL: select distinct RES.* from ACT_RE_DEPLOYMENT RES WHERE RES.NAME_ like ? order by RES.ID_ asc LIMIT ? OFFSET ?
参数: %%(String), 10(Integer), 0(Integer)
//查询流程定义 根据多个部署ID 查
代码:List<ProcessDefinition> list = this.repositoryService.createProcessDefinitionQuery()
.deploymentIds(deploymentIds).listPage(firstResult, maxResults);
SQL:select distinct RES.* from ACT_RE_PROCDEF RES WHERE RES.DEPLOYMENT_ID_ in ( ? , ? , ? , ? , ? ) order by RES.ID_ asc LIMIT ? OFFSET ?
参数:%%(String), 5(Integer), 0(Integer)
//查询流程定义 根据一个部署ID 查
代码:ProcessDefinition processDefinition = this.repositoryService.createProcessDefinitionQuery()
.deploymentId(deploymentId).singleResult();
SQL: select distinct RES.* from ACT_RE_PROCDEF RES WHERE RES.DEPLOYMENT_ID_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?
参数:1(String), 2147483647(Integer), 0(Integer)
//查询流程图
ProcessDefinition processDefinition = this.repositoryService.createProcessDefinitionQuery()
.deploymentId(deploymentId).singleResult();
// 2从流程定义对象里面得到图片的名称
String resourceName = processDefinition.getDiagramResourceName();
代码:InputStream stream = this.repositoryService.getResourceAsStream(deploymentId, resourceName);
SQL: select * from ACT_GE_BYTEARRAY where DEPLOYMENT_ID_ = ? AND NAME_ = ?
参数:1(String), HelloWorld.png(String)
//启动流程
代码:String processDefinitionKey = LeaveBill.class.getSimpleName(); //ACT_RE_PROCDEF 表里的KEY值,这里写死了和类名一样的名字,就是部署的名字
Map<String, Object> variables = new HashMap<>();
// 设置流程变量去设置下个任务的办理人
variables.put("username", SessionUtils.getCurrentUserName());
this.runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
// 1.查询最大版本号
SQL:select * from ACT_RE_PROCDEF where KEY_ = ? and (TENANT_ID_ = '' or TENANT_ID_ is null) and VERSION_ = (select max(VERSION_) from ACT_RE_PROCDEF where KEY_ = ? and (TENANT_ID_ = '' or TENANT_ID_ is null))
参数:LeaveBill(String), LeaveBill(String)
//2.根据最大版本号查询流程定义表
SQL:select * from ACT_RE_PROCDEF where ID_ = ?
参数:LeaveBill:1:5004(String)
//
select * from ACT_RU_JOB J where J.EXECUTION_ID_ = ?
参数:5005(String)
select distinct T.* from ACT_RU_TASK T where T.EXECUTION_ID_ = ?
参数:5005(String)
select * from ACT_RU_IDENTITYLINK where PROC_INST_ID_ = ?
参数:5005(String)
//添加数据
SQL: insert into ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5007(String), 5005(String), 5005(String), null, username(String), 0(Integer), string(String), null, null, null, 李四(String), null, 2021-05-25 17:11:25.844(Timestamp), 2021-05-25 17:11:25.844(Timestamp)
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_, CATEGORY_, TENANT_ID_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5009(String), LeaveBill:1:5004(String), 5005(String), 5005(String), 李四(String), null, null, null, 李四(String), 2021-05-25 17:11:25.93(Timestamp), null, null, null, null, usertask1(String), null, 50(Integer), null, null, (String)
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_, START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_, DELETE_REASON_, TENANT_ID_, NAME_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5005(String), 5005(String), LeaveBill:6(String), LeaveBill:1:5004(String), 2021-05-25 17:11:25.843(Timestamp), null, null, null, startevent1(String), null, null, null, (String), null
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_, TENANT_ID_ ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
参数: 5006(String), LeaveBill:1:5004(String), 5005(String), 5005(String), startevent1(String), null, null, Start(String), startEvent(String), null, 2021-05-25 17:11:25.844(Timestamp), 2021-05-25 17:11:25.924(Timestamp), 80(Long), (String), 5008(String), LeaveBill:1:5004(String), 5005(String), 5005(String), usertask1(String), 5009(String), null, 提交申请(String), userTask(String), 李四(String), 2021-05-25 17:11:25.925(Timestamp), null, null, (String)
DEBUG [http-nio-8080-exec-8] - <== Updates: 2
SQL: insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)
参数: 5010(String), participant(String), 李四(String), null, null, 5005(String)
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, SUSPENSION_STATE_, CACHED_ENT_STATE_, TENANT_ID_, NAME_) values ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5005(String), 5005(String), LeaveBill:6(String), LeaveBill:1:5004(String), usertask1(String), true(Boolean), false(Boolean), true(Boolean), false(Boolean), null, null, 1(Integer), 2(Integer), (String), null
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_, SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_) values (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5009(String), 提交申请(String), null, null, 50(Integer), 2021-05-25 17:11:25.925(Timestamp), null, 李四(String), null, 5005(String), 5005(String), LeaveBill:1:5004(String), usertask1(String), null, null, 1(Integer), (String), null
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, ?, ?, ?, ?)
参数: 5010(String), participant(String), 李四(String), null, null, 5005(String), null
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
SQL: insert into ACT_RU_VARIABLE (ID_, REV_, TYPE_, NAME_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_) values ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
参数: 5007(String), string(String), username(String), 5005(String), 5005(String), null, null, null, null, 李四(String), null
DEBUG [http-nio-8080-exec-8] - <== Updates: 1
//查询我的待办
select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?
参数:李四(String), 10(Integer), 0(Integer)
//待办任务 跳到页面
代码:Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
SQL: select distinct RES.* from ACT_RU_TASK RES WHERE RES.ID_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?
参数: 5009(String), 2147483647(Integer), 0(Integer)
4,根据流程实例ID查询流程实例
代码:ProcessInstance processInstance = this.runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
SQL: select distinct RES.* , P.KEY_ as ProcessDefinitionKey, P.ID_ as ProcessDefinitionId, P.NAME_ as ProcessDefinitionName, P.VERSION_ as ProcessDefinitionVersion, P.DEPLOYMENT_ID_ as DeploymentId from ACT_RU_EXECUTION RES inner join ACT_RE_PROCDEF P on RES.PROC_DEF_ID_ = P.ID_ WHERE RES.PARENT_ID_ is null and RES.ID_ = ? and RES.PROC_INST_ID_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?
参数: 5005(String), 5005(String), 2147483647(Integer), 0(Integer)
//完成任务
代码: Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
SQL: select * from ACT_RU_TASK where ID_ = ?
参数: 5009(String)
代码:this.taskService.addComment(taskId, processInstanceId, "[" + outcome + "]" + comment);
SQL: 1. select * from ACT_RU_TASK where ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-7] - <== Total: 1
2. select * from ACT_RU_EXECUTION where ID_ = ?
参数: 5005(String)
DEBUG [http-nio-8080-exec-7] - <== Total: 1
3. insert into ACT_HI_COMMENT (ID_, TYPE_, TIME_, USER_ID_, TASK_ID_, PROC_INST_ID_, ACTION_, MESSAGE_, FULL_MSG_) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
参数: 7501(String), comment(String), 2021-05-26 16:37:40.904(Timestamp), 李四(String), 5009(String), 5005(String), AddComment(String), [提交]嗯嗯嗯,同意(String), java.io.ByteArrayInputStream@4a9e9dae(ByteArrayInputStream)
代码:Map<String, Object> variables = new HashMap<>();
variables.put("outcome", outcome);
this.taskService.complete(taskId, variables);
SQL:1. select * from ACT_RU_TASK where ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
2. select * from ACT_RU_EXECUTION where ID_ = ?
参数: 5005(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
3. select * from ACT_RU_VARIABLE where EXECUTION_ID_ = ? and TASK_ID_ is null
参数: 5005(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
4. select * from ACT_RU_IDENTITYLINK where PROC_INST_ID_ = ?
参数: 5005(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
5. select * from ACT_RU_TASK where PARENT_TASK_ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 0
6. select * from ACT_RU_IDENTITYLINK where TASK_ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 0
7. select * from ACT_RU_VARIABLE where TASK_ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 0
8. select * from ACT_HI_TASKINST where ID_ = ?
参数: 5009(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
9. select distinct T.* from ACT_RU_TASK T where T.EXECUTION_ID_ = ?
参数: 5005(String)
DEBUG [http-nio-8080-exec-1] - <== Total: 1
10. select RES.* from ACT_HI_ACTINST RES WHERE RES.EXECUTION_ID_ = ? and RES.ACT_ID_ = ? and RES.END_TIME_ is null order by RES.ID_ asc LIMIT ? OFFSET ?
参数: 5005(String), usertask1(String), 1(Integer), 0(Integer)
//执行任务监听类,设置下一个办理人
public void notify(DelegateTask delegateTask) {
//得到当前用户
User currentUser = SessionUtils.getCurrentUser();
//取出领导ID
Integer mgr=currentUser.getMgr();
//取出IOC容器
HttpServletRequest request=SessionUtils.getCurrentServletRequest();
ApplicationContext applicationContext = WebApplicationContextUtils
.getWebApplicationContext(request.getServletContext());
//从IOC容器里面取出UserService
UserService userService=applicationContext.getBean(UserService.class);
//3查询领导信息
User leaderUser = userService.queryUserById(mgr);
//4,设置办理人
delegateTask.setAssignee(leaderUser.getName());
}
API总结
1.几个接口(和表有对应关系):
ProcessDefinition—–act_re_procdef
ProcessInstance——act_ru_execution
Task—–act_ru_task
2.几个Query对象
DeploymentQuery——act_re_deployment
ProcessDefinitionQuery—–act_re_procdef
TaskQuery—–act_ru_task
3.几个Service
RepositoryService—-操作部署表、流程定义表等静态资源信息表
RuntimeService—-操作流程实例表、任务表等动态信息表
TaskService—–操作任务表
HistoryService—-操作历史表 IdentityService—-操作用户表、组表、关系表formService--表单服务
identityService--实体服务
activiti工作流6大service服务的介绍:
第一大服务:仓储服务activiti的RepositoryService
-
//仓储服务
-
@Autowired
-
private RepositoryService repositoryService;
仓储服务可以用来部署我们的流程图,还可以创建我们的流程部署查询对象,用于查询刚刚部署的流程列表,便于我们管理流程,方法如下。
-
//这个是部署流程的方法,流程图以inputStream流的形式传入
-
DeploymentBuilder builder = repositoryService.createDeployment();
-
builder.name(process.getName());
-
builder.addInputStream(fileName, inputStream);
-
Deployment deployment = builder.deploy();
-
//这个是流程部署列表查询的方法
-
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
-
//可以根据很多条件查询,我这是根据部署名称模糊查询
-
List<Deployment> list = deploymentQuery.deploymentNameLike("%"+name+"%")
第二大服务:activiti运行时服务RuntimeService
-
//运行时服务
-
@Autowired
-
private RuntimeService runtimeService;
运行时服务主要用来开启流程实例,一个流程实例对应多个任务,也就是多个流程节点,好比如请假审批是一个流程实例,部门主管,部门经理,总经理都是节点,我们开启服务是通过流程定义key或者流程定义id来开启的,方法如下:
-
//首先根据部署id创建流程定义
-
ProcessDefinition def = repositoryService.createProcessDefinitionQuery().
-
deploymentId(form.getDeployId()).singleResult();
-
//然后根据流程定义id或者key开启流程实例
-
ProcessInstance proInst = runtimeService.startProcessInstanceById(def.getId());
备注:当我们用仓储服务部署了流程图之后,就会产生一个流程部署id,一个流程部署id对应一个流程定义,一个流程定义对应多个流程实例,一个流程实例对应多个任务节点,这样的逻辑应该明白吧,打个比方就是我设计了一个手机图纸(流程定义),是可以供N多个人生产出手机并去使用的,这些人就是流程实例,手机里面的各种功能就是任务节点。
第三大服务:activiti任务服务TaskService
-
//任务服务
-
@Autowired
-
private TaskService taskService;
任务服务是用来可以用来领取,完成,查询任务列表功能的,使用方法分别如下:
-
//根据任务id和用户领取任务
-
taskService.claim(String taskId, String userId)
-
//根据任务id完成自己节点的任务
-
taskService.complete(String taskId)
-
//创建任务查询对象之后根据候选人也就是任务处理人查询自己的任务列表
-
taskService.createTaskQuery().taskAssignee(String assignee)
第四大服务:activiti历史服务HistoryService
//历史服务
@Autowired
private HistoryService historyService;
历史服务可以查看审批人曾经审批完成了哪些项目,审批项目总共花了多少时间,以及在哪个环节比较耗费时间等等,便于审批人查看历史信息,方法如下。
//根据审批人查看该审批人审批了哪些项目
List<HistoricTaskInstance> = historyService.createHistoricTaskInstanceQuery().
taskAssignee(String assignee).finished().list();
历史任务对象HistoricTaskInstance,它里面封装了任务开始时间,结束时间,该节点花费的时间等等信息。
第五大服务:activiti表单服务FormService,注入方法是一样的,本人几乎没有用到,具体作用没有好好研究,以后使用了再公布出来。
//表单服务
@Autowired
private
FormService formService;
第六大服务:activiti实体服务IdentityService,主要是操作用户信息,用户分组信息等,组信息包括如部门表和职位表,我一般都是自己建表来存储用户信息和组信息的,
//实体服务
@Autowired
private IdentityService identityService;
经过以上的简单了解,我想应该能基本入门和使用activiti工作流框架创建简单的oa系统项目了,注意注入的服务名必须和xml配置的六个服务bean的id一样,ssm框架整合配置在最开始的地方已经公布了网址。