package com.mossle.bpm.notice;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
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.bpm.persistence.domain.BpmConfNotice;
import com.mossle.bpm.persistence.manager.BpmConfNoticeManager;
import com.mossle.core.spring.ApplicationContextHelper;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TimeoutNotice {
private static Logger logger = LoggerFactory.getLogger(TimeoutNotice.class);
public static final int TYPE_ARRIVAL = 0;
public static final int TYPE_COMPLETE = 1;
public static final int TYPE_TIMEOUT = 2;
public void process(DelegateTask delegateTask) {
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String processDefinitionId = delegateTask.getProcessDefinitionId();
List<BpmConfNotice> bpmConfNotices = ApplicationContextHelper
.getBean(BpmConfNoticeManager.class)
.find("from BpmConfNotice where bpmConfNode.bpmConfBase.processDefinitionId=? and bpmConfNode.code=?",
processDefinitionId, taskDefinitionKey);
for (BpmConfNotice bpmConfNotice : bpmConfNotices) {
if (TYPE_TIMEOUT == bpmConfNotice.getType()) {
processTimeout(delegateTask, bpmConfNotice);
}
}
}
public void processTimeout(DelegateTask delegateTask,
BpmConfNotice bpmConfNotice) {
try {
Date dueDate = delegateTask.getDueDate();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dueDate);
DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
Duration duration = datatypeFactory.newDuration("-"
+ bpmConfNotice.getDueDate());
duration.addTo(calendar);
Date noticeDate = calendar.getTime();
Date now = new Date();
if ((now.getTime() < noticeDate.getTime())
&& ((noticeDate.getTime() - now.getTime()) < (60 * 1000))) {
UserConnector userConnector = ApplicationContextHelper
.getBean(UserConnector.class);
NotificationConnector notificationConnector = ApplicationContextHelper
.getBean(NotificationConnector.class);
//
Map<String, Object> data = new HashMap<String, Object>();
TaskEntity taskEntity = new TaskEntity();
taskEntity.setId(delegateTask.getId());
taskEntity.setName(delegateTask.getName());
taskEntity.setAssigneeWithoutCascade(userConnector.findById(
delegateTask.getAssignee()).getDisplayName());
taskEntity.setVariableLocal("initiator",
getInitiator(userConnector, delegateTask));
//
data.put("task", taskEntity);
data.put("initiator",
this.getInitiator(userConnector, delegateTask));
String receiver = bpmConfNotice.getReceiver();
/*
* BpmMailTemplate bpmMailTemplate = bpmConfNotice .getBpmMailTemplate(); ExpressionManager
* expressionManager = Context .getProcessEngineConfiguration().getExpressionManager();
*/
UserDTO userDto = null;
if ("任务接收人".equals(receiver)) {
userDto = userConnector
.findById(delegateTask.getAssignee());
} else if ("流程发起人".equals(receiver)) {
userDto = userConnector.findById((String) delegateTask
.getVariables().get("initiator"));
} else {
HistoricProcessInstanceEntity historicProcessInstanceEntity = Context
.getCommandContext()
.getHistoricProcessInstanceEntityManager()
.findHistoricProcessInstance(
delegateTask.getProcessInstanceId());
userDto = userConnector
.findById(historicProcessInstanceEntity
.getStartUserId());
}
/*
* String subject = expressionManager .createExpression(bpmMailTemplate.getSubject())
* .getValue(taskEntity).toString();
*
* String content = expressionManager .createExpression(bpmMailTemplate.getContent())
* .getValue(taskEntity).toString();
*
* this.sendMail(userDto, subject, content); this.sendSiteMessage(userDto, subject, content);
*/
NotificationDTO notificationDto = new NotificationDTO();
notificationDto.setReceiver(userDto.getId());
notificationDto.setReceiverType("userid");
notificationDto.setTypes(Arrays.asList(bpmConfNotice
.getNotificationType().split(",")));
notificationDto.setData(data);
notificationDto.setTemplate(bpmConfNotice.getTemplateCode());
notificationConnector.send(notificationDto,
delegateTask.getTenantId());
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
public String getInitiator(UserConnector userConnector,
DelegateTask delegateTask) {
return userConnector.findById(
(String) delegateTask.getVariables().get("initiator"))
.getDisplayName();
}
}