package com.norteksoft.wf.engine.core;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.internal.log.Log;
import com.norteksoft.mms.form.dao.GeneralDao;
import com.norteksoft.mms.form.entity.FormView;
import com.norteksoft.mms.form.service.FormViewManager;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.task.entity.WorkflowTask;
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.entity.WorkflowInstance;
import com.norteksoft.wf.engine.service.TaskService;
import com.norteksoft.wf.engine.service.WorkflowInstanceManager;
/**
* 办理人指定处理类
* @author Administrator
*
*/
public class AssignmentHandler implements org.jbpm.api.task.AssignmentHandler{
private static final long serialVersionUID = 1L;
private String newTransactor;
private static final Log log = Log.getLog(AssignmentHandler.class.getName());
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
Long companyId=getCompanyId();
if(companyId==null){
Object compIdStr=execution.getVariable(CommonStrings.COMPANY_ID);
if(compIdStr!=null){
companyId=Long.parseLong(compIdStr.toString());
}
}
getVariables(execution);
if(StringUtils.isNotEmpty(newTransactor)){
String[] transactors=newTransactor.split(",");
Set<String> ts=new HashSet<String>();
for(int i=0;i<transactors.length;i++){
ts.add(transactors[i]);
}
if(ts.size()==1){
assignable.setAssignee(ts.iterator().next());
}else{
for(String t : ts){
assignable.addCandidateUser(t);
}
}
}else{
String activityName=((ActivityExecution)execution).getActivityName();
log.info("开始指定办理人,环节名:"+activityName);
String processId = ((ActivityExecution)execution).getProcessDefinitionId();
String processInstanceId = ((ActivityExecution)execution).getProcessInstance().getId();
//设置流程实例中当前环节名称字段值
WorkflowInstanceManager workflowInstanceManager = (WorkflowInstanceManager)ContextUtils.getBean("workflowInstanceManager");
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(processInstanceId,companyId);
if(instance==null){throw new RuntimeException("设置办理人监听中,流程实例不能为null");}
instance.setCurrentActivity(activityName);
workflowInstanceManager.saveWorkflowInstance(instance);
Set<String> candidates = null;
Object originalUser=execution.getVariable(CommonStrings.IS_ORIGINAL_USER);
execution.removeVariable(CommonStrings.IS_ORIGINAL_USER);
Object allOriginalUsers=execution.getVariable(CommonStrings.ALL_ORIGINAL_USERS);
execution.removeVariable(CommonStrings.ALL_ORIGINAL_USERS);
if("true".equals(originalUser)){
TaskService taskService = (TaskService)ContextUtils.getBean("taskService");
if(ContextUtils.getCompanyId()==null){throw new RuntimeException("设置办理人监听中,公司id不能为null");}
List<WorkflowTask> list=taskService.getCompletedTasksByTaskName(processInstanceId, ContextUtils.getCompanyId(), activityName);
candidates = new HashSet<String>();
if(allOriginalUsers!=null && !"".equals(allOriginalUsers)){
String[] aous=allOriginalUsers.toString().split(",");
for(String s:aous){
for(WorkflowTask task:list){
if(s.equals(task.getTransactor())){
candidates.add(task.getTransactor());
break;
}
}
}
}
//当没有传入该环节上次办理人的登录名,则将所有已办理该环节的人加入候选人集合中
if(allOriginalUsers==null ||(allOriginalUsers!=null && "".equals(allOriginalUsers))){
for(WorkflowTask task:list){
candidates.add(task.getTransactor());
}
}
}
if(originalUser==null || "false".equals(originalUser) || ("true".equals(originalUser)&&candidates.size()==0)){
String creator = execution.getVariable(CommonStrings.CREATOR)==null?null:execution.getVariable(CommonStrings.CREATOR).toString();
//JPDL定义扩展参数
Map<TaskTransactorCondition, String> conditions =
DefinitionXmlParse.getTaskTransactor(processId, activityName);
//根据条件选定办理人
log.info("办理人设置条件为:"+conditions);
Map<String,String> paramMap = new HashMap<String,String>();
paramMap.put(TransactorConditionHandler.DOCUMENT_CREATOR, creator);
paramMap.put(TransactorConditionHandler.PROCESS_INSTANCEID, processInstanceId);
Object obj = execution.getVariable(CommonStrings.PREVIOUS_TASK_PRINCI_TRANSACTOR);
if(obj==null){//上一环节办理人委托人为空,取办理人
obj = execution.getVariable(CommonStrings.PREVIOUS_TASK_TRANSACTOR);
}
if(obj!=null){
paramMap.put(TransactorConditionHandler.PREVIOUS_TRANSACTOR, obj.toString());
}
candidates = TransactorConditionHandler.processCondition(conditions, execution,paramMap);
}
log.info("选定的办理人为:candidates:" +candidates);
if(candidates.size() == 1){
assignable.setAssignee(candidates.iterator().next());
}else if(candidates.size() == 0){
throw new WorkflowException(WorkflowException.NO_TRANSACTOR);
}else{
for(String candidate : candidates){
assignable.addCandidateUser(candidate);
}
}
}
//子流程返回时,需要通知父流程的下一环节来生成任务
Object needGenerateTask = execution.getVariable(CommonStrings.NEED_GENERATE_TASK);
Object parentInstanceId = execution.getVariable(CommonStrings.PARENT_INSTANCE_ID);
if(needGenerateTask!=null&&Boolean.valueOf(needGenerateTask.toString())){
TaskService taskService = (TaskService)ContextUtils.getBean("taskService");
ActivityExecution activityExecution = (ActivityExecution)execution;
String activityName = activityExecution.getActivityName();
String processInstanceId = ((ActivityExecution)execution).getProcessInstance().getId();
WorkflowInstanceManager workflowInstanceManager = (WorkflowInstanceManager)ContextUtils.getBean("workflowInstanceManager");
GeneralDao generalDao = (GeneralDao)ContextUtils.getBean("generalDao");
FormViewManager formManager = (FormViewManager)ContextUtils.getBean("formViewManager");
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(processInstanceId,companyId);
instance.setCurrentActivity(activityName);
workflowInstanceManager.saveWorkflowInstance(instance);
FormView form = formManager.getFormView(instance.getFormId());
if(form==null){throw new RuntimeException("设置办理人监听中,表单不能为null");}
if(form.isStandardForm()){
if(form.getDataTable()==null){throw new RuntimeException("设置办理人监听中,表单对应的数据表不能为null");}
String className = form.getDataTable().getEntityName();
log.info("实体类名:" + className);
//根据表名和id获得实体
try {
if(className==null){throw new RuntimeException("设置办理人监听中,表单对应的数据表的实体类名不能为null");}
Object entity = generalDao.getObject(className, instance.getDataId());
BeanUtils.setProperty(entity, "workflowInfo.currentActivityName", activityName);
generalDao.save(entity);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
taskService.generateTask(instance, execution.getId(), null);
}
if(execution!=null&&parentInstanceId!=null&&parentInstanceId.toString().equals(execution.getId())){
execution.removeVariable(CommonStrings.NEED_GENERATE_TASK);
execution.removeVariable(CommonStrings.PARENT_INSTANCE_ID);
}
}
private void getVariables(OpenExecution execution){
Object obj = execution.getVariable(CommonStrings.NEW_TRANSACTOR);
if(obj!=null){
newTransactor = obj.toString();
execution.removeVariable(CommonStrings.NEW_TRANSACTOR);
}else{
newTransactor = null;
}
}
private static Long getCompanyId(){
return ContextUtils.getCompanyId();
}
}