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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/59667.html