在做流程引擎二次开发时,业务方一般都会要求实现【知会】功能,要实现这个功能,我想首先应该弄清楚,【知会】到底什么意思?
下面是百度百科的解释。
业务方提出了需求,在进一步沟通后。确认业务方就是想让这条流程让某某人知道,能看到这条信息。
这让我想起邮箱里面的 抄送 功能,感觉这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 "";
}