package com.norteksoft.wf.engine.core;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.model.OpenExecution;
import com.norteksoft.acs.api.AcsApi;
import com.norteksoft.mms.form.entity.FormView;
import com.norteksoft.mms.form.service.FormViewManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.wf.base.enumeration.CommonStrings;
import com.norteksoft.wf.base.enumeration.TaskTransactorCondition;
import com.norteksoft.wf.base.exception.WorkflowException;
import com.norteksoft.wf.engine.client.SingleTransactorSelector;
import com.norteksoft.wf.engine.core.impl.UserParseCalculator;
import com.norteksoft.wf.engine.entity.WorkflowInstance;
import com.norteksoft.wf.engine.service.WorkflowInstanceManager;
public class TransactorConditionHandler {
public static final String DOCUMENT_CREATOR = "documentCreator";//文档创建人
public static final String CURRENT_TRANSACTOR = "currentTransactor";//当前办理人
public static final String PREVIOUS_TRANSACTOR = "previousTransactor";//上一环节办理人
public static final String PROCESS_ADMIN = "processAdmin";//流程管理员
public static final String PROCESS_INSTANCEID = "processInstanceId";//流程管理员
/*
* 根据条件选定办理人
* @param conditions
* @param creator
* @param _wf_transactor
* @return
*/
public static Set<String> processCondition(Map<TaskTransactorCondition, String> conditions, OpenExecution execution,Map<String,String> param){
Long companyId=ContextUtils.getCompanyId();
if(companyId==null){
Object compIdStr=execution.getVariable(CommonStrings.COMPANY_ID);
if(compIdStr!=null){
companyId=Long.parseLong(compIdStr.toString());
}
}
String userCondition = conditions.get(TaskTransactorCondition.USER_CONDITION);
if(userCondition==null){throw new RuntimeException("办理人设置中,解析条件时,设置的条件不能为null");}
//根据条件获取办理人
Set<String> candidates = new HashSet<String>();
if("${documentCreator}".equals(userCondition)){
//文档创建人
candidates.add(param.get(DOCUMENT_CREATOR));
}else if("${previousTransactorAssignment}".equals(userCondition)){
//上一环节办理人指定
candidates.add(CommonStrings.TRANSACTOR_ASSIGNMENT);
}else if(userCondition.startsWith("${field[")){
//文档字段中指定//${field[name_zn[name_en]]}
int start = userCondition.lastIndexOf("[");
int end = userCondition.indexOf("]");
String fieldName = userCondition.substring(start + 1, end);
//根据流程实例ID获取流程表单中指定字段的值
WorkflowInstanceManager manager = (WorkflowInstanceManager) ContextUtils.getBean("workflowInstanceManager");
String fieldValues = manager.getFieldValueInForm(param.get(PROCESS_INSTANCEID), fieldName);
if(fieldValues==null){throw new RuntimeException("办理人设置中,文档字段中指定时,该字段的值不能为null");}
for(String fieldValue:fieldValues.split(",")){
fieldValue = fieldValue.trim();
if(StringUtils.isNotEmpty(fieldValue)){
if("ALLCOMPANYID".equals(fieldValue)){//所有人员(不包含无部门人员)
List<String> loginNames = ApiFactory.getAcsService().getLoginNamesByCompany(companyId);
candidates.addAll(loginNames);
}else if("ALLWORKGROUP".equals(fieldValue)){//所有工作组中的人员
List<String> loginNames = ApiFactory.getAcsService().getLoginNamesByWorkgroup(companyId);
candidates.addAll(loginNames);
}else{
candidates.add(fieldValue);
}
}
}
}else{
if(execution==null){throw new RuntimeException("办理人设置中,解析条件时,execution不能为null");}
FormViewManager formManager = (FormViewManager)ContextUtils.getBean("formViewManager");
WorkflowInstanceManager workflowInstanceManager = (WorkflowInstanceManager)ContextUtils.getBean("workflowInstanceManager");
WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(param.get(PROCESS_INSTANCEID),companyId);
if(wi==null){throw new RuntimeException("办理人设置中,解析条件时,流程实例不能为null");}
FormView form = formManager.getFormView(wi.getFormId());
UserParseCalculator upc = new UserParseCalculator();
upc.setDataId(wi.getDataId());
upc.setFormView(form);
upc.setDocumentCreator(param.get(DOCUMENT_CREATOR));
upc.setPreviousTransactor(param.get(PREVIOUS_TRANSACTOR));
upc.setCurrentTransactor(param.get(CURRENT_TRANSACTOR));
upc.setProcessAdmin(param.get(PROCESS_ADMIN));
candidates.addAll(processAdditionalCondition(conditions,upc.getUsers(userCondition,wi.getSystemId(),wi.getCompanyId()), param.get(DOCUMENT_CREATOR), execution));
}
return candidates;
}
/*
* 根据附加条件过滤办理人
* @param conditions
* @param candidates
* @param creator
* @param _wf_transactor
* @return
*/
private static Set<String> processAdditionalCondition(
Map<TaskTransactorCondition, String> conditions, Set<String> candidates,
String creator, OpenExecution execution){
Set<String> results = new HashSet<String>();
String selectOne = conditions.get(TaskTransactorCondition.SELECT_ONE_FROM_MULTIPLE);
String onlyInCreatorDept = conditions.get(TaskTransactorCondition.ONLY_IN_CREATOR_DEPARTMENT);
String withCreatorDept = conditions.get(TaskTransactorCondition.WITH_CREATOR_DEPARTMENT);
if("true".equals(onlyInCreatorDept) || "true".equals(withCreatorDept)){
List<String[]> usersInSameDept = AcsApi.getUsersInSameDept(ContextUtils.getCompanyId(), creator);
//只能为创建人部门(交集)
if("true".equals(onlyInCreatorDept)){
for(String[] user1 : usersInSameDept){
if(candidates.contains(user1[1])){
results.add(user1[1]);
}
}
}else{
results.addAll(candidates);
}
//创建人部门参与(并集)
if("true".equals(withCreatorDept)){
for(String[] user1 : usersInSameDept){
results.add(user1[1]);
}
}
}else{
results.addAll(candidates);
}
Set<String> latest = new HashSet<String>();
//需要唯一指定办理人
if("true".equals(selectOne)){
// <select-type>autoType</select-type>
// <select-bean>workflowInstanceManager</select-bean>
//只有一个候选人
if(conditions.get(TaskTransactorCondition.SELECT_TYPE).equals(TaskTransactorCondition.SELECT_TYPE_CUSTOM)){
// if(results.size() == 1){
// latest.add(results.iterator().next());
// }else if(results.size() > 1){
latest.add(CommonStrings.TRANSACTOR_SINGLE);
//将候选人加入到execution变量中
execution.createVariable(CommonStrings.TRANSACTOR_SINGLE_CANDIDATES , results);
// }
}else{
WorkflowInstanceManager workflowInstanceManager = (WorkflowInstanceManager)ContextUtils.getBean("workflowInstanceManager");
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(execution.getProcessInstance().getProcessInstance().getId());
if(instance==null){throw new RuntimeException("办理人设置中,解析附加条件时,流程实例不能为null");}
String selectorBeanName = conditions.get(TaskTransactorCondition.SELECT_BEAN);
ActivityExecution activityExecution = (ActivityExecution)execution;
String activityName = activityExecution.getActivityName();
if(StringUtils.isEmpty(selectorBeanName))throw new WorkflowException("环节:"+activityName+"没有指定自动选择办理人的bean名");
SingleTransactorSelector selector = (SingleTransactorSelector)ContextUtils.getBean(selectorBeanName) ;
boolean moreTransactor = DefinitionXmlParse.hasMoreTransactor(
instance.getProcessDefinitionId(), activityName);
Set<String> result=selector.filter(instance.getDataId(), results,moreTransactor);
Iterator<String> it=result.iterator();
while(it.hasNext()){
latest.add(it.next());
}
}
}else{
for(String user : results){
latest.add(user);
}
}
return latest;
}
}