Activiti从当前任务任意回退至已审批任务
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(); } }
+++++++++++++++++++++++++++++++++++++++++++
如本文存在任何侵权部分,请及时告知,我会第一时间删除!
转载本博客原创文章,请附上原文@cnblogs的网址!
QQ: 5854165 我的开源项目 欢迎大家一起交流编程架构技术&大数据技术! +++++++++++++++++++++++++++++++++++++++++++
如本文存在任何侵权部分,请及时告知,我会第一时间删除!
转载本博客原创文章,请附上原文@cnblogs的网址!
QQ: 5854165 我的开源项目 欢迎大家一起交流编程架构技术&大数据技术! +++++++++++++++++++++++++++++++++++++++++++