/** * Copyright 1996-2013 Founder International Co.,Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @author kenshin */ package org.foxbpm.engine.impl.cmd; import java.io.Serializable; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.foxbpm.engine.exception.FoxBPMException; import org.foxbpm.engine.impl.Context; import org.foxbpm.engine.impl.entity.ProcessDefinitionEntity; import org.foxbpm.engine.impl.entity.ProcessInstanceEntity; import org.foxbpm.engine.impl.identity.Authentication; import org.foxbpm.engine.impl.interceptor.Command; import org.foxbpm.engine.impl.interceptor.CommandContext; import org.foxbpm.engine.impl.persistence.deploy.DeploymentManager; import org.foxbpm.engine.runtime.ProcessInstance; import org.foxbpm.kernel.process.impl.KernelFlowNodeImpl; public class TimeStartProcessInstanceCmd<T> implements Command<ProcessInstance>, Serializable { private static final long serialVersionUID = -4054848927162120048L; /** * 流程定义id,唯一编号,不能为空。(数据库中的 id) */ protected String processDefinitionId; /** * 流程定义key(xml定义里的 process id,数据库中的 key) */ protected String processDefinitionKey; /** * 业务关联键 */ protected String businessKey; /** * 启动 */ protected String startAuthor; /** * 瞬态流程实例变量Map */ protected Map<String, Object> transientVariables = null; /** * 持久化流程实例变量Map */ protected Map<String, Object> variables = null; /** * 定时启动的节点 */ protected String nodeId; /** * 流程实例启动操作 * * @param processDefinitionKey * @param processDefinitionId * @param businessKey * @param startAuthor * @param transientVariables * @param variables */ public TimeStartProcessInstanceCmd() { } public ProcessInstance execute(CommandContext commandContext) { DeploymentManager deploymentCache = Context.getProcessEngineConfiguration().getDeploymentManager(); ProcessDefinitionEntity processDefinition = null; if (StringUtils.isNotBlank(processDefinitionId)) { processDefinition = deploymentCache.findDeployedProcessDefinitionById(processDefinitionId); if (processDefinition == null) { throw new FoxBPMException("通过 processDefinitionId 没有找到指定流程 = '" + processDefinitionId + "'"); } } else if (StringUtils.isNotBlank(processDefinitionKey)) { processDefinition = deploymentCache.findDeployedLatestProcessDefinitionByKey(processDefinitionKey); if (processDefinition == null) { throw new FoxBPMException("通过 processDefinitionKey 没有找到指定流程 '" + processDefinitionKey + "'"); } } else { throw new FoxBPMException("processDefinitionKey 和 processDefinitionId 不能都为空"); } // 如果流程定义是暂停状态则不允许启动流程实例 if (processDefinition.isSuspended()) { throw new FoxBPMException("启动失败:流程定义 " + processDefinition.getName() + " (id = " + processDefinition.getId() + ") 为暂停状态"); } // 根据开始节点 启动流程实例,因为自动启动的开始节点可以有多个 ProcessInstanceEntity processInstance = processDefinition.createProcessInstance(this.businessKey, this.getStartFlowNode(processDefinition)); if (transientVariables != null) { processInstance.setVariables(transientVariables); } processInstance.setStartAuthor(Authentication.getSystemId()); processInstance.start(); return processInstance; } private KernelFlowNodeImpl getStartFlowNode(ProcessDefinitionEntity processDefinition) { List<KernelFlowNodeImpl> flowNodes = processDefinition.getFlowNodes(); Iterator<KernelFlowNodeImpl> iterator = flowNodes.iterator(); while (iterator.hasNext()) { KernelFlowNodeImpl next = iterator.next(); if (StringUtils.equalsIgnoreCase(next.getId(), this.getNodeId())) { return next; } } return null; } public String getProcessDefinitionId() { return processDefinitionId; } public void setProcessDefinitionId(String processDefinitionId) { this.processDefinitionId = processDefinitionId; } public String getProcessDefinitionKey() { return processDefinitionKey; } public void setProcessDefinitionKey(String processDefinitionKey) { this.processDefinitionKey = processDefinitionKey; } public String getBusinessKey() { return businessKey; } public void setBusinessKey(String businessKey) { this.businessKey = businessKey; } public String getStartAuthor() { return startAuthor; } public void setStartAuthor(String startAuthor) { this.startAuthor = startAuthor; } public Map<String, Object> getTransientVariables() { return transientVariables; } public void setTransientVariables(Map<String, Object> transientVariables) { this.transientVariables = transientVariables; } public Map<String, Object> getVariables() { return variables; } public void setVariables(Map<String, Object> variables) { this.variables = variables; } public String getNodeId() { return nodeId; } public void setNodeId(String nodeId) { this.nodeId = nodeId; } }