http://www.verydemo.com/demo_c161_i143918.html

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.db.DbSqlSession;
import org.activiti.engine.impl.db.DbSqlSessionFactory;
import org.activiti.engine.impl.db.ListQueryParameterObject;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.rest.api.ActivitiUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; /*
* 2013.01.25
*
* 任务回退
*
* 需求:从当前任务 任意回退至已审批任务
* 方法:通过activiti源代码里的sqlSession直接修改数据库
*
* 第一步 完成历史TASK覆盖当前TASK
* 用hi_taskinst修改当前ru_task
* ru_task.ID_=hi_taskinst.ID_
* ru_task.NAME_=hi_taskinst.NAME_
* ru_task.TASK_DEF_KEY_=hi_taskinst.TASK_DEF_KEY_
*
* 第二步
* 修改当前任务参与人列表
* ru_identitylink 用ru_task.ID_去ru_identitylink 索引
* ru_identitylink.TASK_ID_=hi_taskinst.ID_
* ru_identitylink.USER_ID=hi_taskinst.ASSIGNEE_
*
* 第三步修改流程记录节点 把ru_execution的ACT_ID_ 改为hi_taskinst.TASK_DEF_KEY_
*
* author:pvii007
* version:1.0
*/
public class DbTaskReturn
{
public static final int I_NO_OPERATION = 0; public static final int I_DONE = 1; public static final int I_TASK_NOT_FOUND = 2; public static final int I_ROLLBACK = 3; /*
* 实现回退方法
*/
public static int dbBackTo(String currentTaskId, String backToTaskId)
{
int result = DbTaskReturn.I_NO_OPERATION;
SqlSession sqlSession = getSqlSession();
TaskEntity currentTaskEntity = getCurrentTaskEntity(currentTaskId);
HistoricTaskInstanceEntity backToHistoricTaskInstanceEntity = getHistoryTaskEntity(backToTaskId);
if (currentTaskEntity == null || backToHistoricTaskInstanceEntity == null)
{
return DbTaskReturn.I_TASK_NOT_FOUND;
}
String processDefinitionId = currentTaskEntity.getProcessDefinitionId();
String executionId = currentTaskEntity.getExecutionId();
String currentTaskEntityId = currentTaskEntity.getId();
String backToHistoricTaskInstanceEntityId = backToHistoricTaskInstanceEntity.getId();
String backToTaskDefinitionKey = backToHistoricTaskInstanceEntity.getTaskDefinitionKey();
String backToAssignee = backToHistoricTaskInstanceEntity.getAssignee();
boolean success = false;
try
{
// 1.
StepOne_use_hi_taskinst_to_change_ru_task(sqlSession, currentTaskEntity, backToHistoricTaskInstanceEntity);
// 2.
StepTwo_change_ru_identitylink(sqlSession, currentTaskEntityId, backToHistoricTaskInstanceEntityId,
backToAssignee);
// 3.
StepThree_change_ru_execution(sqlSession, executionId, processDefinitionId, backToTaskDefinitionKey);
success = true;
}
catch (Exception e)
{
throw new ActivitiException("dbBackTo Exception", e);
}
finally
{
if (success)
{
sqlSession.commit();
result = DbTaskReturn.I_DONE;
}
else
{
sqlSession.rollback();
result = DbTaskReturn.I_ROLLBACK;
}
sqlSession.close();
}
return result;
} private static void StepThree_change_ru_execution(SqlSession sqlSession, String executionId,
String processDefinitionId, String backToTaskDefinitionKey) throws Exception
{
List<ExecutionEntity> currentExecutionEntityList = sqlSession.selectList("selectExecution", executionId);
if (currentExecutionEntityList.size() > 0)
{
ActivityImpl activity = getActivitiImp(processDefinitionId, backToTaskDefinitionKey);
Iterator<ExecutionEntity> execution = currentExecutionEntityList.iterator();
while (execution.hasNext())
{
ExecutionEntity e = execution.next();
e.setActivity(activity);
p(sqlSession.update("updateExecution", e));
}
}
} private static void StepTwo_change_ru_identitylink(SqlSession sqlSession, String currentTaskEntityId,
String backToHistoricTaskInstanceEntityId, String backToAssignee) throws Exception
{
ListQueryParameterObject para = new ListQueryParameterObject();
para.setParameter(currentTaskEntityId);
List<IdentityLinkEntity> currentTaskIdentityLinkEntityList = sqlSession.selectList("selectIdentityLinksByTask",
para);
if (currentTaskIdentityLinkEntityList.size() > 0)
{
Iterator<IdentityLinkEntity> identityLinkEntityList = currentTaskIdentityLinkEntityList.iterator();
IdentityLinkEntity identityLinkEntity;
TaskEntity tmpTaskEntity;
tmpTaskEntity = new TaskEntity();
tmpTaskEntity.setId(backToHistoricTaskInstanceEntityId);
while (identityLinkEntityList.hasNext())
{
identityLinkEntity = identityLinkEntityList.next();
identityLinkEntity.setTask(tmpTaskEntity);
identityLinkEntity.setUserId(backToAssignee);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", identityLinkEntity.getId());
sqlSession.delete("deleteIdentityLink", parameters);
sqlSession.insert("insertIdentityLink", identityLinkEntity);
}
}
} private static void StepOne_use_hi_taskinst_to_change_ru_task(SqlSession sqlSession, TaskEntity currentTaskEntity,
HistoricTaskInstanceEntity backToHistoricTaskInstanceEntity) throws Exception
{
sqlSession.delete("deleteTask", currentTaskEntity);
currentTaskEntity.setName(backToHistoricTaskInstanceEntity.getName());
currentTaskEntity.setTaskDefinitionKey(backToHistoricTaskInstanceEntity.getTaskDefinitionKey());
currentTaskEntity.setId(backToHistoricTaskInstanceEntity.getId());
sqlSession.insert("insertTask", currentTaskEntity);
} public static void p(Object o)
{
System.out.println(o);
} private static ActivityImpl getActivitiImp(String processDefinitionId, String taskDefinitionKey)
{
RepositoryService repositoryService = ActivitiUtil.getRepositoryService();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(processDefinitionId);
List<ActivityImpl> activitiList = processDefinition.getActivities();
boolean b;
Object activityId;
for (ActivityImpl activity : activitiList)
{
activityId = activity.getId();
b = activityId.toString().equals(taskDefinitionKey);
if (b)
{
return activity;
}
}
return null;
} private static TaskEntity getCurrentTaskEntity(String id)
{
return (TaskEntity) ActivitiUtil.getTaskService().createTaskQuery().taskId(id).singleResult();
} private static HistoricTaskInstanceEntity getHistoryTaskEntity(String id)
{
return (HistoricTaskInstanceEntity) ActivitiUtil.getHistoryService().createHistoricTaskInstanceQuery()
.taskId(id).singleResult();
} private static SqlSession getSqlSession()
{
ProcessEngineImpl processEngine = (ProcessEngineImpl) ActivitiUtil.getProcessEngine();
DbSqlSessionFactory dbSqlSessionFactory = (DbSqlSessionFactory) processEngine.getProcessEngineConfiguration()
.getSessionFactories().get(DbSqlSession.class);
SqlSessionFactory sqlSessionFactory = dbSqlSessionFactory.getSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}

Activiti从当前任务任意回退至已审批任务的更多相关文章

