绘制流程图:
为idea下载 bpmn插件:
绘制流程图:
数据库配置:
1.新建activiti.cfg.xml文件,mysql配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--为true时如果表未建会自动建立-->
<property name="databaseSchemaUpdate" value="false" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/actviti_test?createDatabaseIfNotExist=true&useSSL=false" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123" />
</bean>
</beans>
代码:
package test;
import org.activiti.engine.*;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.task.Task;
import java.util.HashMap;
import java.util.Map;
/**
* Created by yan on 17-3-23.
*/
public class ActivtiSmilpeServer {
public static ProcessEngine processEngine =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
/**
* 权限操作service
*/
public static IdentityService identityService = processEngine.getIdentityService();
/**
* 运行service
*/
private static RuntimeService runtimeService = processEngine.getRuntimeService();
/**
* 任务执行service
*/
private static TaskService taskService = processEngine.getTaskService();
/**
* 权限操作
*/
public void identity() {
//这里为做测试,设置了一些默认用户,在实际使用时可以根据对接的系统进行初始话的设计,或者不设置直接交给对接的系统处理
Group group = new GroupEntity();
group.setId("1");
group.setName("审核组");
group.setType("1");
identityService.saveGroup(group);
User user1 = new UserEntity();
user1.setId("1");
user1.setFirstName("步惊云");
identityService.saveUser(user1);
User user2 = new UserEntity();
user2.setId("2");
user2.setFirstName("聂风");
identityService.saveUser(user2);
//关联用户与组
identityService.createMembership("1", "1");
identityService.createMembership("2", "1");
}
/**
* 部署流程,每次部署在ACT_RE_PROCDEF表中会多一条记录,该记录版本为最新
*
* @param path bpmn文件地址 如:simple.bpmn
*/
public void deploy(String path) {
processEngine.getRepositoryService().createDeployment().addClasspathResource(path).deploy();
}
/**
* 根据id发布流程
*
* @param id 表ACT_RE_PROCDEF的id
* @param userId 用户id
*/
public void startById(String id, String userId) {
Map variables = new HashMap();
//为图中的#{userId},赋值,指定发布新闻的对象
variables.put("userId", userId);
processEngine.getRuntimeService().startProcessInstanceById(id, variables);
}
/**
* 根基key发布流程,会发布对应key最新的版本,key值为 bpmn文件的id
*
* @param key 表ACT_RE_PROCDEF的key
* @param userId 用户id
*/
public void startByKey(String key, String userId) {
Map variables = new HashMap();
//为图中的#{userId},赋值,指定发布新闻的对象
variables.put("userId", userId);
runtimeService.startProcessInstanceByKey(key, variables);
}
/**
* 用户发布新闻
*
* @param userId 用户id
* @param taskId 任务id
*/
public void userTask(String userId, String taskId) {
//得到任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task.getAssignee().equals(userId)) {//判断是否该任务的执行人
/**
* 1.完成任务
* 2.这时如我在图上的设置会触发listener的notify事件,为下一个流程的候选组赋值
* 3.除了listener事件,也可以通过startById与startByKey中相同的手段为候选组或者候选人赋值,如果多个可以#{aaa},#{bbb}
*/
taskService.complete(taskId);
}
}
/**
* 候选组审核流程
*
* @param userId 用户id
* @param taskId 任务id
*/
public void groupTask(String userId,String taskId) {
//候选组的人员认领任务,只有候选组里的人可以认领
taskService.claim(taskId,userId);
//设置条件,走符合设置条件的路线,这里的排它网关可以不要,有排它网关的好处是可以在排它网管上设置默认值
Map variables = new HashMap();
//为图中的${type==1}的type,赋值
variables.put("type", 1);
//完成任务
taskService.complete(taskId);
}
}
variables = new HashMap();
//为图中的#{userId},赋值,指定发布新闻的对象
variables.put("userId", userId);
processEngine.getRuntimeService().startProcessInstanceById(id, variables);
}
/**
* 根基key发布流程,会发布对应key最新的版本,key值为 bpmn文件的id
*
* @param key 表ACT_RE_PROCDEF的key
* @param userId 用户id
*/
public void startByKey(String key, String userId) {
Map variables = new HashMap();
//为图中的#{userId},赋值,指定发布新闻的对象
variables.put("userId", userId);
runtimeService.startProcessInstanceByKey(key, variables);
}
/**
* 用户发布新闻
*
* @param userId 用户id
* @param taskId 任务id
*/
public void userTask(String userId, String taskId) {
//得到任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task.getAssignee().equals(userId)) {//判断是否该任务的执行人
/**
* 1.完成任务
* 2.这时如我在图上的设置会触发listener的notify事件,为下一个流程的候选组赋值
* 3.除了listener事件,也可以通过startById与startByKey中相同的手段为候选组或者候选人赋值,如果多个可以#{aaa},#{bbb}
*/
taskService.complete(taskId);
}
}
/**
* 候选组审核流程
*
* @param userId 用户id
* @param taskId 任务id
*/
public void groupTask(String userId,String taskId) {
//候选组的人员认领任务,只有候选组里的人可以认领
taskService.claim(taskId,userId);
//设置条件,走符合设置条件的路线,这里的排它网关可以不要,有排它网关的好处是可以在排它网管上设置默认值
Map variables = new HashMap();
//为图中的${type==1}的type,赋值
variables.put("type", 1);
//完成任务
taskService.complete(taskId);
}
}
package test;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.identity.Group;
/**
* Created by yan on 17-3-24.
*/
public class SimpleListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
//设置候选组
Group group = ActivtiSmilpeServer.identityService.createGroupQuery().groupId("1").singleResult();
delegateTask.addCandidateGroup(group.getId());
}
}