1:

我们知道JBPM系统,决定一个流程当前在什么环节的关键是task 和toker。他们在数据库中的表分别是JBPM_TASKINSTANCE,JBPM_TOKEN。我的设计思想是,放弃JBPM自身的API,因为我看了一段时间的JBPM的API,没有找到可以灵活操作taskinstance,和token的方法。于是自己写sql语句自己操作这两张表。

在项目中之所以使用回退功能,主要是可是在流程过程中的某个环节的办理是发生了错误,所有客户要求把流程退回到指定的环节重新办理。

从理论上只要办当前流程中活动的TASK,用我们的程序把它变成已办理的状态,把客户想要回退到的环节的TASK从新激活,最后把TOKEN的节点ID指向到回退后的NODE。

所以只要我们自己操作这两个表就OK了。

JBPM_TASKINSTANCE 表中有三个字段是表示这个任务是办理完了还是没有办理。他们是:END_,ISOPEN_,ISSIGNALLING_,其中END_是一个日期类型表示这个任务什么时候办完,ISOPEN_,ISSIGNALLING_这两个字段为1时表示未办完,0时表示办完了。另外PROCINST_字段也很重要,他是维护的这个任务属于的流程实例化ID。我在项目中是利用流程实例ID和业务表联系,比如一个公文系统中,一定是有一个公文的信息表,里面放着这个文件的标题,文号等信息。其中有一个字段放着流程实例化ID,这样每个公文可以和一个流程关联。

还有一张表JBPM_NODE他存放着每个流程(注意是定义流程而不是实例化流程)的各个节点,我们需要把它列出来这样才可以选择流程回退到哪个环节。可是这个表里的各个环节是个流程定义ID关联而不是实例流程ID关联,所以只能是JBPM_NODE,JBPM_PROCESSDEFINITION,JBPM_PROCESSINSTANCE三张表关联查询。SQL语句如下:

Sql代码
  1. SELECT node.ID_,node.NAME_ FROM
  2. tjsoadba.JBPM_NODE node,tjsoadba.JBPM_PROCESSINSTANCE instance,
  3. tjsoadba.JBPM_PROCESSDEFINITION definition
  4. WHERE instance.PROCESSDEFINITION_  = definition.ID_
  5. and definition.ID_=node.PROCESSDEFINITION_ and instance.ID_=#流程实例化ID#
SELECT node.ID_,node.NAME_ FROM
tjsoadba.JBPM_NODE node,tjsoadba.JBPM_PROCESSINSTANCE instance,
tjsoadba.JBPM_PROCESSDEFINITION definition
WHERE instance.PROCESSDEFINITION_  = definition.ID_
and definition.ID_=node.PROCESSDEFINITION_ and instance.ID_=#流程实例化ID#

表名前加了所有者,各位注意一下。另外我在项目中用的IBATIS所以变量前后加了##.

这样我们把一个流程的所有节点都查出来了。在页面上显示就OK了。

第二步:

在JSP页面上显示是我显示多个单选按钮让客户选择。大家看见我查出的结果是有一个ID,和一个NAME字段。

在JSP显示

Html代码
  1. <input type="radio" name="node" value="<%=节点ID%>,<%=节点名称%>"/><%=节点名称 %>
<input type="radio" name="node" value="<%=节点ID%>,<%=节点名称%>"/><%=节点名称 %>

之所以页面上的value的内容我用id,name的方式处理,因为我流程中的所有的节点和task的名字一样,这样后面的task表的任务计划简单一些。节点ID是以后操作TOKER表时候用的。

第三步:

我们显示了用户可以选择的后退的环节后提交表单。action中把task表中的所有激活的记录全部终止。

sql语句如下:

Sql代码
  1. update    tjsoadba.JBPM_TASKINSTANCE   set ISOPEN_=0,ISSIGNALLING_=0,END_= #当前日期#
  2. where  PROCINST_ =#流程实例ID#  and END_ is null
update    tjsoadba.JBPM_TASKINSTANCE   set ISOPEN_=0,ISSIGNALLING_=0,END_= #当前日期#
where  PROCINST_ =#流程实例ID#  and END_ is null

接下来把客户选择的节点上的TASK重新激活

sql

Java代码
  1. update    tjsoadba.JBPM_TASKINSTANCE
  2. set ISOPEN_=1,ISSIGNALLING_=1,END_= null
  3. where  PROCINST_ = #流程实例ID# and NAME_= #任务名称#
update    tjsoadba.JBPM_TASKINSTANCE
set ISOPEN_=1,ISSIGNALLING_=1,END_= null
where  PROCINST_ = #流程实例ID# and NAME_= #任务名称#

