几个工作流应用文件的例子

WorkflowManager.java

 

package com.bjsxt.oa.manager;

import java.util.List;

import com.bjsxt.oa.model.Workflow;

public interface WorkflowManager {
 /**
  * 部署流程定义
  * @param processDefinition
  * @param processImage
  */
 public void deployProcessDefinition(byte[] processDefinition,byte[]processImage);
 /**
  * 查找特定流程定义信息
  * @param workflowId 流程标识(ID)
  * @return
  */
 public Workflow findWorkflow(int workflowId);
 /**
  * 删除流程定义
  * @param workflowId 流程标识(ID)
  */
 public void delWorkflow(int workflowId);
 /**
  * 查询已有的所有流程定义信息
  * @return 列表的元素是: Workflow对象
  */
 public List searchAllWorkflows();
 /**
  * 添加流程实例
  * @param workflowName 流程名称
  * @param documentId 公文标识
  * @return 流程实例标识
  */
 public long addProcessInstance(String workflowName,int documentId);
 /**
  * 删除流程实例
  * @param processInstanceId 流程实例的标识
  */
 public void delProcessInstance(long processInstanceId);
 /**
  * 查找流转到某个用户那里的所有公文
  * @param username 用户帐号
  * @return 公文的标识列表,其元素是int类型
  */
 public List searchApprovingDocuments(String username);
 /**
  * 搜索下一步的流向,即下一步都可以走哪些路径
  * @param processInstanceId 流程实例标识
  * @return 流向的名称列表
  */
 public List searchNextTransitions(long processInstanceId);
 /**
  * 流向下一步
  * @param username 用户帐号
  * @param processInstanceId 流程实例标识
  * @param transitionName 流向名称
  * @return 返回状态信息,因为公文的流转将会触发公文状态的改变!
  */
 public String flowToNextStep(String username,long processInstanceId,String transitionName);
}

 

 

 

WorkflowManagerImpl.java:

 

 

package com.bjsxt.oa.manager.impl;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.oa.manager.WorkflowManager;
import com.bjsxt.oa.model.Document;
import com.bjsxt.oa.model.Workflow;

public class WorkflowManagerImpl extends HibernateDaoSupport implements WorkflowManager {
 private JbpmConfiguration jbpmConfiguration;
 /**
  *在添加实例的同时就添加公文
  */
 public long addProcessInstance(String workflowName, int documentId) {
  JbpmContext jbpmContext = getContext();
  //从JBPM中加载流程定义
  ProcessDefinition definition = jbpmContext.getGraphSession().findLatestProcessDefinition(workflowName);
  ProcessInstance instance = new ProcessInstance(definition);
  //将公文标识绑定到流程实例
  instance.getContextInstance().createVariable("document", documentId);
  //存储流程实例的信息
  jbpmContext.save(instance);
  
  return instance.getId();
 }

 public void delProcessInstance(long processInstanceId) {
  JbpmContext jbpmContext = getContext();
  //删除流程实例
  jbpmContext.getGraphSession().deleteProcessInstance(processInstanceId);
 }

