package com.mossle.humantask.scheduler;
import java.util.Arrays;
import java.util.Date;
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.TaskDeadline;
import com.mossle.humantask.persistence.domain.TaskInfo;
import com.mossle.humantask.persistence.manager.TaskDeadlineManager;
import com.mossle.spi.process.InternalProcessConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class TaskDeadlineJob {
private static Logger logger = LoggerFactory
.getLogger(TaskDeadlineJob.class);
private TaskDeadlineManager taskDeadlineManager;
private NotificationConnector notificationConnector;
private UserConnector userConnector;
private InternalProcessConnector internalProcessConnector;
private boolean active;
private String baseUrl;
@Scheduled(cron = "0/10 * * * * ?")
@Transactional
public void execute() throws Exception {
if (!active) {
return;
}
logger.debug("start");
String hql = "from TaskDeadline";
List<TaskDeadline> taskDeadlines = taskDeadlineManager.find(hql);
Date now = new Date();
for (TaskDeadline taskDeadline : taskDeadlines) {
if (taskDeadline.getTriggerTime() != null) {
continue;
}
if (now.after(taskDeadline.getDeadlineTime())) {
String type = taskDeadline.getNotificationType();
String receiver = taskDeadline.getNotificationReceiver();
String templateCode = taskDeadline
.getNotificationTemplateCode();
this.doNotice(taskDeadline.getTaskInfo(), type, receiver,
templateCode);
taskDeadline.setTriggerTime(now);
taskDeadlineManager.save(taskDeadline);
}
}
logger.debug("end");
}
public void doNotice(TaskInfo taskInfo, String type, String receiver,
String templateCode) {
String taskDefinitionKey = taskInfo.getCode();
String processDefinitionId = taskInfo.getProcessDefinitionId();
Map<String, Object> data = this.prepareData(taskInfo);
logger.debug("receiver : {}", receiver);
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);
}
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 = 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());
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 setTaskDeadlineManager(TaskDeadlineManager taskDeadlineManager) {
this.taskDeadlineManager = taskDeadlineManager;
}
@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("${humantask.schedule.deadline.active}")
public void setActive(boolean active) {
this.active = active;
}
@Value("${application.baseUrl}")
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
}