  1. jbpm4 回退、会签、撤销、自由流

    http://blog.csdn.net/xiaozhang0731/article/details/8699558 1. jBPM4的特点 jBPM是JBoss众多开源项目中的一个工作流开源项目,也 ...

  2. Dynamic CRM 2013学习笔记(三十四)自定义审批流5 - 自动邮件通知

    审批过程中,经常要求自动发邮件:审批中要通知下一个审批人进行审批:审批完通知申请人已审批完:被拒绝后,要通知已批准的人和申请人.下面详细介绍如何实现一个自动发邮件的插件:   1. 根据审批状态来确定 ...

  3. 【知识总结】Activiti工作流学习入门

    1. 我理解的工作流: 在工作中慢慢接触的业务流程,就向流程控制语言一样,一步一步都对应的不同的业务,但整体串联起来就是一个完整的业务.而且实际工作中尤其是在企业内部系统的研发中,确实需要对应许多审批 ...

  4. SharePoint 2013 工作流之年假审批Designer配置篇

    本文介绍SharePoint 2013 使用Designer工具,设计年假审批工作流,由于流程所用的条件和操作都比较简单,所以演示为主,最后附流程图和流程的文本图,有兴趣的可以参照实验.如果对于Des ...

  5. Activiti创建表(三)

    创建Mysql 创建 mysql 数据库 activiti(名字任意):CREATE DATABASE activiti DEFAULT CHARACTER SET utf8; pom.xml < ...

