package com.norteksoft.wf.engine.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.User; import com.norteksoft.product.api.utils.BeanUtil; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.task.dao.HistoryWorkflowTaskDao; import com.norteksoft.task.dao.WorkflowTaskDao; import com.norteksoft.task.entity.HistoryWorkflowTask; import com.norteksoft.task.entity.WorkflowTask; import com.norteksoft.wf.base.enumeration.ProcessState; import com.norteksoft.wf.engine.dao.HistoryInstanceHistoryDao; import com.norteksoft.wf.engine.dao.HistoryOpinionDao; import com.norteksoft.wf.engine.dao.HistoryWorkflowInstanceDao; import com.norteksoft.wf.engine.dao.InstanceHistoryDao; import com.norteksoft.wf.engine.dao.OpinionDao; import com.norteksoft.wf.engine.dao.WorkflowInstanceDao; import com.norteksoft.wf.engine.entity.HistoryInstanceHistory; import com.norteksoft.wf.engine.entity.HistoryOpinion; import com.norteksoft.wf.engine.entity.HistoryWorkflowInstance; import com.norteksoft.wf.engine.entity.InstanceHistory; import com.norteksoft.wf.engine.entity.Opinion; import com.norteksoft.wf.engine.entity.WorkflowInstance; @Service @Transactional public class WorkflowFinishManager { @Autowired private WorkflowInstanceDao workflowInstanceDao; @Autowired private WorkflowTaskDao workflowTaskDao; @Autowired private OpinionDao opinionDao; @Autowired private InstanceHistoryDao instanceHistoryDao; @Autowired private HistoryWorkflowTaskDao historyWorkflowTaskDao; @Autowired private HistoryOpinionDao historyOpinionDao; @Autowired private HistoryInstanceHistoryDao historyInstanceHistoryDao; @Autowired private HistoryWorkflowInstanceDao historyWorkflowInstanceDao; //迁移实例、任务等时,每1万条迁一次 public void execute(){ try { List<WorkflowInstance> workflowInstances = workflowInstanceDao.getEndAndCancelProcess(); for (int i=0 ; i<workflowInstances.size();i++) { System.out.println("实例id"+i+":"+workflowInstances.get(i).getProcessInstanceId()); if(i>=10000) break; if(i<10000){ WorkflowInstance instance = workflowInstances.get(i); String instanceId = instance.getProcessInstanceId(); if(instance.getParentProcessId()!=null){//表示有父流程 //取最外层的主流程 WorkflowInstance parentInstance= parentIntanceEnded(instance.getParentProcessId()); //当父流程未结束或未取消时,不迁移数据 if(parentInstance!=null&&parentInstance.getProcessState()!=ProcessState.END && parentInstance.getProcessState()!=ProcessState.MANUAL_END ) continue; } //获取此流程实例的所有任务,迁移任务 List<WorkflowTask> tasks = workflowTaskDao.getTasksByInstanceId(instanceId); for (WorkflowTask task : tasks) { HistoryWorkflowTask historyTask = new HistoryWorkflowTask(); BeanUtil.copy(historyTask,task); historyTask.setId(null); historyTask.setSourceTaskId(task.getId()); historyWorkflowTaskDao.save(historyTask); // historyTask.setCreatedTime(task.getCreatedTime()); workflowTaskDao.delete(task.getId()); } //获取此流程实例的所有意见,迁移意见 List<Opinion> opinions = opinionDao.getOpinionsByInstanceId(instanceId, ContextUtils.getCompanyId()); for (Opinion opinion : opinions) { HistoryOpinion historyOpinion = new HistoryOpinion(); BeanUtil.copy(historyOpinion,opinion); historyOpinion.setId(null); historyOpinionDao.save(historyOpinion); // historyOpinion.setCreatedTime(opinion.getCreatedTime()); } opinionDao.deleteAllOpinionsByWorkflowInstanceId(instanceId, ContextUtils.getCompanyId()); //获取此流程实例的所有流转历史,迁移流转历史 List<InstanceHistory> instanceHistorys = instanceHistoryDao.getInstanceHistoryByProcessId(instanceId); for (InstanceHistory instanceHistory : instanceHistorys) { HistoryInstanceHistory his = new HistoryInstanceHistory(); BeanUtil.copy(his,instanceHistory); his.setId(null); historyInstanceHistoryDao.save(his); } instanceHistoryDao.deleteHistoryByworkflowId(instanceId, ContextUtils.getCompanyId()); //迁移流程实例数据 HistoryWorkflowInstance historyInstance = new HistoryWorkflowInstance(); BeanUtil.copy(historyInstance,instance); if(instance.getCreatorId()==null){ User u = ApiFactory.getAcsService().getUserByLoginName(instance.getCreator()); if(u!=null)historyInstance.setCreatorId(u.getId()); } historyInstance.setId(null); historyWorkflowInstanceDao.save(historyInstance); workflowInstanceDao.delete(instance.getId()); //已结束或已取消的流程实例(包括子流程) } } } catch (Exception e) { e.printStackTrace(); } } //如果有子流程,获取最外层的流程 private WorkflowInstance parentIntanceEnded(String parentProcessId) { WorkflowInstance parentInstance = workflowInstanceDao.getInstanceByJbpmInstanceId(parentProcessId,ContextUtils.getCompanyId()); if(parentInstance!=null&&parentInstance.getParentProcessId()!=null){ parentProcessId = parentInstance.getParentProcessId(); parentIntanceEnded(parentProcessId); } return parentInstance; } }