 public void delWorkflow(int workflowId) {
  //1:在OA中删除流程的定义
  Workflow workflow = (Workflow)this.getHibernateTemplate().load(Workflow.class, workflowId);
  this.getHibernateTemplate().delete(workflow);
  //2:在JBPM中删除流程定义
  //JBPM对流程定义按版本进行管理,所以在同一个时刻,可能存在同一个流程定义的多个不同的版本
  //如果需要对其删除,则应该删除所有的版本
  //查找对应流程定义的所有版本
  List defs = this.getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());
  for(Iterator iter = defs.iterator();iter.hasNext();){
   ProcessDefinition definition = (ProcessDefinition)iter.next();
   this.getContext().getGraphSession().deleteProcessDefinition(definition);
  }
 }

 public void deployProcessDefinition(byte[] processDefinition,
   byte[] processImage) {
  //通过byte[]创建ProcessDefinition对象
  ProcessDefinition def = ProcessDefinition.parseXmlInputStream(new ByteArrayInputStream(processDefinition));
  System.err.println("-----------------deployProcessDefinition()--------------------"+def.getName());
  //将流程定义文件部署到JBPM
  this.getContext().deployProcessDefinition(def);
  //首先查找一下Workflow对象是否已经存在
  Workflow workflow = (Workflow)this.getSession()
       .createQuery("select w from Workflow w where w.name = ?")
       .setParameter(0, def.getName())
       .uniqueResult();
  if(workflow == null){
      workflow = new Workflow();
   workflow.setName(def.getName());
   workflow.setProcessDefinitiion(processDefinition);
   workflow.setProcessImage(processImage);
   this.getHibernateTemplate().save(workflow);
   return;
  }
  //如果流程已经存在,则更新
   workflow.setName(def.getName());
   workflow.setProcessDefinitiion(processDefinition);
   workflow.setProcessImage(processImage);
   this.getHibernateTemplate().update(workflow);    
 }

 public Workflow findWorkflow(int workflowId) {
  
  return (Workflow)this.getHibernateTemplate().load(Workflow.class, workflowId);
 }
 /**
  * transitionName 的作用是什么?
  *
  *
  *
  * 答:作用是在页面上显示“李四审批”,“李四审批”就是transitionName
  */
 public String flowToNextStep(String username, long processInstanceId,
   String transitionName) {
  JbpmContext jbpmContext = getContext();
  String status = null;
  ProcessInstance instance = jbpmContext.getProcessInstance(processInstanceId);
  //当前节点
  String currentNodeName = instance.getRootToken().getNode().getName();
  
  //起始节点
  String startNodeName = instance.getProcessDefinition().getStartState().getName();
  //如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
  if(currentNodeName.equals(startNodeName)){
   instance.getRootToken().signal();
//   System.out.println("=======================the param transitionName is:  ==========================================" + transitionName);
//   System.out.println("=======================before startNode ==========================================");
//   //需要使用流程实例的signal()方法来触发流程向下一步流动!
//   List trans = instance.getRootToken().getNode().getLeavingTransitions();
//   for (Iterator iter = trans.iterator(); iter.hasNext();) {
//    Transition transition = (Transition)iter.next();
//    System.out.println(transition.getName());
//   }
//   System.out.println("=======================end startNode ==========================================");
  }else{
   //首先找出用户的当前任务
   System.out.println("=========================workflowManager  flowToNextStep username is)================"+username);
   List taskes = jbpmContext.getTaskMgmtSession().findTaskInstances(username);
   for(Iterator iter = taskes.iterator();iter.hasNext();){
    TaskInstance taskInstance = (TaskInstance)iter.next();
    if(taskInstance.getProcessInstance().getId() == processInstanceId){
     //这就是当前文档对应的任务,需要结束这个任务,从而触发流程向下一步骤移动!
     System.out.println("=========================workflowManager  taskInstance  is)================"+taskInstance.getName());
     taskInstance.end();
     //taskInstance.end(transitionName);
     break;
    }
   }
   //将公文当前所处节点作为状态信息返回
   status = instance.getRootToken().getNode().getName();
   if(instance.hasEnded()){
    status = Document.STATUS_END;
   }
  }
  return status;
 }

 public List searchAllWorkflows() {
  
  return this.getHibernateTemplate().find("from Workflow");
 }

 public List searchApprovingDocuments(String username) {
  JbpmContext jbpmContext = getContext();
  List docIds = new ArrayList();
  //首先获得流转到用户的任务列表
  List taskes = jbpmContext.getTaskMgmtSession().findTaskInstances(username);
  for(Iterator iter = taskes.iterator();iter.hasNext();){
    TaskInstance taskInstance = (TaskInstance)iter.next();
    //根据其对应的流程实例,获得公文标识
    Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
    docIds.add(docId);
   }
  
  return docIds;
 }

 public List searchNextTransitions(long processInstanceId) {
  JbpmContext jbpmContext = getContext();
  List transitions = new ArrayList();
  ProcessInstance instance = jbpmContext.getProcessInstance(processInstanceId);
  //根据流程实例,获得当前的节点,从而得到在当前节点下有哪些流向
  List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();
  for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {
   Transition transition = (Transition)iter.next();
   transitions.add(transition);
  }
  return transitions;
 }

 public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
 }
 
 public JbpmContext getContext(){
  JbpmContext context = jbpmConfiguration.createJbpmContext();
  context.setSession(this.getSession());
  return context;
 }

}


WorkflowAction.java:

 

 

package com.bjsxt.oa.web.actions;

import java.io.ByteArrayInputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.dom4j.io.SAXReader;

import com.bjsxt.oa.manager.WorkflowManager;
import com.bjsxt.oa.model.Workflow;
import com.bjsxt.oa.web.forms.WorkflowActionForm;

public class WorkflowAction extends BaseAction {
 /**
  * 打开流程管理主界面,列出当前所有的流程
  */
 private WorkflowManager workflowManager;
 protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  request.setAttribute("workflows",workflowManager.searchAllWorkflows());
  return mapping.findForward("index");
 }
 
 public  ActionForward add(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  //TODO 做一些判断,判断上传的文件是否为空,决定是否抛出异常,等等!!
  
  //部署流程
  WorkflowActionForm waf = (WorkflowActionForm)form;
  System.err.println("-----------------waf.getProcessDefinitiion()--------------------"+waf.getProcessDefinition());
  System.err.println("-----------------waf.getProcessImage()--------------------"+waf.getProcessImage());
  workflowManager.deployProcessDefinition(waf.getProcessDefinition().getFileData(), waf.getProcessImage().getFileData());
  return mapping.findForward("add_success");
  
 }
 //删除流程定义
 public  ActionForward del(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  WorkflowActionForm waf = (WorkflowActionForm)form;
  
  workflowManager.delWorkflow(waf.getId());
  return mapping.findForward("pub_del_success");
  
 }
 
 //打开查看流程图片的界面
 public  ActionForward openViewImage(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  return mapping.findForward("flow_image");
  
 }
 //查看图片(此请求由flow_image.jsp中的<img src="workflow.do?method=viewImage">发起的请求)
 public  ActionForward viewImage(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  WorkflowActionForm waf = (WorkflowActionForm)form;
  Workflow wf = workflowManager.findWorkflow(waf.getId());
  response.setContentType("image/jpeg");
  response.getOutputStream().write(wf.getProcessImage());
  return null;
  
 }
 //查看流程定义文件的内容
 public  ActionForward viewFlowDef(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  WorkflowActionForm waf = (WorkflowActionForm)form;
  Workflow wf = workflowManager.findWorkflow(waf.getId());
  byte[] defs = wf.getProcessDefinitiion();
  //将byte[]转换为字符串
  //将byte[]转换为字符串
  //String defString = new String(defs,"UTF-8");
  
  //为了避免硬编码encoding,可以利用dom4j工具来帮助我们转换xml文件
  String defString = new SAXReader().read(new ByteArrayInputStream(defs)).asXML();
  request.setAttribute("def", defString);
  return mapping.findForward("flow_def");
 }

 public void setWorkflowManager(WorkflowManager workflowManager) {
  this.workflowManager = workflowManager;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值