package com.mossle.bpm.listener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.mossle.api.humantask.HumanTaskConnector;
import com.mossle.api.humantask.HumanTaskConstants;
import com.mossle.api.humantask.HumanTaskDTO;
import com.mossle.api.humantask.ParticipantDTO;
import com.mossle.api.user.UserConnector;
import com.mossle.bpm.cmd.CompleteTaskWithCommentCmd;
import com.mossle.bpm.persistence.domain.BpmConfUser;
import com.mossle.bpm.persistence.manager.BpmConfUserManager;
import com.mossle.bpm.support.DefaultTaskListener;
import com.mossle.bpm.support.DelegateTaskHolder;
import com.mossle.bpm.support.HumanTaskBuilder;
import com.mossle.core.mapper.BeanMapper;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.BaseEntityEventListener;
import org.activiti.engine.delegate.event.impl.ActivitiEntityEventImpl;
import org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.PvmActivity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.task.IdentityLink;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AutoCompleteFirstTaskEventListener implements
ActivitiEventListener {
public static final int TYPE_COPY = 3;
private static Logger logger = LoggerFactory
.getLogger(AutoCompleteFirstTaskEventListener.class);
private HumanTaskConnector humanTaskConnector;
public void onEvent(ActivitiEvent event) {
if (!(event instanceof ActivitiEntityEventImpl)) {
return;
}
ActivitiEntityEventImpl activitiEntityEventImpl = (ActivitiEntityEventImpl) event;
Object entity = activitiEntityEventImpl.getEntity();
if (!(entity instanceof TaskEntity)) {
return;
}
TaskEntity taskEntity = (TaskEntity) entity;
try {
switch (event.getType()) {
case TASK_CREATED:
logger.debug("create : {}", taskEntity.getId());
this.onCreate(taskEntity);
break;
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
public void onCreate(DelegateTask delegateTask) throws Exception {
String initiatorId = Authentication.getAuthenticatedUserId();
if (initiatorId == null) {
return;
}
String assignee = delegateTask.getAssignee();
if (assignee == null) {
return;
}
if (!initiatorId.equals(assignee)) {
return;
}
PvmActivity targetActivity = this.findFirstActivity(delegateTask
.getProcessDefinitionId());
logger.debug("targetActivity : {}", targetActivity);
if (!targetActivity.getId().equals(
delegateTask.getExecution().getCurrentActivityId())) {
return;
}
logger.debug("auto complete first task : {}", delegateTask);
for (IdentityLink identityLink : delegateTask.getCandidates()) {
String userId = identityLink.getUserId();
String groupId = identityLink.getGroupId();
if (userId != null) {
delegateTask.deleteCandidateUser(userId);
}
if (groupId != null) {
delegateTask.deleteCandidateGroup(groupId);
}
}
// 对提交流程的任务进行特殊处理
HumanTaskDTO humanTaskDto = humanTaskConnector
.findHumanTaskByTaskId(delegateTask.getId());
humanTaskDto.setCatalog(HumanTaskConstants.CATALOG_START);
humanTaskConnector.saveHumanTask(humanTaskDto);
// ((TaskEntity) delegateTask).complete();
// Context.getCommandContext().getHistoryManager().recordTaskId((TaskEntity) delegateTask);
// Context.getCommandContext().getHistoryManager().recordTaskId((TaskEntity) delegateTask);
// new CompleteTaskWithCommentCmd(delegateTask.getId(), null, "发起流程")
// .execute(Context.getCommandContext());
// 因为recordTaskId()会判断endTime,而complete以后会导致endTime!=null,
// 所以才会出现record()放在complete后面导致taskId没记录到historyActivity里的情况
delegateTask.getExecution().setVariableLocal(
"_ACTIVITI_SKIP_EXPRESSION_ENABLED", true);
TaskDefinition taskDefinition = ((TaskEntity) delegateTask)
.getTaskDefinition();
ExpressionManager expressionManager = Context
.getProcessEngineConfiguration().getExpressionManager();
Expression expression = expressionManager
.createExpression("${_ACTIVITI_SKIP_EXPRESSION_ENABLED}");
taskDefinition.setSkipExpression(expression);
}
/**
* 获得第一个节点.
*/
public PvmActivity findFirstActivity(String processDefinitionId) {
ProcessDefinitionEntity processDefinitionEntity = Context
.getProcessEngineConfiguration().getProcessDefinitionCache()
.get(processDefinitionId);
ActivityImpl startActivity = processDefinitionEntity.getInitial();
if (startActivity.getOutgoingTransitions().size() != 1) {
throw new IllegalStateException(
"start activity outgoing transitions cannot more than 1, now is : "
+ startActivity.getOutgoingTransitions().size());
}
PvmTransition pvmTransition = startActivity.getOutgoingTransitions()
.get(0);
PvmActivity targetActivity = pvmTransition.getDestination();
if (!"userTask".equals(targetActivity.getProperty("type"))) {
logger.debug("first activity is not userTask, just skip");
return null;
}
return targetActivity;
}
public boolean isFailOnException() {
return false;
}
@Resource
public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) {
this.humanTaskConnector = humanTaskConnector;
}
}