package org.fireflow.engine.invocation.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.fireflow.client.WorkflowSession; import org.fireflow.client.impl.WorkflowSessionLocalImpl; import org.fireflow.engine.context.RuntimeContext; import org.fireflow.engine.entity.config.ReassignConfig; import org.fireflow.engine.entity.runtime.ActivityInstance; import org.fireflow.engine.entity.runtime.ProcessInstance; import org.fireflow.engine.entity.runtime.WorkItem; import org.fireflow.engine.entity.runtime.WorkItemProperty; import org.fireflow.engine.entity.runtime.WorkItemState; import org.fireflow.engine.exception.EngineException; import org.fireflow.engine.invocation.AssignmentHandler; import org.fireflow.engine.modules.ousystem.OUSystemConnector; import org.fireflow.engine.modules.ousystem.User; import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem; import org.fireflow.engine.modules.persistence.PersistenceService; import org.fireflow.engine.modules.persistence.ReassignConfigPersister; import org.fireflow.engine.modules.workitem.WorkItemManager; import org.fireflow.model.binding.ResourceBinding; import org.fireflow.model.binding.ServiceBinding; import org.fireflow.model.resourcedef.WorkItemAssignmentStrategy; public abstract class AbsAssignmentHandler implements AssignmentHandler{ /** * */ private static final long serialVersionUID = 433878253467183907L; public abstract List<User> resolvePotentialOwners(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance); public abstract List<User> resolveReaders(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance); public abstract List<User> resolveAdministrators(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance); public abstract WorkItemAssignmentStrategy resolveAssignmentStrategy(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity); public abstract Map<WorkItemProperty,Object> resolveWorkItemPropertyValues(); public List<WorkItem> assign(WorkflowSession session, ActivityInstance activityInstance,WorkItemManager workItemManager,Object theActivity, ServiceBinding serviceBinding, ResourceBinding resourceBinding) throws EngineException { WorkflowSessionLocalImpl sessionLocal = (WorkflowSessionLocalImpl)session; RuntimeContext runtimeContext = sessionLocal.getRuntimeContext(); ProcessInstance processInstance = sessionLocal.getCurrentProcessInstance(); List<WorkItem> result = new ArrayList<WorkItem>(); Map<WorkItemProperty,Object> values = this.resolveWorkItemPropertyValues(); if(values==null){ values = new HashMap<WorkItemProperty,Object>(); } List<User> potentialOwners = this.resolvePotentialOwners(session,resourceBinding,theActivity,processInstance,activityInstance); if (potentialOwners==null || potentialOwners.size()==0){ //通知业务领导进行处理 List<User> administrators = this.resolveAdministrators(session,resourceBinding,theActivity,processInstance,activityInstance); if (administrators==null || administrators.size()==0){ //TODO 赋值给Fireflow内置用户,并记录警告信息 WorkItem wi = workItemManager.createWorkItem(session, processInstance, activityInstance, FireWorkflowSystem.getInstance(),theActivity, null); result.add(wi); }else{ //这种情况下,ASSIGNMENT_STRATEGY固定为WorkItem.ASSIGNMENT_ANY values.put(WorkItemProperty.ASSIGNMENT_STRATEGY, WorkItemAssignmentStrategy.ASSIGN_TO_ANY); for (User user : administrators) { WorkItem wi = workItemManager.createWorkItem(session, processInstance, activityInstance, user, theActivity,values); if (sessionLocal.getCurrentUser().getId().equals(user.getId())){ sessionLocal.getNewWorkItemsForCurrentUser().add(wi); } result.add(wi); List<User> agents = findReassignTo(runtimeContext, activityInstance .getProcessId(), activityInstance.getProcessType(), activityInstance.getNodeId(), user.getId()); if (agents != null && agents.size() != 0) { ReassignmentHandler dynamicAssignmentHandler = new ReassignmentHandler(); dynamicAssignmentHandler.setPotentialOwners(agents); dynamicAssignmentHandler.setReassignType(WorkItem.REASSIGN_AFTER_ME); dynamicAssignmentHandler.setParentWorkItemId(wi.getId()); StringBuffer sbuf= new StringBuffer("工作项被自动委派给:"); for (int i = 0;i<agents.size();i++){ User u = agents.get(i); sbuf.append(u.getName()); if (i<agents.size()-1)sbuf.append("、"); } wi.setNote(sbuf.toString()); List<WorkItem> agentWorkItems = workItemManager .reassignWorkItemTo(session, wi, dynamicAssignmentHandler, theActivity, serviceBinding, resourceBinding); result.addAll(agentWorkItems); } } } }else{ WorkItemAssignmentStrategy strategy = this.resolveAssignmentStrategy(session,resourceBinding,theActivity); if (strategy!=null){ values.put(WorkItemProperty.ASSIGNMENT_STRATEGY, strategy); }else{ values.put(WorkItemProperty.ASSIGNMENT_STRATEGY, WorkItemAssignmentStrategy.ASSIGN_TO_ANY); } for (User user : potentialOwners) { WorkItem wi = workItemManager.createWorkItem(session, processInstance, activityInstance, user,theActivity, values); if (sessionLocal.getCurrentUser().getId().equals(user.getId())){ sessionLocal.getNewWorkItemsForCurrentUser().add(wi); } result.add(wi); //设置note List<User> agents = findReassignTo(runtimeContext, activityInstance .getProcessId(), activityInstance.getProcessType(), activityInstance.getNodeId(), user.getId()); if (agents != null && agents.size() != 0) { ReassignmentHandler dynamicAssignmentHandler = new ReassignmentHandler(); dynamicAssignmentHandler.setPotentialOwners(agents); dynamicAssignmentHandler.setReassignType(WorkItem.REASSIGN_AFTER_ME); dynamicAssignmentHandler.setParentWorkItemId(wi.getId()); StringBuffer sbuf= new StringBuffer("工作项被自动委派给:"); for (int i = 0;i<agents.size();i++){ User u = agents.get(i); sbuf.append(u.getName()); if (i<agents.size()-1)sbuf.append("、"); } wi.setNote(sbuf.toString()); List<WorkItem> agentWorkItems = workItemManager .reassignWorkItemTo(session, wi, dynamicAssignmentHandler,theActivity, serviceBinding,resourceBinding); result.addAll(agentWorkItems); } } } List<User> readers = this.resolveReaders(session,resourceBinding,theActivity,processInstance,activityInstance); if (readers != null && readers.size() > 0) { values.put(WorkItemProperty.ASSIGNMENT_STRATEGY, WorkItemAssignmentStrategy.ASSIGN_TO_ANY); values.put(WorkItemProperty.STATE, WorkItemState.READONLY); for (User user : readers) { WorkItem wi = workItemManager.createWorkItem(session, processInstance, activityInstance, user,theActivity, values); result.add(wi); } } return result; } protected List<User> findReassignTo(RuntimeContext rtCtx,String processId,String processType,String activityId,String userId){ PersistenceService persistenceService = rtCtx.getEngineModule(PersistenceService.class, processType); ReassignConfigPersister persister = persistenceService.getReassignConfigPersister(); List<ReassignConfig> configs = persister.findReassignConfig(processId, processType, activityId,userId); if (configs==null || configs.size()==0) return null; List<User> agents = new ArrayList<User>(); OUSystemConnector ousystem = rtCtx.getEngineModule(OUSystemConnector.class, processType); for (ReassignConfig config : configs){ User u = ousystem.findUserById(config.getAgentId()); agents.add(u); } return agents; } }