如果想更好的理解activity.这里有权威指南.pdf
百度网盘:链接: https://pan.baidu.com/s/1G8eLj--R5BjVCWwDbuu4Yg 。密码请关注。情感宣泄馆。回复668899
1、maven 引入依赖。都说springboot2.x要配activiti7.x。我的springboot版本是2.1.7
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M1</version>
</dependency>
2、接着在yml中配置activity。在spring级别下
spring:
activiti:
database-schema-update: true #是否每次都更新数据库(会自动建表)
# 自动部署验证设置:true-开启(默认)、false-关闭
check-process-definitions: false # activti是否自动部署
process-definition-location-prefix: classpath:/processes/
#process-definition-location-suffixes: .bpmn
history-level: full
db-history-used: true
db-identity-used: true
启动后会建立25张表。如果少建了。请确定 配置文件中这三项history-level=full和db-history-used= true,database-schema-update=true。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 'GE'表示general。通用数据, 用于不同场景下,如存放资源文件。
3、继续后面的就是创建bpmn文件。我这里用的idea。需要搜索actiBPM插件。进行创建
安装后创建bpmn文件。跟着步骤走
接下来就开始画图
能看懂吗。别急我来解释
因为审批肯定有审核不通过的。所以我这边是根据条件判断走向的。具体看图
监听代码如下:
@Service
public class MyTaskListener1 implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
ProcessEngine services = ProcessEngines.getDefaultProcessEngine();
ExecutionEntity entity = (ExecutionEntity) execution;
String processInstId=entity.getProcessInstanceId(); //流程实例Id
//根据审批传入的参数判断是否打回
Object value = execution.getVariableInstance("isSuccess").getValue();
if(ObjectUtils.isEmpty(value)){
value = execution.getParent().getVariableInstance("isSuccess").getValue();
}
;
if(!ObjectUtils.isEmpty(value)&&(boolean)(value)==true){
return;
}
List<HistoricTaskInstance> list=services.getHistoryService().createHistoricTaskInstanceQuery().orderByTaskCreateTime().asc()
.processInstanceId(processInstId)
.list();
if(list!=null){
String user=list.get(0).getAssignee(); //获取最新的一个责任人信息回退给他
execution.setVariable("inputUser", user);
}
}
}
自己拟写了一个controller。简单实现调用代码如下。
@Controller
@RequestMapping("/app")
public class TestController {
@Autowired
private RepositoryService repositoryService;
@Autowired
private TaskService taskService;
/* @Autowired
private IdentitySer identityService;*/
@Autowired
private ModelRollBack modelRollBack;
/**
* 流程部署。部署一次就可以了。
* @return
*/
@RequestMapping("/t")
@ResponseBody
public Object get(){
//第一步
DeploymentBuilder builder= repositoryService.createDeployment();
builder.addClasspathResource("processes/le.bpmn");
String id = builder.deploy().getId();
repositoryService.setDeploymentKey(id,"nnffnn4d");
System.out.println(id);
return null;
}
/**
* 人员重新申请
* @return
*/
@RequestMapping("/rePack")
@ResponseBody
public Object rePack(){
Authentication.setAuthenticatedUserId("wwz");
Map<String, Object> variables = new HashMap<>();
//根据流程id获取属于自己的待办。
List<Task> list = taskService.createTaskQuery().taskAssignee("wwz").processInstanceId("60dbc3ce-9f1b-11ea-bbc3-16fd52790d6f").list();
if(!ObjectUtils.isEmpty(list)){
for(Task item:list){
taskService.complete(item.getId(),variables);
}
}
return list;
}
/**
* 人员提交申请
* @return
*/
@RequestMapping("/app1")
@ResponseBody
public Object ff(){
Authentication.setAuthenticatedUserId("wwz");
Map<String, Object> variables = new HashMap<>();
//inputUser就是在bpmn中Assignee配置的参数
variables.put("inputUser", "wwz");
//开启流程。myProcess_2为流程名称。获取方式把bpmn改为xml文件就可以看到流程名
ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine().getRuntimeService().startProcessInstanceByKey("myProcess_2",variables);
Task tmp = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId())
.singleResult();
tmp.setAssignee("wwz");
//完成此节点。由下一节点审批。完成后act_ru_task会创建一条由下节点审批的数据
taskService.complete(tmp.getId(),variables);
return null;
}
/**
* 人事经理审批
* @return
*/
@RequestMapping("/app2")
@ResponseBody
public Object ff2(){
//根据角色信息获取自己的待办
List<Task> T = taskService.createTaskQuery().taskAssignee("rs").list();
if(!ObjectUtils.isEmpty(T)) {
for (Task item : T) {
Map<String, Object> variables = new HashMap<>();
variables.put("inputUser", "wwz1");
variables.put("isSuccess", true);
item.setAssignee("rs");
//设置本地参数。在myListener1监听中获取。防止审核通过进行驳回
taskService.setVariableLocal(item.getId(),"isSuccess",true);
//增加审批备注
taskService.addComment(item.getId(),item.getProcessInstanceId(),"人事经理同意");
//完成此次审批。由下节点审批
taskService.complete(item.getId(), variables);
}
}
return null;
}
/**
* 总经理审批
* @return
*/
@RequestMapping("/app3")
@ResponseBody
public Object app3(){
//根据角色信息获取自己的待办
List<Task> T = taskService.createTaskQuery().taskAssignee("zj").list();
if(!ObjectUtils.isEmpty(T)) {
for (Task item : T) {
Map<String, Object> variables = new HashMap<>();
variables.put("inputUser", "wwz2");
item.setAssignee("zj");
variables.put("isSuccess", true);
//设置本地参数。在myListener1监听中获取。防止审核通过进行驳回
taskService.setVariableLocal(item.getId(),"isSuccess",true);
//增加审批备注
taskService.addComment(item.getId(),item.getProcessInstanceId(),"总经理同意");
//完成此次审批。如果下节点为endEvent。结束流程
taskService.complete(item.getId(), variables);
}
}
return null;
}
/**
* 查询wwz未完成的历史记录
* @return
*/
@RequestMapping("/unfinish")
@ResponseBody
public Object app4(){
return ProcessEngines.getDefaultProcessEngine().getHistoryService().createHistoricProcessInstanceQuery().startedBy("wwz").unfinished().list();
}
/**
* 查询wwz完成的历史记录
* @return
*/
@RequestMapping("/finish")
@ResponseBody
public Object finish(){
return ProcessEngines.getDefaultProcessEngine().getHistoryService().createHistoricProcessInstanceQuery().startedBy("wwz").finished().list();
}
/**
* 总经理审核不通过(不通过打回到发起人。发起人可以根据流程id。重新提交)rePack
* @return
*/
@RequestMapping("/reject")
@ResponseBody
public Object reject(){
List<Task> T = taskService.createTaskQuery().taskAssignee("zj").list();
if(!ObjectUtils.isEmpty(T)) {
for (Task item : T) {
Map<String, Object> variables = new HashMap<>();
//isSuccess来决定流程走向。具体看bpmn图
variables.put("isSuccess", false);
item.setAssignee("zj");
taskService.setVariableLocal(item.getId(),"isSuccess",false);
taskService.complete(item.getId(), variables);
// modelRollBack.init(item.getId());
}
}
return null;
}
/**
* 人事经理审核不通过。(不通过打回到发起人。发起人可以根据流程id。重新提交)。rePack
* @return
*/
@RequestMapping("/reject1")
@ResponseBody
public Object reject1(){
List<Task> T = taskService.createTaskQuery().taskAssignee("rs").list();
if(!ObjectUtils.isEmpty(T)) {
for (Task item : T) {
Map<String, Object> variables = new HashMap<>();
variables.put("isSuccess", false);
item.setAssignee("rs");
taskService.setVariableLocal(item.getId(),"isSuccess",false);
taskService.complete(item.getId(), variables);
// modelRollBack.init(item.getId());
}
}
return null;
}
}