项目地址:activiti-workflow,欢迎star。

在流程审批中,在某一个节点需要抄送某人,被抄送人看查看流程,不需要审批。这里是通过对activit扩展,自定义BPMN标签,追加了抄送属性。

对普通用户节点设置抄送属性,继承UserTask


/*** @description: 自定义用户节点* @author lhj* @param  * @return * @date 2020-6-11 10:50 */
public class CustomUserTask extends UserTask {//抄送用户protected List<String> candidateNotifyUsers = new ArrayList();public List<String> getCandidateNotifyUsers() {return candidateNotifyUsers;}public void setCandidateNotifyUsers(List<String> candidateNotifyUsers) {this.candidateNotifyUsers = candidateNotifyUsers;}public CustomUserTask clone() {CustomUserTask clone = new CustomUserTask();clone.setValues(this);return clone;}public void setValues(CustomUserTask otherElement) {super.setValues(otherElement);this.setCandidateNotifyUsers(otherElement.getCandidateNotifyUsers());}
}

解析BPMN的xml和json是设置该属性

 if (StringUtils.isNotEmpty(xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_TASK_USER_CANDIDATE_NOTIFY_USERS))) {String expression = xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_TASK_USER_CANDIDATE_NOTIFY_USERS);userTask.getCandidateNotifyUsers().addAll(parseDelimitedList(expression));}
   task.setCandidateNotifyUsers(getValueAsList(CANDIDATE_NOTIFY_USERS, assignmentDefNode));

bpmn文件格式

    <userTask id="sid-254390AD-30E7-4390-8B97-E2A395C4A15C" name="主管审批" activiti:assignee="lisi" activiti:candidateNotifyUsers="wangwu,zhangsan"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask>

在流程流转过程中将抄送人落地,存入数据库,处理逻辑主要在UserTaskActivityBehavior,通过继承实现

  //保存抄送人if (candidateNotifyUsers != null && !candidateNotifyUsers.isEmpty()) {for (String notify : candidateNotifyUsers) {Expression userIdExpr = expressionManager.createExpression(notify);Object value = userIdExpr.getValue(execution);if (value instanceof String) {List<String> userIds = extractCandidates((String) value);for (String userId : userIds) {Context.getCommandContext().getIdentityLinkEntityManager().addUserIdentityLink(task, userId, ProcessConstants.NOTIFY);}} else if (value instanceof Collection) {Iterator userIdSet = ((Collection) value).iterator();while (userIdSet.hasNext()) {Context.getCommandContext().getIdentityLinkEntityManager().addUserIdentityLink(task, (String)userIdSet.next(), ProcessConstants.NOTIFY);}throw new ActivitiException("Expression did not resolve to a string or collection of strings");}}}

