startprocesscontrol.java

来自「公司自己开发的工作流引擎」· Java 代码 · 共 169 行

JAVA
169
字号
package cn.com.iaspec.workflow.engine.business;

import cn.com.iaspec.workflow.vo.workflow.StartedProcessInfo;
import cn.com.iaspec.workflow.vo.workflow.UserInfo;
import com.sunyard.sunflow.client.SunflowClient;
import cn.com.iaspec.workflow.vo.workflow.WorkflowSession;
import com.sunyard.sunflow.engine.context.WorkItemContextCollection;
import com.sunyard.sunflow.engine.context.ProcessDefinitionContext;
import com.sunyard.sunflow.engine.context.WorkItemContext;
import cn.com.iaspec.workflow.util.GetTableSequenceId;
import cn.com.iaspec.workflow.vo.db.WfPublicProjectInfo;
import cn.com.iaspec.workflow.engine.dao.WfPublicProjectInfoDAO;
import cn.com.iaspec.workflow.vo.workflow.ProcessRelevantVar;
import com.sunyard.sunflow.engine.dataclass.WMTAttribute;
import java.util.*;
import java.util.Iterator;

/**
 * 启动工作流
 * <p>Title: 启动工作流</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: IASPEC Technologies</p>
 * @author xiesonglin
 * @version 1.0
 */
public class StartProcessControl{
  public StartProcessControl(){
  }

  /**
   * 根据工作流流程定义id启动工作流
   * @param processDefineId long 流程定义id
   * @param businessName String 业务名称
   * @param businessType String 业务类型
   * @param userInfo UserInfo
   * @param ArrayList prcesseVars 需要修改的流程变量
   * @return StartedProcessInfo 工作流启动返回信息
   */
  public StartedProcessInfo createAndStartProcess(long processDefineId,
      String businessName,String businessType,UserInfo userInfo,ArrayList prcoesseVars)
      throws Exception{
    if(processDefineId==0){
      throw new Exception("工作流定义id为空。");
    }
    SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
    long procInstId=0;
    long workitemId=0;
    String workitemName="";
    String workitemURL="";
    StartedProcessInfo info=new StartedProcessInfo();
    try{
      ProcessDefinitionContext proCtx=sunflowClient.findProcessDefinition(
          processDefineId);
      //通过指定的流程定义ID来创建一个流程实例,返回一个流程实例ID
      procInstId=sunflowClient.createProcessInstance(processDefineId,
          proCtx.getDefinitionName(),"");

      //修改流程实例相关的流程变量
      WMTAttribute[] attrs=sunflowClient.getProcessRelevantData(procInstId,null);
      Iterator it=prcoesseVars.iterator();
      while(it.hasNext()){
        ProcessRelevantVar processVar=(ProcessRelevantVar)it.next();
        for(int i=0;i<attrs.length;i++){
          if(attrs[i].getAttributeName().equals(processVar.getVarName())){
            attrs[i].setStringValue(processVar.getVarValue());
            break;
          }
        }
      }
      sunflowClient.modifyProcessInstanceRelevantData(procInstId,attrs);

      //启动流程实例
      long activityInstanceId=0;
      sunflowClient.startProcess(procInstId);
      WorkItemContextCollection workItemCollection=sunflowClient.
          listWorkitemByProInstID(procInstId);
      //根据流程实例ID取得当前实例的所有工作项
      for(int i=0;i<workItemCollection.size();i++){
        WorkItemContext workItem=(WorkItemContext)workItemCollection.get(i);
        //取得状态为1的工作项ID
        if(workItem.getState()==1){
          workitemId=workItem.getWorkItemID();
          workitemName=workItem.getWorkItemName();
          workitemURL=workItem.getDescription();
          activityInstanceId=workItem.getActivityInstanceID();
          System.out.println("******** workitemId="+workitemId+"      workitemName="+workitemName+"    workitemURL="+workitemURL+"   activityInstanceId"+activityInstanceId);
          //只取得第一个工作项
          break;
        }
      }
      WfPublicProjectInfo prjInfo=new WfPublicProjectInfo();
      long projectId=Long.parseLong(GetTableSequenceId.getTableId(
          "wf_public_project_info"));
      System.out.println("********1111 workitemId="+workitemId+"      workitemName="+workitemName+"    workitemURL="+workitemURL+"   activityInstanceId"+activityInstanceId);
      prjInfo.setPrjBussName(businessName);
      prjInfo.setPrjBussType(businessType);

      prjInfo.setPrjCreateDate(new java.util.Date());
      prjInfo.setPrjCreateUserId(userInfo.getUserId());
      prjInfo.setPrjTitle("");
      prjInfo.setProjectId(projectId);
      //初始化状态
      prjInfo.setPrjState("init");
      //保存数据
      WfPublicProjectInfoDAO dao=new WfPublicProjectInfoDAO();
      dao.insert(prjInfo);
      System.out.println("********2222 workitemId="+workitemId+"      workitemName="+workitemName+"    workitemURL="+workitemURL+"   activityInstanceId"+activityInstanceId);
      TimeLimitControl timeControl=new TimeLimitControl();
      //保存流程办理时限信息
      timeControl.insertProcessTimeLimitInfo(procInstId);
      //保存活动办理时限信息
      timeControl.insertActivityInstanceTimeLimitInfo(activityInstanceId);
      System.out.println("********3333 workitemId="+workitemId+"      workitemName="+workitemName+"    workitemURL="+workitemURL+"   activityInstanceId"+activityInstanceId);
      //设置返回信息
      info.setBusinessName(businessName);
      info.setBusinessType(businessType);
      info.setProcessDefineId(processDefineId);
      info.setProcessInstanceId(procInstId);
      info.setProcessName(proCtx.getDefinitionName());
      info.setProjectId(projectId);
      info.setWorkitemId(workitemId);
      info.setWorkitemName(workitemName);
      info.setWorkitemURL(workitemURL);
      System.out.println("******** workitemId="+info.getWorkitemId()+"      workitemName="+info.getWorkitemName()+"    workitemURL="+info.getWorkitemURL()+"   activityInstanceId"+info.getProcessInstanceId());
      return info;
      //取得当前工作项信息
    }

    finally{
      WorkflowSession.deleteSunflowClient(userInfo);
    }

  }

  /**
   * 根据工作流流程定义名称启动工作流
   * @param processDefineName String 流程定义名称
   * @param businessName String 业务名称
   * @param businessType String 业务类型
   * @param userInfo UserInfo
   * @return StartedProcessInfo 工作流启动返回信息
   */
  public StartedProcessInfo createAndStartProcess(String processDefineName,
      String businessName,String businessType,UserInfo userInfo,ArrayList prcesseVars)
      throws Exception{
    SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
    try{
      long processDefineId=0;
      //取得工作流定义id
      ProcessDefinitionContext proCtx=sunflowClient.findProcessDefinitionByName(
          processDefineName);
      if(proCtx!=null){
        processDefineId=proCtx.getProDefinitionID();
      }
      else{
        throw new Exception("找不到流程名称为“"+processDefineName+"”的流程。");
      }
      //根据工作流流程定义id启动工作流
      return createAndStartProcess(processDefineId,businessName,businessType,
          userInfo,prcesseVars);
    }
    finally{
      WorkflowSession.deleteSunflowClient(userInfo);
    }
  }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?