package org.fireflow.demo.workflow.ext;
import java.util.ArrayList;
import java.util.List;
import org.fireflow.client.WorkflowSession;
import org.fireflow.client.WorkflowStatement;
import org.fireflow.client.impl.WorkflowSessionLocalImpl;
import org.fireflow.demo.workflow.Constants;
import org.fireflow.engine.context.RuntimeContext;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.ProcessInstance;
import org.fireflow.engine.modules.ousystem.OUSystemConnector;
import org.fireflow.engine.modules.ousystem.User;
import org.fireflow.engine.resource.ResourceResolver;
import org.fireflow.model.resourcedef.ResourceDef;
/**
* 解析申请者所在的部门的部门经理。
* 很多情况下,流程申请者和录入者不是同一人;需要根据申请者的部门找到部门经理。
* 由于在流程引擎T_ff_rt_ProcessInstance表中仅存储了流程的创建者(录入人)信息,因此需要将申请设的departmentid保存到流程变量中
* @author apple
*
*/
public class ApplicantDeptMgrResolver extends ResourceResolver {
@Override
public List<User> resolve(WorkflowSession session, ProcessInstance procInst,
ActivityInstance actInst, ResourceDef resourceRef) {
//首先检查流程变量中有无APPLICANT_GROUP_CODE,如果没有就采用ProcessInstance.creatorDepartmentId
//作为当前部门
String groupCode = procInst.getCreatorDeptId();
WorkflowStatement statement = session.createWorkflowStatement();
Object obj = statement.getVariableValue(procInst, Constants.VAR_NAME_APPLICANT_GROUP_CODE);
if (obj!=null && obj instanceof String){
String tmp = (String)obj;
if (!tmp.trim().equals("")){
groupCode = tmp;//如果流程变量中存储有申请人的部门id,则优先使用
}
}
//资源代号存储在 resourceRef.value字段中
String roleCode = resourceRef.getValue();
//通过OUSystemConnector找出所有的候选用户
WorkflowSessionLocalImpl localSession = (WorkflowSessionLocalImpl)session;
RuntimeContext rtc = localSession.getRuntimeContext();
OUSystemConnector ouConnector = rtc.getEngineModule(OUSystemConnector.class, procInst.getProcessType());
List<User> candidatesList = ouConnector.findUsersInRole(roleCode);//
//根据groupCode筛选出符合条件的部门经理
List<User> result = new ArrayList<User>();
if (candidatesList!=null){
for (User u : candidatesList){
if (groupCode.equals(((WorkflowUser)u).getGroupCode())){
result.add(u);
}
}
}
return result;
}
}