这里的任务名称就是上面的JSP页面中的节点名称,大家一定要注意这里的节点名称和taskinstance表里的NAME_字段是两个完全不同的东西。只是我在项目中的所有的环节的名字和这个环节的TASK的名字是一样的所以才这么写,如果不一样各位只能自己再查。而且我建议各位在项目中把节点和TASK的名字设置成一样。

第四步:

最后我们只要把token表中的NODE_设置成上面JSP页面中传过来的节点ID就OK了。

sql

Sql代码
  1. update   tjsoadba.JBPM_TOKEN   set NODE_ = #节点ID#  where  ID_ = #流程实例ID#
update   tjsoadba.JBPM_TOKEN   set NODE_ = #节点ID#  where  ID_ = #流程实例ID#

这里说明一下流程的实例ID和他的Token的ID是一样的所以可以把它的流程实例ID当做令牌ID这么写。

JBPM回退功能的实现相关推荐

  1. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  2. Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能

    文章目录 概述 没有添加fallback功能的示例 使用zuul为单个微服务添加容错和回退功能 Step1. 新建微服务microservice-gateway-zuul-fallback Step2 ...

  3. 标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录。通过后退或向前按钮就能在历史记录之间跳转。现在,请你模拟这个功能,接收如下三条指令:1. BACK:回退功能,即回退到上一个访问的

    标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录.通过后退或向前按钮就能在历史记录之间跳转. 现在,请你模拟这个功能,接收如下三条指令: 1. BACK:回退功能,即回退到上一个访问的页面 ...

  4. 开发工具:Git 代码回退功能详解,很实用!

    来源:占小狼的博客 从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码.提交.合并等,更复杂的操 ...

  5. pycharm设置回退功能

    把这个tool勾选上就好了 左上角就有了这个功能:

  6. flowable实现流程回退功能

    此版本为旧的版本,建议参看新的版本6.4.0 前期项目要求实现流程回退(仅要求回退到上一节点),所使用的flowable版本是6.2.0-SANPSHOT.在网上收到的流程回退的例子都是activit ...

  7. Google Chrome浏览器的回退功能快捷键

    能点击进来的应该都是键盘党,我也是.以下: Alt+← 回退 Alt+→ 前进 在常用的的浏览器中,按Backspace键是可以回退页面的. 但在Google Chrome浏览器中这个快捷键被禁用,只 ...

  8. java inputstream 回退_系统学习 Java IO (十)----回退流 PushbackInputStream

    PushbackInputStream 旨在从 InputStream 解析数据时使用. 有时您需要先读取几个字节以查看将要发生的事情,然后才能确定如何解释当前字节, PushbackInputStr ...

  9. Android 的简介和体系结构中每个层的功能。

    Android 的简介和体系结构中每个层的功能. 1.简介 Android是由Google公司和开放手机联盟领导并开发的一种基于Linux的自由且开放源代码的操作系统,主要使用于移动设备. Andro ...

最新文章

  1. Expression Web 3 安装问题
  2. boost::outcome模块containers相关的测试程序
  3. idea常用但容易忘记的快捷键
  4. 样式中文字和图片对齐问题
  5. 关于阿里云OSS报错-java.lang.ClassNotFoundException: org.jdom.input.JDOMParseException
  6. 20201016:力扣第210周周赛题解(下)
  7. AdaBoost(1)
  8. Unity移动端使用 Handheld.PlayFullScreenMovie播放视频参数
  9. Unity3d十二 3d主要引擎名称Ogre Unreal Unity Gamebryo Bigworld
  10. Effective GO
  11. 虚幻4毛发系统_虚幻5引擎demo与虚幻4 demo对比视频 效果进步明显
  12. B. Alice and the List of Presents(组合数学)
  13. 鲁迅朱安:留给世纪的背影_拔剑-浆糊的传说_新浪博客
  14. Vulcan 基于Meteor的APollO框架 , grapesjs 用于可视化生成Html 页面
  15. 红蓝对抗---蓝队手册
  16. 界面专访丁珂:多数企业安全体系落后,上云是最快速解法
  17. c语言编写五子棋报告,c语言报告五子棋.pdf
  18. redis实战读后感(五)-构建支持程序
  19. 标识别,人脸识别等常用数据集
  20. 虚拟机集群启动,Hadoop常用命令

热门文章

  1. Unity初步 基本拼图实现
  2. iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
  3. Java线程与并发编程实践----同步器(Phaser)
  4. 使用Nginx自带的Realip模块获取用户真实IP
  5. Go 语言读写 Excel
  6. android loadlibrary 更改libPath 路径,指定路径加载.so
  7. Using mongoDB's Profiler analyze the performance of database operations
  8. 程序员面试什么最重要
  9. .net Redis使用公共方法引用CSRedisCore
  10. JAVA基础之理解JNI原理