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;
}
}