/** * Copyright 2007-2010 非也 * All rights reserved. * * This library is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License v3 as published by the Free Software * Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this library; if not, see http://www.gnu.org/licenses/lgpl.html. * */ package org.fireflow.demo.workflow; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.shiro.SecurityUtils; import org.fireflow.client.WorkflowSession; import org.fireflow.client.WorkflowStatement; import org.fireflow.demo.hr.bean.Organization; import org.fireflow.demo.misc.BeanUtilEx; import org.fireflow.demo.workflow.ext.ProcessInstanceEx; import org.fireflow.demo.workflow.ext.WorkItemExt; import org.fireflow.demo.workflow.ext.WorkflowUser; import org.fireflow.engine.entity.repository.ProcessKey; import org.fireflow.engine.entity.runtime.LocalWorkItem; import org.fireflow.engine.entity.runtime.ProcessInstance; import org.fireflow.engine.entity.runtime.WorkItem; import org.fireflow.engine.modules.ousystem.Department; import org.fireflow.engine.modules.ousystem.Group; import org.fireflow.engine.modules.ousystem.Role; import org.fireflow.engine.modules.ousystem.User; import org.fireflow.engine.modules.ousystem.impl.DepartmentImpl; import org.fireflow.engine.modules.ousystem.impl.GroupImpl; import org.fireflow.engine.modules.ousystem.impl.RoleImpl; import org.fireflow.model.InvalidModelException; import org.fireflow.pdl.fpdl.process.Activity; import org.fireflow.pdl.fpdl.process.WorkflowProcess; /** * * @author 非也 nychen2000@163.com Fire Workflow 官方网站:www.firesoa.com 或者 * www.fireflow.org * */ public class WorkflowUtil { private static Map<String,String> WORKITEM_STATE_DISPLAY_NAME = new HashMap<String,String>(); static{ WORKITEM_STATE_DISPLAY_NAME.put("INITIALIZED", "待签收"); WORKITEM_STATE_DISPLAY_NAME.put("RUNNING", "待处理"); WORKITEM_STATE_DISPLAY_NAME.put("FAULTING", "异常"); WORKITEM_STATE_DISPLAY_NAME.put("FAULTED", "异常结束"); WORKITEM_STATE_DISPLAY_NAME.put("ABORTING", "中止"); WORKITEM_STATE_DISPLAY_NAME.put("ABORTED", "已中止"); WORKITEM_STATE_DISPLAY_NAME.put("COMPLETED", "已处理"); WORKITEM_STATE_DISPLAY_NAME.put("DISCLAIMED", "已退签收"); WORKITEM_STATE_DISPLAY_NAME.put("REJECTED", "已退回"); WORKITEM_STATE_DISPLAY_NAME.put("REASSIGNED", "已转交他人"); WORKITEM_STATE_DISPLAY_NAME.put("CANCELLED", "已撤销"); WORKITEM_STATE_DISPLAY_NAME.put("READONLY", "抄阅项"); } private static Map<String,String> PROCESSINSTANCE_STATE_DISPLAY_NAME = new HashMap<String,String>(); static{ PROCESSINSTANCE_STATE_DISPLAY_NAME.put("INITIALIZED", "已就绪"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("RUNNING", "运行中"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("FAULTING", "异常"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("FAULTED", "异常结束"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("ABORTING", "中止"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("ABORTED", "已中止"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("COMPLETED", "已处理"); PROCESSINSTANCE_STATE_DISPLAY_NAME.put("CANCELLED", "已撤销"); } /** * 从业务系统当前用户转换为工作流用户。<br/> * 有两种方案可以实现该需求:1、业务系统中的用户对象(如DemoUser)实现org.fireflow.engine.modules. * ousystem.User<br/> * 2、将业务系统中的用户对象组装成org.fireflow.engine.modules.ousystem.impl.UserImpl返回,如本函数 * 。 * * @param session * @return */ public static User getCurrentWorkflowUser() { // 从Session中获得当前用户 org.fireflow.demo.security.bean.User demoUser = (org.fireflow.demo.security.bean.User) SecurityUtils .getSubject().getPrincipal(); User fireUser = convertAppUser2FireflowUser(demoUser); // userImpl.setProperties(properties);//可以设置更多属性 return fireUser; } public static User convertAppUser2FireflowUser( org.fireflow.demo.security.bean.User demoUser) { if (demoUser == null) return null; WorkflowUser fireUser = new WorkflowUser(); fireUser.setId(demoUser.getLoginName()); fireUser.setName(demoUser.getName()); fireUser.setDeptId(demoUser.getGroupCode());//groupCode 等价与流程系统中的departmentId fireUser.setDeptName(demoUser.getGroupName()); fireUser.setGroupCode(demoUser.getGroupCode()); fireUser.setGroupName(demoUser.getGroupName()); return fireUser; } public static Department convertAppDept2FireflowDept(Organization demoDept) { if (demoDept == null) return null; DepartmentImpl dept = new DepartmentImpl(); dept.setId(demoDept.getCode()); dept.setName(demoDept.getName()); return dept; } public static Group convertAppGroup2FireflowGroup(org.fireflow.demo.security.bean.Group appGroup){ GroupImpl group = new GroupImpl(); group.setId(appGroup.getCode()); group.setName(appGroup.getName()); group.setDeptId(appGroup.getOrgCode()); group.setDeptName(appGroup.getOrgName()); return group; } public static Role convertAppRole2FireflowRole(org.fireflow.demo.security.bean.Role appRole){ RoleImpl group = new RoleImpl(); group.setId(appRole.getCode()); group.setName(appRole.getName()); return group; } public static Activity getThisActivity(WorkflowSession session, LocalWorkItem currentWorkItem) throws InvalidModelException { WorkflowStatement stmt = session.createWorkflowStatement(); ProcessKey pk = new ProcessKey(currentWorkItem.getProcessId(), currentWorkItem.getVersion(), currentWorkItem.getProcessType()); WorkflowProcess process = null; process = (WorkflowProcess) stmt.getWorkflowProcess(pk); Activity activity = (Activity)process.findWorkflowElementById(currentWorkItem.getActivityId()); return activity; } public static List<Activity> getNextActivities(WorkflowSession session, LocalWorkItem currentWorkItem) throws InvalidModelException { WorkflowStatement stmt = session.createWorkflowStatement(); ProcessKey pk = new ProcessKey(currentWorkItem.getProcessId(), currentWorkItem.getVersion(), currentWorkItem.getProcessType()); WorkflowProcess process = null; process = (WorkflowProcess) stmt.getWorkflowProcess(pk); List<Activity> result = process.findNextActivities(currentWorkItem .getActivityId()); return result; } public static List<WorkItemExt> workItemListToWorkItemExtList(List<WorkItem> list){ List<WorkItemExt> list2 = new ArrayList<WorkItemExt>(); if (list!=null){ for (WorkItem wi :list){ list2.add(workItemToWorkItemExt(wi)); } } return list2; } public static WorkItemExt workItemToWorkItemExt(WorkItem wi){ WorkItemExt ext = new WorkItemExt(); try { BeanUtilEx.copyProperties(ext, wi); ext.setStateValue(wi.getState().getValue()); ext.setStateDisplayName(WORKITEM_STATE_DISPLAY_NAME.get(wi.getState().name())); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ext; } public static List<ProcessInstanceEx> processInstanceListToProcessInstanceExtList(List<ProcessInstance> list,Map<String,String> actInstInfo){ List<ProcessInstanceEx> list2 = new ArrayList<ProcessInstanceEx>(); if (list!=null){ for (ProcessInstance wi :list){ list2.add(processInstanceToProcessInstanceEx(wi,actInstInfo)); } } return list2; } public static ProcessInstanceEx processInstanceToProcessInstanceEx(ProcessInstance procInst,Map<String,String> actInstInfo){ ProcessInstanceEx procInstEx = new ProcessInstanceEx(); try { BeanUtilEx.copyProperties(procInstEx, procInst); procInstEx.setStateValue(procInst.getState().getValue()); procInstEx.setStateDisplayName(PROCESSINSTANCE_STATE_DISPLAY_NAME.get(procInst.getState().name())); procInstEx.setCurrentActivityInstances(actInstInfo.get(procInst.getId())); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return procInstEx; } }