activiti 自定义任务事件扩展

简介: 最近工作上一直在用activiti作工作流,发现工作流程使用起来真的挺费劲的!这不,业务需求有来有,用户希望在回复沟通时,能触发回复沟通事件,而用户通过该事件触发他的业务事件。

最近工作上一直在用activiti作工作流,发现工作流程使用起来真的挺费劲的!
这不,业务需求有来有,用户希望在回复沟通时,能触发回复沟通事件,而用户通过该事件触发他的业务事件。
回复沟通是这边流程的自定义的操作, activti没这种操作,怎么办?看来只能动手自己扩展了
1.Web端
要扩展,首先要在页面上要有地方配置,因为这个跟任务绑定在一起的,放在任务监听器中
找到页面task-listeners-popup.html(这边用的是activiti-explorer),发现很简单,只需要在下拉里加入配置即可

<div class="form-group">
<label for="eventField">{{'PROPERTY.TASKLISTENERS.EVENT' | translate}}</label>
<select id="eventField" class="form-control" ng-model="selectedListeners[0].event">
<option>create</option>
<option>assignment</option>
<option>complete</option>
<option>delete</option>
<option>specCode</option>
</select>
</div>

如上表格所示,在select中扩展了自己的操作
显示结果如下


img_bbabe4738284dc7df2f46e2d004da891.png
clipboard.png

OK,前端改造完成,用户可以选择了.

2.后端代码
跟一下代码,发现对象TaskEntity有发布事件的方法fireEvent,那急急的加入以下代码

TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(taskId).singleResult(); 
  //发布操作事件
   task.fireEvent("drafter_submit");

成功了吗?测试一下,Oh,Shit,报错了!

java.lang.NullPointerException: null

 at org.activiti.engine.impl.persistence.entity.TaskEntity.getTaskDefinition(TaskEntity.java:797)

 at org.activiti.engine.impl.persistence.entity.TaskEntity.fireEvent(TaskEntity.java:728)

经分析,是里面的Context没有,怎么办呢??考虑了一下,命令模式有这个东东呀,那我直接用命令模式来实现试试.

import java.util.Map;
import org.activiti.engine.impl.cmd.NeedsActiveTaskCmd;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
 
public class OperationCommand extends NeedsActiveTaskCmd<Boolean> {

 public OperationCommand(String taskId) {
  super(taskId);
  // TODO Auto-generated constructor stub
 }
 private Map<String, Object> formData;
 private String operationCode;

 @Override
 protected Boolean execute(CommandContext commandContext, TaskEntity task) {
  // TODO Auto-generated method stub
  Context.getCommandContext().getProcessEngineConfiguration().getTaskService().complete(task.getId(), formData);
  // 发布操作事件
  task.fireEvent(operationCode);
  return true;
 }

 public OperationCommand(String taskId, Map<String, Object> formData, String operationCode) {
  super(taskId);
  this.formData = formData;
  this.operationCode = operationCode;
 }
}

原来的执行的代码改为

((RuntimeServiceImpl)runtimeService).getCommandExecutor().execute(new OperationCommand(taskId,formData,“specCode”));

经测试,意外惊喜,成功了!

至此,流程任务自定义事件扩展成功!

相关文章
|
6月前
28activiti - 流程变量(支持的类型)
28activiti - 流程变量(支持的类型)
16 0
|
6月前
17activiti - 流程管理定义(查询最新版本的流程定义)
17activiti - 流程管理定义(查询最新版本的流程定义)
19 0
|
6月前
|
数据库
19activiti - 流程管理定义(启动流程实例)
19activiti - 流程管理定义(启动流程实例)
25 0
|
XML 数据可视化 Java
Activiti-ProcessEngine创建方式和Servcie介绍
Activiti-ProcessEngine创建方式和Servcie介绍
Activiti-ProcessEngine创建方式和Servcie介绍
|
Java Spring
Activiti监听任务的几种方式
Activiti监听任务的几种方式
1195 0
|
Java Spring
flowable实现流程全局事件
最近在研究flowable,发现这个东东虽说是activiti的升级版,但感觉还是没有a5的好用。 项目中需要实现一个全局事件,实现如下: 实现flowable的配置 @Bean public EngineConfigurationConf...
5296 0
Activiti新增的子流程
flowable和Activiti6新增了ad-hoc子流程(adHocSubProcess),即adHocSubProcess流程。该类型的子流程无需再子流程中为节点配置任何的出线: 操作方式如下: runtimeService.
2251 0
|
Android开发
Activiti自定义设计器
原文地址:www.shareniu.com/topic/content/40.htm Activiti自定义设计器 在使用Activiti的时候,需要绘制流程文档,可以使用Activiti提供的Eclipse插件或者idea插件,抑或使用Web版的流程设计器,但是这些设计器不能很好的满足业务开发需求,因此通常情况下,在实现自己业务的同时,期望自己设计一套流程设计器,从而更加灵活的应对需求的变更和量身定制自己的Activiti设计器。
1374 0
|
关系型数据库 Java MySQL
activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加密,保证我们的数据库连接不能被发现。
1186 0