activiti--完成当前任务,动态指定下一级执行者

2023-11-02

最近在做一个工作流审批的项目,类似与申请一个请假,但是在完成任务的时候需要动态指定下一级人物,在最开始了解的时候,书上都是直接根据taskId来完成,后来终于实现了这个动态指定下一级处理人的功能。
我们的项目是这么一个流程
工作流
那么例如我是一个提交申请的人,例如是一个标准的请假,那么我需要完成当前的人物,还需要动态的指定下一级的是谁来审批,可是有一个前提,那就是我是不知道是谁来完成我的审批,我只需要直接提交申请的就可以。那如果我们是对工作流信息进行审批的人呢,今天我们就看一下activiti的TaskListener。

TaskListener

TaskListener,他类似与C#中委托的功能,他能准确的再你执行完成当人物的方法时去调用该接口中你需要执行的一个方法notify。而我就是在这个方法里边去指定的他的下一级是谁。下边我以学术审批的功能来将一下我是如何实现这个的。

代码实现

添加Listener

添加
单机new按钮
添加2
选择create,单机Select class,然后选择我们实现了TaskListener的类就可以了。

代码

既然是完成,那么我们就直接来一个完成的代码

    @RequestMapping("/completeByTeacher")
    public String throwApply(HttpServletRequest request,
            HttpServletResponse response) {
        // 1.获取页面上要处理的任务ID,按钮信息,评论信息
         String userId = request.getParameter("usercode");
        //String userId = "456";
        String strTaskId = request.getParameter("taskId");
        String isapprove = request.getParameter("msg");
        String comment = request.getParameter("comment");
        // String strTaskId = "11209";
        // 将获取的任务id的字符串转换成数组
        String[] taskIds = strTaskId.split(",");

        try {
            // 2.循环完成任務
            for (String taskId : taskIds) {
                // String taskId="3212";

                // 2.1根据人物ID查询流程实力ID
                Task task = processEngine.getTaskService().createTaskQuery()
                        .taskId(taskId).singleResult();
                // 获取流程实例ID
                String processInstance = task.getProcessInstanceId();
                // 2.2根据流程实例ID,人物ID,评论的消息,保存教师或者学术对与该学生申请的评论信息
                processEngine.getTaskService().addComment(taskId,
                        processInstance, comment);

                EngineController engineController = new EngineController();
                // 2.3查询当前任务后边的连线名称
                List<String> list = findOutComeListByTaskId(taskId);
                if (list.size() > 0 && list != null) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    // 如果是批准操作,则根据连线名称和当前的任务名称,完成操作。
                    map.put("outcome", isapprove);
                    // 2.4如果又连线名称,则根据连线和任务ID完成人物
                    engineController.compalete(taskId, map);
                } else {
                    // 2.4如果只有任务id,连线没有名称,则直接完成当前任务,并修改用户的当前状态。
                    intershipBean.updateUserInfoByID("itoo_intership", userId,
                            "1");
                    processEngine.getTaskService().complete(taskId);

                }
            }
        } catch (Exception e) {
            // 报错
            return "redirect:/queryTaksByRole";
        }
        return "redirect:/queryTaksByRole";

    }

上边是我的完成人物,但是我需要根据前台我选择的是通过或者驳回,来执行,那么我就需要判断我的这个任务之后的连线,很明显我的是一个通过和驳回,那么获取前台按钮的名称就可以了。然后去执行,那么我们的方法如下:

// 一直任务ID,查询processDefinitionEntity对象,从而获取
    // 当前任务完成之后的连线名称,并设置到List<String>对象中
    public List<String> findOutComeListByTaskId(String taskId) {
        // 返回连线的名称集合
        List<String> list = new ArrayList<String>();

        // 1.使用任务ID查询任务对象
        Task task = processEngine.getTaskService().createTaskQuery()
                .taskId(taskId).singleResult();
        // 2.获取流程定义ID
        String processDefinitionId = task.getProcessDefinitionId();
        // 3.查询流程定义(ProcessDefinitionEntity)的实体对象
        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processEngine
                .getRepositoryService().getProcessDefinition(
                        processDefinitionId);
        // 使用任务对象Task获取流程实例ID
        String processInstanceId = task.getProcessInstanceId();
        // 使用历程实例ID,查询正在执行的对象表,返回流程实例对象
        ProcessInstance pi = processEngine.getRuntimeService()
                .createProcessInstanceQuery()
                .processInstanceId(processInstanceId).singleResult();

        // 4.获取当前的活动
        ActivityImpl activityImpl = processDefinitionEntity.findActivity(pi
                .getActivityId());

        // 5.获取当前活动完成之后连线的名称
        List<PvmTransition> pvmList = activityImpl.getOutgoingTransitions();
        if (pvmList != null && pvmList.size() > 0) {
            for (PvmTransition pvm : pvmList) {
                String name = (String) pvm.getProperty("name");
                if (name != null) {
                    list.add(name);
                }
            }
        }
        return list;
    }

