package com.mossle.humantask.listener;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.api.notification.NotificationConnector;
import com.mossle.api.notification.NotificationDTO;
import com.mossle.api.user.UserConnector;
import com.mossle.api.user.UserDTO;
import com.mossle.humantask.persistence.domain.TaskInfo;
import com.mossle.spi.humantask.TaskDefinitionConnector;
import com.mossle.spi.humantask.TaskNotificationDTO;
import com.mossle.spi.process.InternalProcessConnector;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
public class TaskNotificationHumanTaskListener implements HumanTaskListener {
private static Logger logger = LoggerFactory
.getLogger(TaskNotificationHumanTaskListener.class);
private TaskDefinitionConnector taskDefinitionConnector;
private NotificationConnector notificationConnector;
private UserConnector userConnector;
private InternalProcessConnector internalProcessConnector;
private String baseUrl;
@Override
public void onCreate(TaskInfo taskInfo) throws Exception {
// TODO: ignore notification when skip this task
this.doNotice(taskInfo, "create");
}
@Override
public void onComplete(TaskInfo taskInfo) throws Exception {
this.doNotice(taskInfo, "complete");
}
public void doNotice(TaskInfo taskInfo, String eventName) {
String taskDefinitionKey = taskInfo.getCode();
String processDefinitionId = taskInfo.getProcessDefinitionId();
List<TaskNotificationDTO> taskNotifications = taskDefinitionConnector
.findTaskNotifications(taskDefinitionKey, processDefinitionId,
eventName);
Map<String, Object> data = this.prepareData(taskInfo);
for (TaskNotificationDTO taskNotification : taskNotifications) {
String templateCode = taskNotification.getTemplateCode();
String type = taskNotification.getType();
String receiver = taskNotification.getReceiver();
UserDTO userDto = null;
if ("任务接收人".equals(receiver)) {
userDto = userConnector.findById(taskInfo.getAssignee());
} else if ("流程发起人".equals(receiver)) {
String initiator = internalProcessConnector
.findInitiator(taskInfo.getProcessInstanceId());
userDto = userConnector.findById(initiator);
} else {
userDto = userConnector.findById(receiver);
}
if (userDto == null) {
logger.debug("userDto is null : {}", receiver);
continue;
}
NotificationDTO notificationDto = new NotificationDTO();
notificationDto.setReceiver(userDto.getId());
notificationDto.setReceiverType("userid");
notificationDto.setTypes(Arrays.asList(type.split(",")));
notificationDto.setData(data);
notificationDto.setTemplate(templateCode);
notificationConnector.send(notificationDto, taskInfo.getTenantId());
}
}
public Map<String, Object> prepareData(TaskInfo taskInfo) {
String assignee = taskInfo.getAssignee();
String initiator = internalProcessConnector.findInitiator(taskInfo
.getProcessInstanceId());
UserDTO assigneeUser = null;
if (StringUtils.isNotBlank(assignee)) {
assigneeUser = userConnector.findById(assignee);
}
UserDTO initiatorUser = userConnector.findById(initiator);
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> taskEntity = new HashMap<String, Object>();
taskEntity.put("id", taskInfo.getId());
taskEntity.put("name", taskInfo.getName());
if (assigneeUser != null) {
taskEntity.put("assignee", assigneeUser.getDisplayName());
}
data.put("task", taskEntity);
data.put("initiator", initiatorUser.getDisplayName());
data.put("humanTask", taskInfo);
data.put("baseUrl", baseUrl);
data.put("humanTaskId", Long.toString(taskInfo.getId()));
return data;
}
@Resource
public void setTaskDefinitionConnector(
TaskDefinitionConnector taskDefinitionConnector) {
this.taskDefinitionConnector = taskDefinitionConnector;
}
@Resource
public void setNotificationConnector(
NotificationConnector notificationConnector) {
this.notificationConnector = notificationConnector;
}
@Resource
public void setUserConnector(UserConnector userConnector) {
this.userConnector = userConnector;
}
@Resource
public void setInternalProcessConnector(
InternalProcessConnector internalProcessConnector) {
this.internalProcessConnector = internalProcessConnector;
}
@Value("${application.baseUrl}")
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
}