在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点: Connection—连接 Event—事件 Task—任务 Gateway—网关 Container—容器 Boundary event—边界事件 Intermediate event- -中间事件 流程图设计完毕保存生成.bpmn 文件。
首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录),点击菜单:New-BpmnFile,如下图所示:
弹出如下图所示框:
起完名字 holiday 后(默认扩展名为 bpmn),就可以看到进入了流程设计页面,如图所示:
首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录), File-New-Other 菜单,打开如下窗口。
创建成功:
左侧区域是绘图区,右侧区域是 palette 画板区域 鼠标先点击画板的元素即可在左侧绘图。
图形绘制好后会生成两个文件:
自动生成图形,需要设置 eclipse:
流程定义 key 即流程定义的标识,在 eclipse 中通过 properties 视图查看流程的 key
建议:相同的业务流程,流程定义的 key 名字定义一样,比如,如果需要创建新的业务流程,请假流程则使用新的 key。
在 properties 视图指定每个任务结点的负责人,比如下边是填写请假单的负责人为 zhangsan
部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流程引擎 activiti 中,方法如下:
使用 ProcessEngine 创建 RepositoryService,代码如下:
// 获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//部署对象
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/myholiday.bpmn")// bpmn文 件
.addClasspathResource("diagram/myholiday.png")// 图片文件
.name("请假申请流程")
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
执行此操作后 activiti 会将上边代码中指定的 bpm 文件和图片文件保存在 activiti 数据库。
流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。
针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象。对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例。
代码如下:
// 启动一个流程实例
@Test
public void startProcessInstance() {
// 获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根据流程定义key启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myholiday01");
System.out.println(" 流程定义 id : " +
processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println(" 当前活动 Id : " + processInstance.getActivityId());
}
流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
// 查询当前个人待执行的任务
@Test
public void findPersonalTaskList() {
// 任务负责人
String assignee = "zhangsan";// 创建TaskService
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()//
.processDefinitionKey("myholiday01")//
.taskAssignee(assignee)//只查询该任务负责人的任务
.list();
for (Task task : list) {
System.out.println(" 流 程 实 例 id : " +
task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
任务负责人查询待办任务,选择任务进行处理,完成任务。
// 完成任务
@Test
public void completTask() {
//任务id
String taskId = "8305";
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
//完成任务
taskService.complete(taskId);
System.out.println("完成任务id="+taskId);
}