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. Windows下ffmpeg的完美编译

    纠结了好几天,终于搞定了,小结一下. 1.下载ffmpeg源码,官网 2.编译环境Msys的安装配置,http://blog.csdn.net/jszj/article/details/4028716 ...

  2. 关于main()和_tmain()

    1.两者的共同点 int _tmain(int argc, _TCHAR* argv[])    和  int main(int argc, char* argv[])  ,两者都是程序的主函数,两者 ...

  3. 在Windows操作系统中,如何终止占有的8080端口的tomcat进程

    在Windows操作系统中,我们在启动一个tomcat服务器时,经常会发现8080端口已经被占用的错误,而我们又不知道如何停止这个tomcat服务器. 本文将通过命令来强行终止这个已经运行的tomca ...

  4. fscanf(格式化字符串输入)

    fscanf(格式化字符串输入) 相关函数 scanf,sscanf 表头文件 #include<stdio.h> 定义函数 int fscanf(FILE * stream ,const ...

  5. UITableView性能优化

    关于UITableView的性能优化,网络上也有一些总结.在这里就介绍下我们项目中遇到的问题以及对应的解决方法.相信我们遇到的问题也有一定的普适性,能够作为其他问题的优化方案. Instruments ...

  6. URL编码原理解释

    当你在浏览器中输入一个URL时,浏览器会将你输入到地址栏的非数字字母转化为URI编码. 那么,它是按照什么样的规则来转换的呢 是这样的,URI编码就是一个字符的ASCII码,它的ACSII码的十六进制 ...

  7. android studio简易了解第二部分

    1.新建Moudle(eclispe的项目) 其余的和eclipse差不多,一般情况一直next就可以了! 如果选择New Project会重新打开一个AS.一个AS只会有一个Project(ecli ...

  8. Smack[3]用户列表,头像,组操作,用户操作

    用户列表 Smack主要使用Roster进行列表管理的 connection.getRoster(); /** * 返回所有组信息 <RosterGroup> * * @return Li ...

  9. JBoss7快速入门

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. 教你50招提升ASP.NET性能(六):为了生动的用户体验,总是在客户端验证

    (12)For a snappy user experience, always validate on the client 招数12: 为了生动的用户体验,总是在客户端验证 To avoid un ...