美文网首页
activiti 自定义任务事件扩展

activiti 自定义任务事件扩展

作者: 爱余星痕 | 来源:发表于2018-05-14 11:31 被阅读0次

    最近工作上一直在用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中扩展了自己的操作
    显示结果如下


    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”));
    

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

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

    相关文章

      网友评论

          本文标题:activiti 自定义任务事件扩展

          本文链接:https://www.haomeiwen.com/subject/uvuddftx.html