package com.mossle.bpm.listener;
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.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.impl.context.Context;
import org.activiti.engine.impl.el.ExpressionManager;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.task.IdentityLink;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HumanTaskTaskListener extends DefaultTaskListener {
public static final int TYPE_COPY = 3;
private static Logger logger = LoggerFactory
.getLogger(HumanTaskTaskListener.class);
private HumanTaskConnector humanTaskConnector;
private BpmConfUserManager bpmConfUserManager;
private BeanMapper beanMapper = new BeanMapper();
@Override
public void onCreate(DelegateTask delegateTask) throws Exception {
HumanTaskDTO humanTaskDto = null;
// 根据delegateTask创建HumanTaskDTO
try {
DelegateTaskHolder.setDelegateTask(delegateTask);
humanTaskDto = this.createHumanTask(delegateTask);
// 任务抄送
this.checkCopyHumanTask(delegateTask, humanTaskDto);
} finally {
DelegateTaskHolder.clear();
}
if (humanTaskDto != null) {
delegateTask.setAssignee(humanTaskDto.getAssignee());
delegateTask.setOwner(humanTaskDto.getOwner());
}
}
/**
* 如果直接完成了activiti的task,要同步完成HumanTask.
*/
@Override
public void onComplete(DelegateTask delegateTask) throws Exception {
HumanTaskDTO humanTaskDto = humanTaskConnector
.findHumanTaskByTaskId(delegateTask.getId());
if ("complete".equals(humanTaskDto.getStatus())) {
return;
}
humanTaskDto.setStatus("complete");
humanTaskDto.setCompleteTime(new Date());
humanTaskDto.setAction("完成");
humanTaskConnector.saveHumanTask(humanTaskDto, false);
}
@Override
public void onDelete(DelegateTask delegateTask) throws Exception {
HumanTaskDTO humanTaskDto = humanTaskConnector
.findHumanTaskByTaskId(delegateTask.getId());
if (humanTaskDto == null) {
return;
}
if (!"complete".equals(humanTaskDto.getStatus())) {
humanTaskDto.setStatus("delete");
humanTaskDto.setCompleteTime(new Date());
humanTaskDto.setAction("人工终止");
humanTaskDto.setOwner(humanTaskDto.getAssignee());
humanTaskDto.setAssignee(Authentication.getAuthenticatedUserId());
humanTaskConnector.saveHumanTask(humanTaskDto, false);
}
}
/**
* 是否会签任务.
*/
public boolean isVote(DelegateTask delegateTask) {
ExecutionEntity executionEntity = (ExecutionEntity) delegateTask
.getExecution();
ActivityImpl activityImpl = executionEntity.getActivity();
return activityImpl.getProperty("multiInstance") != null;
}
public HumanTaskDTO createHumanTask(DelegateTask delegateTask)
throws Exception {
HumanTaskDTO humanTaskDto = new HumanTaskBuilder()
.setDelegateTask(delegateTask)
.setVote(this.isVote(delegateTask)).build();
humanTaskDto = humanTaskConnector.saveHumanTask(humanTaskDto);
logger.debug("candidates : {}", delegateTask.getCandidates());
for (IdentityLink identityLink : delegateTask.getCandidates()) {
String type = identityLink.getType();
ParticipantDTO participantDto = new ParticipantDTO();
participantDto.setType(type);
participantDto.setHumanTaskId(humanTaskDto.getId());
if ("user".equals(type)) {
participantDto.setCode(identityLink.getUserId());
} else {
participantDto.setCode(identityLink.getGroupId());
}
humanTaskConnector.saveParticipant(participantDto);
}
return humanTaskDto;
}
public void checkCopyHumanTask(DelegateTask delegateTask,
HumanTaskDTO humanTaskDto) throws Exception {
List<BpmConfUser> bpmConfUsers = bpmConfUserManager
.find("from BpmConfUser where bpmConfNode.bpmConfBase.processDefinitionId=? and bpmConfNode.code=?",
delegateTask.getProcessDefinitionId(), delegateTask
.getExecution().getCurrentActivityId());
logger.debug("{}", bpmConfUsers);
ExpressionManager expressionManager = Context
.getProcessEngineConfiguration().getExpressionManager();
try {
for (BpmConfUser bpmConfUser : bpmConfUsers) {
logger.debug("status : {}, type: {}", bpmConfUser.getStatus(),
bpmConfUser.getType());
logger.debug("value : {}", bpmConfUser.getValue());
String value = expressionManager
.createExpression(bpmConfUser.getValue())
.getValue(delegateTask).toString();
if (bpmConfUser.getStatus() == 1) {
if (bpmConfUser.getType() == TYPE_COPY) {
logger.info("copy humantask : {}, {}",
humanTaskDto.getId(), value);
this.copyHumanTask(humanTaskDto, value);
}
}
}
} catch (Exception ex) {
logger.debug(ex.getMessage(), ex);
}
}
public void copyHumanTask(HumanTaskDTO humanTaskDto, String userId) {
// 创建新任务
HumanTaskDTO target = new HumanTaskDTO();
beanMapper.copy(humanTaskDto, target);
target.setId(null);
target.setCategory("copy");
target.setAssignee(userId);
target.setCatalog(HumanTaskConstants.CATALOG_COPY);
humanTaskConnector.saveHumanTask(target);
}
@Resource
public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) {
this.humanTaskConnector = humanTaskConnector;
}
@Resource
public void setBpmConfUserManager(BpmConfUserManager bpmConfUserManager) {
this.bpmConfUserManager = bpmConfUserManager;
}
}