package com.mossle.humantask.support; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Resource; import com.mossle.humantask.persistence.domain.TaskConfUser; import com.mossle.humantask.persistence.domain.TaskDefBase; import com.mossle.humantask.persistence.domain.TaskDefDeadline; import com.mossle.humantask.persistence.domain.TaskDefNotification; import com.mossle.humantask.persistence.domain.TaskDefOperation; import com.mossle.humantask.persistence.domain.TaskDefUser; import com.mossle.humantask.persistence.manager.TaskConfUserManager; import com.mossle.humantask.persistence.manager.TaskDefBaseManager; import com.mossle.humantask.persistence.manager.TaskDefDeadlineManager; import com.mossle.humantask.persistence.manager.TaskDefNotificationManager; import com.mossle.humantask.persistence.manager.TaskDefOperationManager; import com.mossle.humantask.persistence.manager.TaskDefUserManager; import com.mossle.spi.humantask.CounterSignDTO; import com.mossle.spi.humantask.DeadlineDTO; import com.mossle.spi.humantask.FormDTO; import com.mossle.spi.humantask.TaskDefinitionConnector; import com.mossle.spi.humantask.TaskDefinitionDTO; import com.mossle.spi.humantask.TaskNotificationDTO; import com.mossle.spi.humantask.TaskUserDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TaskDefinitionConnectorImpl implements TaskDefinitionConnector { private static Logger logger = LoggerFactory .getLogger(TaskDefinitionConnectorImpl.class); private TaskDefBaseManager taskDefBaseManager; private TaskDefOperationManager taskDefOperationManager; private TaskDefUserManager taskDefUserManager; private TaskConfUserManager taskConfUserManager; private TaskDefNotificationManager taskDefNotificationManager; private TaskDefDeadlineManager taskDefDeadlineManager; /** * 分配策略. */ public String findTaskAssignStrategy(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return null; } return taskDefBase.getAssignStrategy(); } /** * 会签. */ public CounterSignDTO findCounterSign(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return null; } CounterSignDTO counterSignDto = new CounterSignDTO(); counterSignDto.setType(taskDefBase.getCountersignType()); counterSignDto.setParticipants(taskDefBase.getCountersignUser()); counterSignDto.setStrategy(taskDefBase.getCountersignStrategy()); counterSignDto.setRate(taskDefBase.getCountersignRate()); return counterSignDto; } /** * 表单. */ public FormDTO findForm(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return null; } if (taskDefBase.getFormType() == null) { return null; } FormDTO formDto = new FormDTO(); formDto.setType(taskDefBase.getFormType()); formDto.setKey(taskDefBase.getFormKey()); return formDto; } /** * 操作. */ public List<String> findOperations(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefOperation where taskDefBase.code=? and taskDefBase.processDefinitionId=?"; List<TaskDefOperation> taskDefOperations = taskDefOperationManager .find(hql, taskDefinitionKey, processDefinitionId); if (taskDefOperations.isEmpty()) { return Collections.emptyList(); } List<String> list = new ArrayList<String>(); for (TaskDefOperation taskDefOperation : taskDefOperations) { list.add(taskDefOperation.getValue()); } return list; } /** * 参与者. */ public List<TaskUserDTO> findTaskUsers(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefUser where taskDefBase.code=? and taskDefBase.processDefinitionId=?"; List<TaskDefUser> taskDefUsers = taskDefUserManager.find(hql, taskDefinitionKey, processDefinitionId); if (taskDefUsers.isEmpty()) { return Collections.emptyList(); } List<TaskUserDTO> taskUserDtos = new ArrayList<TaskUserDTO>(); for (TaskDefUser taskDefUser : taskDefUsers) { if ("disable".equals(taskDefUser.getStatus())) { continue; } TaskUserDTO taskUserDto = new TaskUserDTO(); taskUserDto.setCatalog(taskDefUser.getCatalog()); taskUserDto.setType(taskDefUser.getType()); taskUserDto.setValue(taskDefUser.getValue()); taskUserDtos.add(taskUserDto); } return taskUserDtos; } /** * 截止日期. */ public List<DeadlineDTO> findDeadlines(String taskDefinitionKey, String processDefinitionId) { String hql = "from TaskDefDeadline where taskDefBase.code=? and taskDefBase.processDefinitionId=?"; List<TaskDefDeadline> taskDefDeadlines = taskDefDeadlineManager.find( hql, taskDefinitionKey, processDefinitionId); if (taskDefDeadlines.isEmpty()) { return Collections.emptyList(); } List<DeadlineDTO> deadlines = new ArrayList<DeadlineDTO>(); for (TaskDefDeadline taskDefDeadline : taskDefDeadlines) { DeadlineDTO deadline = new DeadlineDTO(); deadline.setType(taskDefDeadline.getType()); deadline.setDuration(taskDefDeadline.getDuration()); deadline.setNotificationType(taskDefDeadline.getNotificationType()); deadline.setNotificationReceiver(taskDefDeadline .getNotificationReceiver()); deadline.setNotificationTemplateCode(taskDefDeadline .getNotificationTemplateCode()); deadlines.add(deadline); } return deadlines; } /** * 实例对应的参与者. */ public String findTaskConfUser(String taskDefinitionKey, String businessKey) { String hql = "from TaskConfUser where code=? and businessKey=?"; TaskConfUser taskConfUser = taskConfUserManager.findUnique(hql, taskDefinitionKey, businessKey); if (taskConfUser == null) { return null; } return taskConfUser.getValue(); } /** * 提醒. */ public List<TaskNotificationDTO> findTaskNotifications( String taskDefinitionKey, String processDefinitionId, String eventName) { String hql = "from TaskDefNotification where taskDefBase.code=? and taskDefBase.processDefinitionId=? and eventName=?"; List<TaskDefNotification> taskDefNotifications = taskDefNotificationManager .find(hql, taskDefinitionKey, processDefinitionId, eventName); if (taskDefNotifications.isEmpty()) { return Collections.emptyList(); } List<TaskNotificationDTO> taskNotifications = new ArrayList<TaskNotificationDTO>(); for (TaskDefNotification taskDefNotification : taskDefNotifications) { TaskNotificationDTO taskNotification = new TaskNotificationDTO(); taskNotification.setEventName(eventName); taskNotification.setType(taskDefNotification.getType()); taskNotification.setReceiver(taskDefNotification.getReceiver()); taskNotification.setTemplateCode(taskDefNotification .getTemplateCode()); taskNotifications.add(taskNotification); } return taskNotifications; } /** * 创建TaskDefinition. */ public void create(TaskDefinitionDTO taskDefinition) { logger.info("create task definition : {}", taskDefinition.getCode()); String hql = "from TaskDefBase where code=? and processDefinitionKey=? and processDefinitionVersion=?"; String processDefinitionId = taskDefinition.getProcessDefinitionId(); String processDefinitionKey = processDefinitionId.split("\\:")[0]; int processDefinitionVersion = Integer.parseInt(processDefinitionId .split("\\:")[1]); TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinition.getCode(), processDefinitionKey, processDefinitionVersion); if (taskDefBase == null) { taskDefBase = new TaskDefBase(); taskDefBase.setCode(taskDefinition.getCode()); taskDefBase.setProcessDefinitionKey(processDefinitionKey); taskDefBase.setProcessDefinitionVersion(processDefinitionVersion); } if (taskDefBase.getProcessDefinitionId() == null) { taskDefBase.setProcessDefinitionId(processDefinitionId); } taskDefBase.setName(taskDefinition.getName()); taskDefBase.setAssignStrategy(taskDefinition.getAssignStrategy()); if (taskDefinition.getForm() != null) { taskDefBase.setFormType(taskDefinition.getForm().getType()); taskDefBase.setFormKey(taskDefinition.getForm().getKey()); } if (taskDefinition.getCounterSign() != null) { taskDefBase.setCountersignType(taskDefinition.getCounterSign() .getType()); taskDefBase.setCountersignUser(taskDefinition.getCounterSign() .getParticipants()); taskDefBase.setCountersignStrategy(taskDefinition.getCounterSign() .getStrategy()); taskDefBase.setCountersignRate(taskDefinition.getCounterSign() .getRate()); } taskDefBaseManager.save(taskDefBase); for (TaskUserDTO taskUser : taskDefinition.getTaskUsers()) { String value = taskUser.getValue(); String type = taskUser.getType(); String catalog = taskUser.getCatalog(); if (value == null) { logger.info("skip : {} {} {}", value, type, catalog); continue; } String hqlFindTaskDefUser = "from TaskDefUser where taskDefBase=? and value=? and type=? and catalog=?"; TaskDefUser taskDefUser = taskDefUserManager.findUnique( hqlFindTaskDefUser, taskDefBase, value, type, catalog); if (taskDefUser != null) { continue; } taskDefUser = new TaskDefUser(); taskDefUser.setType(type); taskDefUser.setCatalog(catalog); taskDefUser.setValue(value); taskDefUser.setTaskDefBase(taskDefBase); taskDefUserManager.save(taskDefUser); } } /** * 保存分配策略. */ public void saveAssignStrategy(String taskDefinitionKey, String processDefinitionId, String assignStrategy) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } taskDefBase.setAssignStrategy(assignStrategy); taskDefBaseManager.save(taskDefBase); } /** * 保存会签. */ public void saveCounterSign(String taskDefinitionKey, String processDefinitionId, CounterSignDTO counterSign) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } if (counterSign.getStrategy() != null) { taskDefBase.setCountersignStrategy(counterSign.getStrategy()); } if (counterSign.getRate() != 0) { taskDefBase.setCountersignRate(counterSign.getRate()); } taskDefBaseManager.save(taskDefBase); } /** * 保存表单. */ public void saveForm(String taskDefinitionKey, String processDefinitionId, FormDTO form) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } if (form.getKey() != null) { taskDefBase.setFormKey(form.getKey()); } if (form.getType() != null) { taskDefBase.setFormType(form.getType()); } taskDefBaseManager.save(taskDefBase); } /** * 添加操作. */ public void addOperation(String taskDefinitionKey, String processDefinitionId, String operation) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlOperation = "from TaskDefOperation where taskDefBase=? and value=?"; TaskDefOperation taskDefOperation = taskDefOperationManager.findUnique( hqlOperation, taskDefBase, operation); if (taskDefOperation != null) { return; } taskDefOperation = new TaskDefOperation(); taskDefOperation.setTaskDefBase(taskDefBase); taskDefOperation.setValue(operation); taskDefOperationManager.save(taskDefOperation); } /** * 删除操作 */ public void removeOperation(String taskDefinitionKey, String processDefinitionId, String operation) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlOperation = "from TaskDefOperation where taskDefBase=? and value=?"; TaskDefOperation taskDefOperation = taskDefOperationManager.findUnique( hqlOperation, taskDefBase, operation); if (taskDefOperation == null) { return; } taskDefOperationManager.remove(taskDefOperation); } /** * 添加参与者. */ public void addTaskUser(String taskDefinitionKey, String processDefinitionId, TaskUserDTO taskUser) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { logger.info("cannot find taskDefBase {} {}", taskDefinitionKey, processDefinitionId); return; } String hqlUser = "from TaskDefUser where taskDefBase=? and catalog=? and type=? and value=?"; TaskDefUser taskDefUser = taskDefUserManager.findUnique(hqlUser, taskDefBase, taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); if (taskDefUser != null) { logger.info("cannot find taskDefUser {} {} {} {}", taskDefBase.getId(), taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); return; } taskDefUser = new TaskDefUser(); taskDefUser.setTaskDefBase(taskDefBase); taskDefUser.setCatalog(taskUser.getCatalog()); taskDefUser.setType(taskUser.getType()); taskDefUser.setValue(taskUser.getValue()); taskDefBaseManager.save(taskDefUser); } /** * 删除参与者. */ public void removeTaskUser(String taskDefinitionKey, String processDefinitionId, TaskUserDTO taskUser) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { logger.info("cannot find taskDefBase {} {}", taskDefinitionKey, processDefinitionId); return; } String hqlUser = "from TaskDefUser where taskDefBase=? and catalog=? and type=? and value=?"; TaskDefUser taskDefUser = taskDefUserManager.findUnique(hqlUser, taskDefBase, taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); if (taskDefUser == null) { logger.info("cannot find taskDefUser {} {} {} {}", taskDefBase.getId(), taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); return; } taskDefBaseManager.remove(taskDefUser); } /** * 更新参与者. */ public void updateTaskUser(String taskDefinitionKey, String processDefinitionId, TaskUserDTO taskUser, String status) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { logger.info("cannot find taskDefBase {} {}", taskDefinitionKey, processDefinitionId); return; } String hqlUser = "from TaskDefUser where taskDefBase=? and catalog=? and type=? and value=?"; TaskDefUser taskDefUser = taskDefUserManager.findUnique(hqlUser, taskDefBase, taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); if (taskDefUser == null) { logger.info("cannot find taskDefUser {} {} {} {}", taskDefBase.getId(), taskUser.getCatalog(), taskUser.getType(), taskUser.getValue()); return; } taskDefUser.setStatus(status); taskDefBaseManager.save(taskDefUser); } /** * 添加提醒. */ public void addTaskNotification(String taskDefinitionKey, String processDefinitionId, TaskNotificationDTO taskNotification) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlNotification = "from TaskDefNotification where taskDefBase=? and eventName=? and templateCode=?"; TaskDefNotification taskDefNotification = taskDefNotificationManager .findUnique(hqlNotification, taskDefBase, taskNotification.getEventName(), taskNotification.getTemplateCode()); if (taskDefNotification == null) { taskDefNotification = new TaskDefNotification(); taskDefNotification.setTaskDefBase(taskDefBase); taskDefNotification.setEventName(taskNotification.getEventName()); taskDefNotification.setTemplateCode(taskNotification .getTemplateCode()); taskDefNotification.setType(taskNotification.getType()); } taskDefNotification.setReceiver(taskNotification.getReceiver()); taskDefNotification.setType(taskNotification.getType()); taskDefNotificationManager.save(taskDefNotification); } /** * 删除提醒. */ public void removeTaskNotification(String taskDefinitionKey, String processDefinitionId, TaskNotificationDTO taskNotification) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlNotification = "from TaskDefNotification where taskDefBase=? and eventName=? and templateCode=?"; TaskDefNotification taskDefNotification = taskDefNotificationManager .findUnique(hqlNotification, taskDefBase, taskNotification.getEventName(), taskNotification.getTemplateCode()); if (taskDefNotification == null) { return; } taskDefNotificationManager.remove(taskDefNotification); } /** * 添加截止日期. */ public void addDeadline(String taskDefinitionKey, String processDefinitionId, DeadlineDTO deadline) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlDeadline = "from TaskDefDeadline where taskDefBase=? and type=? and duration=?"; TaskDefDeadline taskDefDeadline = taskDefDeadlineManager.findUnique( hqlDeadline, taskDefBase, deadline.getType(), deadline.getDuration()); if (taskDefDeadline == null) { taskDefDeadline = new TaskDefDeadline(); taskDefDeadline.setTaskDefBase(taskDefBase); taskDefDeadline.setType(deadline.getType()); taskDefDeadline.setDuration(deadline.getDuration()); } taskDefDeadline.setNotificationType(deadline.getNotificationType()); taskDefDeadline.setNotificationReceiver(deadline .getNotificationReceiver()); taskDefDeadline.setNotificationTemplateCode(deadline .getNotificationTemplateCode()); taskDefDeadlineManager.save(taskDefDeadline); } /** * 删除截止日期. */ public void removeDeadline(String taskDefinitionKey, String processDefinitionId, DeadlineDTO deadline) { String hql = "from TaskDefBase where code=? and processDefinitionId=?"; TaskDefBase taskDefBase = taskDefBaseManager.findUnique(hql, taskDefinitionKey, processDefinitionId); if (taskDefBase == null) { return; } String hqlDeadline = "from TaskDefDeadline where taskDefBase=? and type=? and duration=?"; TaskDefDeadline taskDefDeadline = taskDefDeadlineManager.findUnique( hqlDeadline, taskDefBase, deadline.getType(), deadline.getDuration()); if (taskDefDeadline == null) { return; } taskDefDeadlineManager.remove(taskDefDeadline); } @Resource public void setTaskDefBaseManager(TaskDefBaseManager taskDefBaseManager) { this.taskDefBaseManager = taskDefBaseManager; } @Resource public void setTaskDefOperationManager( TaskDefOperationManager taskDefOperationManager) { this.taskDefOperationManager = taskDefOperationManager; } @Resource public void setTaskDefUserManager(TaskDefUserManager taskDefUserManager) { this.taskDefUserManager = taskDefUserManager; } @Resource public void setTaskConfUserManager(TaskConfUserManager taskConfUserManager) { this.taskConfUserManager = taskConfUserManager; } @Resource public void setTaskDefNotificationManager( TaskDefNotificationManager taskDefNotificationManager) { this.taskDefNotificationManager = taskDefNotificationManager; } @Resource public void setTaskDefDeadlineManager( TaskDefDeadlineManager taskDefDeadlineManager) { this.taskDefDeadlineManager = taskDefDeadlineManager; } }