- public class WorkflowManagerImpl extends HibernateDaoSupport implements
- WorkflowManager {
- private JbpmConfiguration jbpmConfiguration;
- public long addProcessInstance(String workflowName, int documentId) {
- JbpmContext context = getContext();
- //從JBPM中加載流程定義
- ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition(workflowName);
- ProcessInstance instance = new ProcessInstance(definition);
- //將公文標識綁定到流程實例
- instance.getContextInstance().createVariable("document", documentId);
- //存儲流程實例的信息
- context.save(instance);
- return instance.getId();
- }
- public void delProcessInstance(long processInstanceId) {
- JbpmContext context = getContext();
- //刪除流程實例
- context.getGraphSession().deleteProcessInstance(processInstanceId);
- }
- public void delWorkflow(int workflowId) {
- //在OA中刪除流程的定義
- Workflow workflow = (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
- getHibernateTemplate().delete(workflow);
- //在JBPM中刪除流程定義
- //JBPM對流程定義按版本進行管理,所以在同一個時刻,可能存在同一個流程定義的多個不同的版本
- //如果需要對其刪除,則應該刪除所有的版本
- //查找對應流程定義的所有版本
- List defs = getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());
- for (Iterator iter = defs.iterator(); iter.hasNext();) {
- ProcessDefinition def = (ProcessDefinition) iter.next();
- getContext().getGraphSession().deleteProcessDefinition(def);
- }
- }
- public void deployProcessDefinition(byte[] processDefinition,
- byte[] processImage) {
- //通過byte[]創建ProcessDefinition對象
- ProcessDefinition def =
- ProcessDefinition.parseXmlInputStream(
- new ByteArrayInputStream(processDefinition));
- //將流程定義文件部署到JBPM
- getContext().deployProcessDefinition(def);
- //首先查找一下Workflow對象是否已經存在
- Workflow workflow = (Workflow)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.setProcessDefinition(processDefinition);
- workflow.setProcessImage(processImage);
- getHibernateTemplate().save(workflow);
- return;
- }
- //如果流程已經存在,則更新
- workflow.setName(def.getName());
- workflow.setProcessDefinition(processDefinition);
- workflow.setProcessImage(processImage);
- getHibernateTemplate().update(workflow);
- }
- public Workflow findWorkflow(int workflowId) {
- return (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
- }
- public String flowToNextStep(String username, long processInstanceId,
- String transitionName) {
- JbpmContext context = getContext();
- String status = null;
- ProcessInstance instance = context.getProcessInstance(processInstanceId);
- //當前節點
- String currentNodeName = instance.getRootToken().getNode().getName();
- //起始節點
- String startNodeName = instance.getProcessDefinition().getStartState().getName();
- //如果是在起始節點,因爲起始節點不會跟任何人相關聯(即不會將任務分配給任何人)
- if(currentNodeName.equals(startNodeName)){
- //需要使用流程實例的signal()方法來觸發流程向下一步流動!
- instance.getRootToken().signal(transitionName);
- }else{
- //首先找出用戶的當前任務
- List tasks = context.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iter = tasks.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- if(taskInstance.getProcessInstance().getId() == processInstanceId){
- //這就是當前文檔對應的任務,需要結束這個任務,從而觸發流程向下一步驟移動!
- taskInstance.end(transitionName);
- break;
- }
- }
- }
- //將公文當前所處節點作爲狀態信息返回
- status = instance.getRootToken().getNode().getName();
- //判斷當前的狀態是否已經結束!
- if(instance.hasEnded()){
- status = Document.STATUS_END;
- }
- return status;
- }
- public List searchAllWorkflows() {
- return getHibernateTemplate().find("from Workflow");
- }
- public List searchApprovingDocuments(String username) {
- JbpmContext context = getContext();
- List docIds = new ArrayList();
- //首先獲得流轉到用戶的任務列表
- List tasks = context.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iter = tasks.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- //任務實例是否正在等待審批,如果不是,則忽略(即不應該被列到待審批列表中!)
- if(!taskInstance.isSignalling()){
- continue;
- }
- //根據其對應的流程實例,獲得公文標識
- Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- docIds.add(docId);
- }
- return docIds;
- }
- //下一步都有哪些流向?
- public List searchNextTransitions(String username,long processInstanceId) {
- JbpmContext context = getContext();
- List transitions = new ArrayList();
- //根據流程實例標識查找流程實例
- ProcessInstance instance = context.getProcessInstance(processInstanceId);
- // //根據流程實例,獲得當前的節點,從而得到在當前節點下有哪些流向
- // List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();
- //當前節點
- String currentNodeName = instance.getRootToken().getNode().getName();
- //起始節點
- String startNodeName = instance.getProcessDefinition().getStartState().getName();
- Collection nextSteps = null;
- //如果是在起始節點,因爲起始節點不會跟任何人相關聯(即不會將任務分配給任何人)
- if(currentNodeName.equals(startNodeName)){
- //需要使用流程實例的signal()方法來觸發流程向下一步流動!
- nextSteps = instance.getRootToken().getAvailableTransitions();
- }else{
- //首先找出用戶的當前任務
- List tasks = context.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iter = tasks.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- if(taskInstance.getProcessInstance().getId() == processInstanceId){
- nextSteps = taskInstance.getAvailableTransitions();
- break;
- }
- }
- }
- for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {
- Transition transition = (Transition) iter.next();
- transitions.add(transition.getName());
- }
- return transitions;
- }
- /**
- * 獲取JbpmContext對象,需要將JbpmContext的session設置爲當前的session對象
- * @return
- */
- private JbpmContext getContext(){
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- context.setSession(getSession());
- return context;
- }
- public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
- this.jbpmConfiguration = jbpmConfiguration;
- }
- }
jbpm工作流發佈封裝類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.