camunda 流程引擎如何实现 【知会】功能 ?

在做流程引擎二次开发时,业务方一般都会要求实现【知会】功能,要实现这个功能,我想首先应该弄清楚,【知会】到底什么意思?

下面是百度百科的解释。

业务方提出了需求,在进一步沟通后。确认业务方就是想让这条流程让某某人知道,能看到这条信息。

这让我想起邮箱里面的 抄送 功能,感觉这2者异曲同工,功能实现是一样的,只是叫法不一样。

 

既然理解了需求,接下来开始干就完了。

没想到刚开始就遇到问题了。 真是烦人!

流程引擎是把整个业务流程抽象成一个一个结点,在每个结点产生任务,让一个人或多人完成,一个节点完成就流转到下一个节点。 可问题是在用camunda的画流程工具里面没有【知会】这样的结点,我CAO这该如何搞!!

 

这不得不让我停下编码,重新整理整个过程。既然【知会】实现的功能是想让人看到一条流程,我是不是只需要在特定的表里写一条数据(包含:流程,想看的人)是不是就可以了。

这让我又想到【知会】可能会有2种情况:

a: 流程中:自动知会;

b:流程外:参与流程任务的人主动知会某人。

经过上面的整理,思路终于清楚了,心里忍不住窃喜,我终于可以开始编码了。

 

 

上面是我画的一个报帐申请的流程图。老板对进帐没感觉,但对出帐却要求钱不管多少,每一笔他都需要知道。

所以在上面加一个自动任务的节点(右边选择Java Class,   在填上实例的Java类路径 ,)自动实现【知会】老板的功能,也就是向表中添加一条数据。

通过查看Camunda的表设计,结合上面的分析【知会】产生的数据需要写到:ACT_RU_TASK 表中。

下图:在【申请人】节点需要上传的参数及值

 

参数说明:

        assignee: 参数为需要知会的人ID

        executionId: 执行ID(ACT_RU_EXECUTION表的ID

下面贴出自动【知会】的代码,是能够正常运行:

package com.bpm.config;



import lombok.extern.slf4j.Slf4j;

import org.camunda.bpm.engine.delegate.DelegateExecution;

import org.camunda.bpm.engine.delegate.JavaDelegate;

import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;

import org.springframework.stereotype.Component;

import java.util.Date;

import java.util.UUID;



/**

* 自动知会

*/



@Slf4j

@Component

public class AutoInfoService implements JavaDelegate {


    @Override

    public void execute(DelegateExecution execution) throws Exception {

        try{

            // 如果是知会多个人 以 ,隔开

            String assignees = execution.getVariable("assignee").toString().trim();

            String[] assigneeArray = assignees.split(",");

            for (String assignee : assigneeArray){

                TaskEntity taskEntity = new TaskEntity();

                taskEntity.setId(UUID.randomUUID().toString());

                taskEntity.setRevision(1);

                taskEntity.setExecutionId(execution.getVariable("executionId").toString());

                taskEntity.setProcessInstanceId(execution.getProcessInstanceId());

                taskEntity.setProcessDefinitionId(execution.getProcessDefinitionId());

                taskEntity.setName(execution.getCurrentActivityName());

                taskEntity.setParentTaskId("自动知会");

                taskEntity.setDescription("自动知会");

                taskEntity.setTaskDefinitionKey(execution.getCurrentActivityId());

                taskEntity.setPriority(50);

                taskEntity.setCreateTime(new Date());

                taskEntity.setSuspensionState(1);

                taskEntity.setAssignee(assignee.trim());

                taskEntity.insert();

            }

        }catch (Exception e){

            throw new Exception("自动知会 异常 ", e);

        }

    }

}

执行上面的节点后,会在 ACT_RU_TASK 表中增加2条数据。

以上用是在流程中有自动【知会】的节点的代码。

以下为在流程外,手动【知会】的功能实现:

public String handleInfo(String taskId, String assignees, String executionId){

    if(StringUtils.isBlank(taskId)){
        return "任务ID不能为空";
    }

    if(StringUtils.isBlank(assignees)){
        return "知会人不能为空";
    }

    if(StringUtils.isBlank(executionId)){
        return "执行ID不能为空";
    }

    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    if(ObjectUtils.isEmpty(task)){
        return "没有查询到当前任务";
    }

    String[] assigneeArray = assignees.split(",");
    for (String assignee : assigneeArray){
        TaskEntity taskEntity = new TaskEntity();
        taskEntity.setId(UUID.randomUUID().toString());
        taskEntity.setRevision(1);
        taskEntity.setExecutionId(task.getExecutionId());
        taskEntity.setProcessInstanceId(task.getProcessInstanceId());
        taskEntity.setProcessDefinitionId(task.getProcessDefinitionId());
        taskEntity.setName("手动知会");
        taskEntity.setParentTaskId(task.getParentTaskId());
        taskEntity.setDescription("手动知会");
        taskEntity.setTaskDefinitionKey(task.getTaskDefinitionKey());
        taskEntity.setPriority(50);
        taskEntity.setCreateTime(new Date());
        taskEntity.setSuspensionState(1);
        taskEntity.setAssignee(assignee.trim());
        taskEntity.insert();
    }

    return "";
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周的JAVA技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值