到此,抄送定义和数据保存都已实现,剩下就是如何查询数据,这就要看具体业务需要是怎么样的。这里做简单实现,根据待办一起查询抄送。通过activiti提供的扩展Mybatis实现。

 /***  查询待审批任务* @param taskUnFinishQuery 查询条件* @return*/@Overridepublic PageBean<ProcessTaskResult> queryUnFinishTask(TaskUnFinishQuery taskUnFinishQuery){PageUtil<ProcessTaskResult, TaskUnFinishQuery> pageUtil = new PageUtil<>();Long count = managementService.executeCustomSql(new AbstractCustomSqlExecution<CustomActivitiDatabaseMapper, Long>(CustomActivitiDatabaseMapper.class) {@Overridepublic Long execute(CustomActivitiDatabaseMapper customActivitiDatabaseMapper) {return customActivitiDatabaseMapper.selectUnFinishTaskCount(taskUnFinishQuery);}});//没有查询到,就直接返回空if(count <= 0){return pageUtil.buildPage(Collections.emptyList(), taskUnFinishQuery, 0);}List<ProcessTaskResult> list = managementService.executeCustomSql(new AbstractCustomSqlExecution<CustomActivitiDatabaseMapper, List<ProcessTaskResult>>(CustomActivitiDatabaseMapper.class) {@Overridepublic List<ProcessTaskResult> execute(CustomActivitiDatabaseMapper customActivitiDatabaseMapper) {return customActivitiDatabaseMapper.selectUnFinishTask(taskUnFinishQuery);}});return pageUtil.buildPage(list,taskUnFinishQuery,count);}

还有额外处理,抄送可能是针对整个流程,但并不是某个节点。因此在存抄送人时,不但存taskId,还保存了processInstanceId实例ID

 @Overridepublic IdentityLinkEntity addIdentityLink(TaskEntity taskEntity, String userId, String groupId, String type) {IdentityLinkEntity identityLinkEntity = (IdentityLinkEntity)this.identityLinkDataManager.create();taskEntity.getIdentityLinks().add(identityLinkEntity);identityLinkEntity.setTask(taskEntity);identityLinkEntity.setUserId(userId);identityLinkEntity.setGroupId(groupId);if (ProcessConstants.NOTIFY.equals(type)) {identityLinkEntity.setProcessInstanceId(taskEntity.getProcessInstanceId());}identityLinkEntity.setType(type);this.insert(identityLinkEntity);if (userId != null && taskEntity.getProcessInstanceId() != null) {this.involveUser(taskEntity.getProcessInstance(), userId, "participant");}return identityLinkEntity;}

这里给出一种实现思路,只供参考。具体代码可到github项目中查看。
关于扩展BPMN遇到的问题,参考

  • Activiti子流程扩展标签
  • Activiti自定义BPMN

activiti抄送相关推荐

  1. Activiti实现抄送方案实现(监听器方式)

    前言 近期在开发一个基于Activiti基础实现的工作流平台,发现目前的工作流引擎都是不太符合国内的一些业务需求的,例如国内的驳回,抄送目前流行的工作流引擎都没有具体的实现.在这里记录一下相关的大致实 ...

  2. activiti创建自子任务,创建抄送任务,任务分裂的实现思路

    今天看activiti的act_ru_task表,发现有一个parent_task_id_字段,比较好奇,就研究了一番.发现原来是可以给一个task创建subtask 那么他的适用场景就是 创建自子任 ...

  3. activiti 6.0 editor汉化详解

    添加汉化文件到如下: 源代码: 汉化文件 stencilset_bpmn.json {"title" : "BPMN 2.0标准工具","namesp ...

  4. SpringBoot 结合Activiti 进行单条实例工作流审批

    1.建立maven项目,引入maven依赖 #因为我的项目单独引入了mybatis-plus所以这里对activiti排除一下mybatis的依赖 <dependency><grou ...

  5. Activiti工作流+idea2021入门筑基上篇-修身

    Activiti工作流 一.我不是韩立,我叫厉飞雨 一.工作流的简单了解 1.介绍:将一组任务组织起来以完成某个事件的过程 :定义了任务的触发顺序和触发条件,每个任务可以由一个或多个 软件系统 完成, ...

  6. Activiti审批流

    名词解释 转办:某个节点,候选人是好几人.其中一个人拾取了该任务,发现不应该办理,可以转给候选人中的其他人 会签: 1 bpmn StartEvent 开始事件(重要) EndEvent 结束事件(重 ...

  7. Jflow;JBoss JBPM ;Activiti以及FixFlow ;SWF五大流程引擎的对比

    几种工作流引擎的简介: jBPM是公开源代码项目,jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBoss ...

  8. Activiti——流程执行历史记录(七)

    转自:http://blog.csdn.net/zjx86320/article/details/50363544 之前的几篇文章,为大家简单的介绍了部署流程定义.启动流程实例.查看和办理个人任务以及 ...

  9. Activiti——流程变量(六)

    Activiti--流程变量 转自:http://lib.csdn.net/article/java/66665?knId=268 流程变量在整个工作流中扮演很重要的作用.例如:请假流程中有请假天数. ...

最新文章

  1. 5、Scala模式匹配
  2. Poisson Image Editing 泊松融合 matlab代码完整
  3. 详解深度学习中的Normalization,不只是BN(2)
  4. RedHat 6.4下安装Openoffice软件
  5. linux命令详解——iostat
  6. dnf如何快速拾取物品_DNF游戏里的一些便利性功能,每个都非常实用
  7. HDOJ2026 ( 首字母变大写 ) 【水题】
  8. oracle 实现HA,使用KeepAlived实现HAProxy高可用
  9. 算法与数据结构(二)-数组、链表(Array、Linked List)
  10. 极简工具(AutoCAD、Tekla)——零件图自动标注
  11. 人体神经系统分布图高清,神经分布图超清图片
  12. Linux架设Jsp环境
  13. 《我十年的程序员生涯》系列之三:阳光灿烂的日子
  14. 6大页面数据抓取工具
  15. STM32(3)——外部中断的使用
  16. 生成树协议中的五种状态Spanning Tree
  17. MiniDao-PE精简版
  18. 关于517coding的10月月赛
  19. win10总是很快自动休眠,设置休眠时间也无效?
  20. M5311nbiot 模组入坑 (接入华为物联平台)

热门文章

  1. ReactOS的由来
  2. ReactOS debug(调试)
  3. CMMI-技术解决方案(TS)
  4. mysql my.ini 配置
  5. stm32输入捕获,捕获高电平
  6. java毕业设计——基于java+J2EE+sqlserver的音像店租赁管理系统设计与实现(毕业论文+程序源码)——租赁管理系统
  7. 协程(二)协程的应用
  8. 学校计算机班班通维护保养记录,班班通的使用与维护
  9. Iphone 免费申请App ID
  10. MindSpore Quantum 量子计算编程与实践:轻松上手量子卷积神经网络