WorkflowManagerImpl.java
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:7k
源码类别:

OA系统

开发平台:

Java

  1. package com.bjsxt.oa.managers.impl;
  2. import java.io.ByteArrayInputStream;
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import org.jbpm.JbpmConfiguration;
  8. import org.jbpm.JbpmContext;
  9. import org.jbpm.graph.def.ProcessDefinition;
  10. import org.jbpm.graph.def.Transition;
  11. import org.jbpm.graph.exe.ProcessInstance;
  12. import org.jbpm.taskmgmt.exe.TaskInstance;
  13. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  14. import com.bjsxt.oa.managers.WorkflowManager;
  15. import com.bjsxt.oa.model.Document;
  16. import com.bjsxt.oa.model.Workflow;
  17. public class WorkflowManagerImpl extends HibernateDaoSupport implements
  18. WorkflowManager {
  19. private JbpmConfiguration jbpmConfiguration;
  20. public long addProcessInstance(String workflowName, int documentId) {
  21.  
  22. JbpmContext context = getContext();
  23. //从JBPM中加载流程定义
  24. ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition(workflowName);
  25. ProcessInstance instance = new ProcessInstance(definition);
  26. //将公文标识绑定到流程实例
  27. instance.getContextInstance().createVariable("document", documentId);
  28. //存储流程实例的信息
  29. context.save(instance);
  30. return instance.getId();
  31. }
  32. public void delProcessInstance(long processInstanceId) {
  33. JbpmContext context = getContext();
  34. //删除流程实例
  35. context.getGraphSession().deleteProcessInstance(processInstanceId);
  36. }
  37. public void delWorkflow(int workflowId) {
  38. //在OA中删除流程的定义
  39. Workflow workflow = (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
  40. getHibernateTemplate().delete(workflow);
  41. //在JBPM中删除流程定义
  42. //JBPM对流程定义按版本进行管理,所以在同一个时刻,可能存在同一个流程定义的多个不同的版本
  43. //如果需要对其删除,则应该删除所有的版本
  44. //查找对应流程定义的所有版本
  45. List defs = getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());
  46. for (Iterator iter = defs.iterator(); iter.hasNext();) {
  47. ProcessDefinition def = (ProcessDefinition) iter.next();
  48. getContext().getGraphSession().deleteProcessDefinition(def);
  49. }
  50. }
  51. public void deployProcessDefinition(byte[] processDefinition,
  52. byte[] processImage) {
  53. //通过byte[]创建ProcessDefinition对象
  54. ProcessDefinition def = 
  55. ProcessDefinition.parseXmlInputStream(
  56. new ByteArrayInputStream(processDefinition)); 
  57. //将流程定义文件部署到JBPM
  58. getContext().deployProcessDefinition(def);
  59. //首先查找一下Workflow对象是否已经存在
  60. Workflow workflow = (Workflow)getSession()
  61. .createQuery("select w from Workflow w where w.name = ? ")
  62. .setParameter(0, def.getName())
  63. .uniqueResult();
  64. //如果流程尚未存在,则创建
  65. if(workflow == null){
  66. workflow = new Workflow();
  67. workflow.setName(def.getName());
  68. workflow.setProcessDefinition(processDefinition);
  69. workflow.setProcessImage(processImage);
  70. getHibernateTemplate().save(workflow);
  71. return;
  72. }
  73. //如果流程已经存在,则更新
  74. workflow.setName(def.getName());
  75. workflow.setProcessDefinition(processDefinition);
  76. workflow.setProcessImage(processImage);
  77. getHibernateTemplate().update(workflow);
  78. }
  79. public Workflow findWorkflow(int workflowId) {
  80. return (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
  81. }
  82. public String flowToNextStep(String username, long processInstanceId,
  83. String transitionName) {
  84. JbpmContext context = getContext();
  85. String status = null;
  86. ProcessInstance instance = context.getProcessInstance(processInstanceId);
  87. //当前节点
  88. String currentNodeName = instance.getRootToken().getNode().getName();
  89. //起始节点
  90. String startNodeName = instance.getProcessDefinition().getStartState().getName();
  91. //如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
  92. if(currentNodeName.equals(startNodeName)){
  93. //需要使用流程实例的signal()方法来触发流程向下一步流动!
  94. instance.getRootToken().signal(transitionName);
  95. }else{
  96. //首先找出用户的当前任务
  97. List tasks = context.getTaskMgmtSession().findTaskInstances(username);
  98. for (Iterator iter = tasks.iterator(); iter.hasNext();) {
  99. TaskInstance taskInstance = (TaskInstance) iter.next();
  100. if(taskInstance.getProcessInstance().getId() == processInstanceId){
  101. //这就是当前文档对应的任务,需要结束这个任务,从而触发流程向下一步骤移动!
  102. taskInstance.end(transitionName);
  103. break;
  104. }
  105. }
  106. }
  107. //将公文当前所处节点作为状态信息返回
  108. status = instance.getRootToken().getNode().getName();
  109. //判断当前的状态是否已经结束!
  110. if(instance.hasEnded()){
  111. status = Document.STATUS_END;
  112. }
  113. return status;
  114. }
  115. public List searchAllWorkflows() {
  116. return getHibernateTemplate().find("from Workflow");
  117. }
  118. public List searchApprovingDocuments(String username) {
  119. JbpmContext context = getContext();
  120. List docIds = new ArrayList();
  121. //首先获得流转到用户的任务列表
  122. List tasks = context.getTaskMgmtSession().findTaskInstances(username);
  123. for (Iterator iter = tasks.iterator(); iter.hasNext();) {
  124. TaskInstance taskInstance = (TaskInstance) iter.next();
  125. //任务实例是否正在等待审批,如果不是,则忽略(即不应该被列到待审批列表中!)
  126. if(!taskInstance.isSignalling()){
  127. continue;
  128. }
  129. //根据其对应的流程实例,获得公文标识
  130. Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
  131. docIds.add(docId);
  132. }
  133. return docIds;
  134. }
  135. //下一步都有哪些流向?
  136. public List searchNextTransitions(String username,long processInstanceId) {
  137. JbpmContext context = getContext();
  138. List transitions = new ArrayList();
  139. //根据流程实例标识查找流程实例
  140. ProcessInstance instance = context.getProcessInstance(processInstanceId);
  141. // //根据流程实例,获得当前的节点,从而得到在当前节点下有哪些流向
  142. // List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();
  143. //当前节点
  144. String currentNodeName = instance.getRootToken().getNode().getName();
  145. //起始节点
  146. String startNodeName = instance.getProcessDefinition().getStartState().getName();
  147. Collection nextSteps = null;
  148. //如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
  149. if(currentNodeName.equals(startNodeName)){
  150. //需要使用流程实例的signal()方法来触发流程向下一步流动!
  151. nextSteps = instance.getRootToken().getAvailableTransitions();
  152. }else{
  153. //首先找出用户的当前任务
  154. List tasks = context.getTaskMgmtSession().findTaskInstances(username);
  155. for (Iterator iter = tasks.iterator(); iter.hasNext();) {
  156. TaskInstance taskInstance = (TaskInstance) iter.next();
  157. if(taskInstance.getProcessInstance().getId() == processInstanceId){
  158. nextSteps = taskInstance.getAvailableTransitions();
  159. break;
  160. }
  161. }
  162. }
  163. for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {
  164. Transition transition = (Transition) iter.next();
  165. transitions.add(transition.getName());
  166. }
  167. return transitions;
  168. }
  169. /**
  170.  * 获取JbpmContext对象,需要将JbpmContext的session设置为当前的session对象
  171.  * @return
  172.  */
  173. private JbpmContext getContext(){
  174. JbpmContext context = jbpmConfiguration.createJbpmContext();
  175. context.setSession(getSession());
  176. return context;
  177. }
  178. public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  179. this.jbpmConfiguration = jbpmConfiguration;
  180. }
  181. }