  6. Activiti CamelTask(骆驼任务)

    Activiti CamelTask(骆驼任务) 作者:Jesai 人生想讲个不成熟的建议 前言: Camel任务可以从Camel发送和介绍消息,由此强化了activiti的集成功能. 注意camel ...

  7. Infragistics的介绍以及在ASP.net中使用的总结

    Infragistics系列控件是一套很好,很强大的控件,.感觉很好..现在自己做项目也用..却发现网上没有一套中文的教程,中文资料都很少..在这里就把自己的研究心得写下来... 首先安装,一步一步装 ...

  8. ocp11g培训内部教材_052课堂笔记(042)_体系架构

    OCP 052 课堂笔记 目录 第一部分: Oracle体系架构... 4 第一章:实例与数据库... 4 1.Oracle 网络架构及应用环境... 4 2.Oracle 体系结构... 4 3. ...

  9. 官方问答--微信小程序常见FAQ (17.8.21-17.8.27)

    给提问的开发者的建议:提问之前先查询 文档.通过社区右上角搜索搜索已经存在的问题. 写一个简明扼要的标题,并且正文描述清楚你的问题. 提交 BUG:需要带上基础库版本号,设备信息(iOS, Andro ...

随机推荐

  1. 【转】Bash中的shopt选项

    set选项与shopt选项是两组不同的内容,用set -o和shopt -p可以分别查看两个组所有的打开和关闭的条目, 在默认状态下,有些是打开的,有些是关闭的,shopt各选项随着bash版本的更新 ...

  2. 恒天云技术分享系列4 – OpenStack网络攻击与防御

    恒天云技术分享系列:http://www.hengtianyun.com/download-show-id-13.html 云主机的网络结构本质上和传统的网络结构一致,区别大概有两点. 1.软网络管理 ...

  3. Solution for latex error:”Unknown graphics extension: .eps“ or "Can not find XXX"

    Sample code: \begin{figure*} \centering % Requires \usepackage{graphicx} \includegraphics[width=7in] ...

  4. hdu4587-TWO NODES(割点)

    #include <bits/stdc++.h> using namespace std; ; ; struct Edge { int to, next; } edge[M]; int h ...

  5. Android实例-操作sqlite数据之自建导航(XE8+小米2)

    相关资料: 源文:http://blog.sina.com.cn/s/blog_77691fb90101g9hh.html help://embarcadero.rs_xe5/rad/Mobile_T ...

  6. 转载 ASP.NET常用的正则表达式

    转载原地址: http://www.cnblogs.com/0001/archive/2010/01/26/1656677.html 常用表达式: "^\d+$" //非负整数(正 ...

  7. 转载SSIS中的容器和数据流—数据转换(Transformations)

    对数据流来说按照需求将数据转换成需要的格式是数据操作中的一个关键的步骤.例如想要得到聚合排序后的运算结果,转换可以实现这种操作.和SQL Server 2000 DTS完全不同,这些操作不需要编写sc ...

  8. Countly在andoid和vps集成使用,开源的统计分析sdk

    这几天项目需要,简单研究了一下countly,说实话完全满足项目需要,比umeng这类产品干净多了. Countly Mobile Analytics 下面就讲一下android 集成的过程,以及 服 ...

  9. android侧滑菜单笔记

    一.SlidingPaneLayout v4包下的控件,使用简单,功能简洁.官方文档明确说明该控件只能左侧滑动.使用如下: <android.support.v4.widget.SlidingP ...

  10. GridView控件显示图片

    与图片的二进制数据库存储和显示 1.将图片以二进制存入数据库 2.读取二进制图片在页面显示 3.设置Image控件显示从数据库中读出的二进制图片 4.GridView中ImageField以URL方式 ...