Listener的实现类

/**用来指定任务的办理人*/
    @Override
    public void notify(DelegateTask delegateTask) {
            //如果任务的个数大于1的话,则ID为RoleID
                String sql = "select * From tb_relation where intershipid='" + processDefId + "' and childCode='" + lastassignee + "'";

                Dbhelper dbCourseCurrentadd = new Dbhelper();
                 dbCourseCurrentadd.setSql(sql.toString());      
                 List<Map<String,Object>> listmap =  dbCourseCurrentadd.findItemById();

                 if(listmap.size() > 0 && listmap!=null){
                     Map<String, Object> m = listmap.get(0);    
                     nextLevel = (String) m.get("fatherCode");
                 }
    }

需要说明的是DelegateTask这个参数中又流程实例的ID,我们可以根据这个ID,找到我们是做的哪一个审批,然后去查询相应的下一级办理人。因为我又一个tb_relation的表来存储下一级,所以直接查询就可以了。

小结

当然我们完全可以不用TaskListener的方法来实现,只是这样的话,我们是不是就可以直接达到服用,这个流程可以用这个类,其他的流程也是直接添加一下Listener,然后就不用管这里的逻辑了,能更好的实现解耦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

activiti--完成当前任务,动态指定下一级执行者 的相关文章

  • 为什么分支名称不能在开头包含“#”字符?

    这个 git checkout b 1 my awesome feature 产生错误 error switch b requires a value 用反斜杠转义或用引号括起来都可以 git checkout b 1 my awesome
  • 教程的版本控制设置

    我正在尝试为与编程相关的教程设置版本控制 事实证明这是有问题的 因为有两种不同的历史 本教程提供了项目构建的历史记录 每个章节都提供了该项目的历史记录 读者将看到这些历史记录 如果我从未打算再次更改教程中已编写的章节 我可以将每个章节作为标
  • TFS 构建工作流程将文件夹/文件属性从只读更改为读/写?

    在我们的一个 Web 应用程序中 要求某些 HTML 页面可以在我们为用户创建的 GUI 界面中进行编辑 不幸的是 该接口直接从服务器上的页面 也在 wwwroot 中 读取 写入 服务器上的另一个页面从中读取并显示它 我现在所做的是改变了
  • 基于工作流状态的不同权限

    我需要根据对象的工作流程状态对对象设置不同的权限 例如 经理组 仅在状态 草稿时才可以编辑对象 但 超级经理组 在状态 已验证时也可以编辑对象 似乎不可能使用ir model access我正在评估是否可以使用ir rule 看来不是 有没
  • 如何从子目录运行多个 GitHub Actions 工作流程

    我有3个目录 github workflows linters 功能测试 单元测试 在每个目录中我都有多个工作流程 yml文件例如在linters codeQuality yml 我的问题是 当发出拉取请求时 仅执行根目录中的工作流程文件
  • 无法使用 GitHub Actions 强制推送到主分支

    Error remote rejected main gt main refusing to allow a GitHub App to create or update workflow github workflows docker y
  • 使用 GIT 在本地服务器和实时服务器之间同步网站文件?

    假设我有两台 Web 服务器 一台是本地开发的 一台是实时的 在 SVN 下 我会将网站文件检出到本地网络服务器的 public html 目录以及实时网络服务器的 public html 目录 然后 我将直接在本地服务器上处理文件 并将任
  • 寻找使用 git-format-patch 和 git am 的工作流程示例

    我正在考虑让我的学生使用 git 进行结对编程 由于学生的工作必须保密 因此不可能公开回购 相反 每个学生都会有一个他们自己维护的私人存储库 并且他们需要使用 git format patch 交换补丁 我已经阅读了手册页 但我有点不清楚w
  • 如何将候选用户列表传递给 alfresco 中的 activiti 工作流任务?

    我希望能够传递作为任务候选者的用户列表 用户是从数据列表中检索的 不能作为一个组使用 Activiti candidateUsers 似乎是正确的方法 假设已获取用户并将其设置在变量 ipw reviwers 中
  • SharePoint Designer 工作流程 - 提示和资源?

    我正在努力修改一些现有的 SPD WF 并努力解决一些概念 包括为什么 2 个看起来相似的 WF 不会产生相同的输出 你们中是否有人使用过 SharePoint Designer 工作流并知道任何好的资源 比 MSDN 介绍更详细 或有关此
  • NetSuite pdf 模板中基于货币的发票金额总和

    我想要 netsuite 高级 pdf 模板中基于其货币的发票总和 我期待下面的结果 这与此非常相似post https stackoverflow com questions 44013395 does oracle netsuite a
  • JQuery 中的网络图/流程图[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 工作流程中的 Dynamics CRM 当前日期占位符

    我已将工作流程附加到具有到期日期和时间的实体 那么指示当前时间的适当占位符是什么 CURRENT TIME Sultan 您的问题有点模糊 但如果您通过编辑器谈论 Dynamics CRM 工作流程 则工作流程运行的时间就是执行时间 为此
  • 将 Activiti 任务从旧流程迁移到新流程

    我有一个用于某些业务流程的 Activiti 项目 问题在于移民 现有流程有一些未完成的任务 我想通过添加新步骤来修改现有流程 现在 当我创建一个新任务时 这个新任务将根据更新的流程进行处理 而未完成的任务将按照旧流程进行处理 让我们看下面
  • 工作流程单元测试

    如何对 Windows 工作流程进行单元测试 K 斯科特 艾伦 已发布this http odetocode com Blogs scott archive 2006 08 02 5492 aspx 它提供了一种对自定义活动进行单元测试的方
  • JIRA 插件:从哪里开始

    我被要求创建一个简单的 JIRA 插件 它结合了工作流程 自定义字段 条件步骤 我刚刚开始安装 JIRA 并最终成功创建了一个运行简单的 Hello World 插件 我已经对这个界面有多大感到困惑 似乎无法掌握大局 你们中的任何人都可以带
  • 通过列表 Web 服务更新列表项来触发 SharePoint 工作流

    我正在开发一个简单的 SharePoint 顺序工作流 它应该绑定到文档库 将小工作流程关联到文档库时 我检查了这些选项 允许手动执行此工作流程 由经过身份验证的用户启动 具有编辑项目权限 开始 当新项目出现时 此工作流程 创建的 启动此工
  • 是否可以让 Excel 突出显示不符合我所需格式的单元格(例如日期为 6.2.2021 与所需的 6/2/2021)?

    我使用电子表格来确定团队工作流程的优先顺序 某些单元格的突出显示取决于我们与循环时间的接近程度 有开始日期 暂定结束日期和出院日期 如果出现以下情况 空白出院日期单元格将变为红色 开始日期不为空 暂定不为空 今天的日期距离暂定日期不超过五天
  • 基于 ASP.NET 的工作流引擎

    我正在为一个新应用程序制定设计规范 该应用程序将在很大程度上由工作流程驱动 在我重新发明轮子之前 是否已经有一个像样的轻量级工作流引擎可以插入 ASP NET 中 基本上 我正在寻找能够在一组定义的工作流程页面中移动 同时自动处理状态管理的
  • 如何共享/扩展/重用/引用 GitHub Workflow?

    我有两个工作流程 一种方式是通过推送到 master 来部署到测试环境 另一个在发布到生产环境时部署 它们90 相同 代码复制粘贴 是否有一个概念 例如提取部分重复逻辑并将其放入自己的文件 部分 片段中 GitHub Actions 中的重

随机推荐

  • EMC-MLCC电容反谐振点引起的RE辐射超标

    MLCC电容反谐振点引起的RE辐射超标 对待RE辐射问题 可以按照干扰源 干扰路径 被干扰源 入手较多的是干扰源和干扰路径 解决干扰源可以从展频 调频 屏蔽干扰源 增加RC snabber吸收干扰源等方向入手 解决干扰路径的 可以分为差模干
  • 网络互连基础的实验

    拓扑 需求 某网络整体结构如图所示 根据如图的IP规划 为设备配置IP地址 在各路由器上配置静态路由 要求实现全网互联 在DNS服务器上增加一条域名解析记录 域名可自定义 当通过PC端用域名访问Web服务器时 PC端浏览器能够返回web服务
  • Python使用免费天气API,获取全球任意地区的天气情况

    需求背景 公司是做外贸服装的 在亚马逊平台上有多个地区店铺运营 运营人员需要参考地区的天气情况 上新的服装 所以需要能够获取全球任意地区的天气情况 还需要预测未来10 15天的天气情况 选型API 天气API中有大把免费的api 如 国内的
  • 基于元学习的红外弱小点状目标跟踪算法

    基于元学习的红外弱小点状目标跟踪算法 人工智能技术与咨询 昨天 本文来自 激光技术 作者热孜亚 艾沙等 引言 红外点状目标的跟踪是红外搜索和跟踪 infrared search and track IRST 系统中的关键技术之一 1 在红外
  • vue手机端的调试神器eruda

    前言 分享一款神奇 可以在手机上实现 跟pc端f12打开调试一样的效果 官方地址 入口 实现效果 实现步骤 1 cdn使用 打开public index html加入 2 node使用 cnpm install eruda save
  • 配置Apache2.4.46

    解压后打开 Apache24 conf 的httpd conf 定位Define SRVROOT并将后面的 SRVROOT 改为自己解压后的Apache24文件夹路径 下一行ServerRoot后面的 SRVROOT 相同操作 在cmd输入
  • SpringBoot整合AMQP

    SpringBoot整合AMQP 文章目录 SpringBoot整合AMQP 前言 一 JMS AMQP概念以及区别 二 RabbitMQ简介 三 互联网大厂为什么选择RabbitMQ 四 RabbitMQ的一些核心概念 五 RabbitM
  • 推荐系统系列——推荐算法评价指标

    文章目录 同步读书之 菜根谭 9 静坐观心 真妄毕现 10 得意早回头 拂心莫停手 推荐算法评价指标 1 评分预测指标 1 1 符号定义 1 2 平均绝对误差 1 3 均方根误差 1 4 覆盖率 2 集合推荐指标 2 1 混淆矩阵 2 2
  • 微信小程序事件传参

    微信小程序事件传参 微信小程序怎么事件传参 dataset 对象 事件对象 目标对象 总结 两步骤 微信小程序怎么事件传参 dataset 对象 每个虚拟dom身上都拥有一个dataset对象 给虚拟 dom 绑定上 data 自定义键 值
  • Docker服务的重启服务命令(systemctl restart docker)

    重启Docker服务 重启docker服务 systemctl restart docker 非root用户使用 重启docker服务 sudo systemctl restart docker
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近2年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • nginx配置域名访问

    1 本地开发好的demo程序 target目录下 把META INF WEB INF index jsp 所有文件打成zip包 如下图 2 Linux服务器下 部署到Tomcat下 清空ROOT目录下所有文件 把1中nginx zip文件放
  • 点云TXT与PCD格式之间的转换

    开发环境为win10 vstudio2019 注 txt形式的点云文件没有header 存储的全是xyz数据 如下图 这个点云数据中不仅包含有x y z的位置信息 还包含其他的位置信息 因此我们只需要提取前三列的信息 并忽略前两行 提取后的
  • 消息中间件篇

    消息中间件篇 RabbitMQ 如何保证消息不丢失 面试官 RabbitMQ如何保证消息不丢失 候选人 嗯 我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的 这里面就要求了消息的高可用性 我们要保证消息的不丢
  • CVPR 2022|U2PL:使用不可靠伪标签的半监督语义分割

    本文转自商汤学术 导读 半监督任务的关键在于充分利用无标签数据 商汤科技联合上海交通大学 香港中文大学 基于 Every Pixel Matters 的理念 有效利用了包括不可靠样本在内的全部无标签数据 大幅提升了算法精度 目前 U2PL
  • openGL之API学习(八)glutSwapBuffers

    glutSwapBuffers函数是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数 该函数的功能是交换两个缓冲区指针 通常 我们所看到的窗体 文字 图像 从根本上来说都是 画 出来的 比如 制作一个简单的五子棋 我们可能先要
  • 【AI 顶会】NIPS2019接收论文完整列表

    NeurIPS2019 NeurIPS 2019的论文结果已经出炉 包括了36篇oral和164篇spotlights共1428篇论文 可以看到论文的主题还是以深度学习 神经网络 图 优化 通用性 鲁棒性以及效率等方面为主 详细的列表见下文
  • 时间序列-ARIMA模型

    数据平稳性与差分法 平稳性 平稳性就是要求经由样本时间序列所得到的拟合曲线 在未来的一段期间内仍能顺着现有的形态 惯性 地延续下 平稳性要求序列的均值和方差不发生明显变化 严平稳与弱平稳 严平稳 严平稳表示的分布不随时间的改变而改变 如 白
  • Django+Golang实现一键启动

    背景 1 实现Django项目在陌生服务器通过一个程序或命令一键启动 实现方式 思路 服务器要求 1 docker 2 sed 用于替换配置文件端口 3 tar 启动程序我们采用Go来写 步骤 先按照config文件内容定义结构体 如下为c
  • activiti--完成当前任务,动态指定下一级执行者

    最近在做一个工作流审批的项目 类似与申请一个请假 但是在完成任务的时候需要动态指定下一级人物 在最开始了解的时候 书上都是直接根据taskId来完成 后来终于实现了这个动态指定下一级处理人的功能 我们的项目是这么一个流程 那么例如我是一个提