package com.mossle.humantask.support; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import com.mossle.api.form.FormConnector; import com.mossle.api.form.FormDTO; import com.mossle.api.humantask.HumanTaskConnector; import com.mossle.api.humantask.HumanTaskConstants; import com.mossle.api.humantask.HumanTaskDTO; import com.mossle.api.humantask.HumanTaskDefinition; import com.mossle.api.humantask.ParticipantDTO; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.page.Page; import com.mossle.humantask.listener.HumanTaskListener; import com.mossle.humantask.persistence.domain.TaskConfUser; import com.mossle.humantask.persistence.domain.TaskDeadline; import com.mossle.humantask.persistence.domain.TaskInfo; import com.mossle.humantask.persistence.domain.TaskParticipant; import com.mossle.humantask.persistence.manager.TaskConfUserManager; import com.mossle.humantask.persistence.manager.TaskDeadlineManager; import com.mossle.humantask.persistence.manager.TaskInfoManager; import com.mossle.humantask.persistence.manager.TaskParticipantManager; import com.mossle.spi.humantask.TaskDefinitionConnector; import com.mossle.spi.process.InternalProcessConnector; import com.mossle.spi.process.ProcessTaskDefinition; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.Assert; public class HumanTaskConnectorImpl implements HumanTaskConnector { private Logger logger = LoggerFactory .getLogger(HumanTaskConnectorImpl.class); private JdbcTemplate jdbcTemplate; private TaskInfoManager taskInfoManager; private TaskParticipantManager taskParticipantManager; private TaskConfUserManager taskConfUserManager; private TaskDeadlineManager taskDeadlineManager; private InternalProcessConnector internalProcessConnector; private TaskDefinitionConnector taskDefinitionConnector; private FormConnector formConnector; private BeanMapper beanMapper = new BeanMapper(); private List<HumanTaskListener> humanTaskListeners; // ~ /** * 创建一个任务. */ public HumanTaskDTO createHumanTask() { return new HumanTaskBuilder().create(); } // ~ /** * 删除任务. */ public void removeHumanTask(String humanTaskId) { TaskInfo taskInfo = taskInfoManager.get(Long.parseLong(humanTaskId)); this.removeHumanTask(taskInfo); } public void removeHumanTaskByTaskId(String taskId) { TaskInfo taskInfo = taskInfoManager.findUniqueBy("taskId", taskId); this.removeHumanTask(taskInfo); } public void removeHumanTaskByProcessInstanceId(String processInstanceId) { String hql = "from TaskInfo where status='active' and processInstanceId=?"; List<TaskInfo> taskInfos = taskInfoManager.find(hql, processInstanceId); for (TaskInfo taskInfo : taskInfos) { this.removeHumanTask(taskInfo); } } public void removeHumanTask(TaskInfo taskInfo) { taskInfoManager.removeAll(taskInfo.getTaskDeadlines()); taskInfoManager.removeAll(taskInfo.getTaskLogs()); taskInfoManager.remove(taskInfo); } // ~ /** * 保存任务. */ public HumanTaskDTO saveHumanTask(HumanTaskDTO humanTaskDto) { return this.saveHumanTask(humanTaskDto, true); } public HumanTaskDTO saveHumanTask(HumanTaskDTO humanTaskDto, boolean triggerListener) { // process first Long id = null; if (humanTaskDto.getId() != null) { try { id = Long.parseLong(humanTaskDto.getId()); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } TaskInfo taskInfo = new TaskInfo(); if (id != null) { taskInfo = taskInfoManager.get(id); } beanMapper.copy(humanTaskDto, taskInfo, HumanTaskDTO.class, TaskInfo.class); logger.debug("action : {}", humanTaskDto.getAction()); logger.debug("comment : {}", humanTaskDto.getComment()); logger.debug("action : {}", taskInfo.getAction()); logger.debug("comment : {}", taskInfo.getComment()); if (humanTaskDto.getParentId() != null) { taskInfo.setTaskInfo(taskInfoManager.get(Long .parseLong(humanTaskDto.getParentId()))); } taskInfoManager.save(taskInfo); if (triggerListener) { // create if ((id == null) && (humanTaskListeners != null)) { for (HumanTaskListener humanTaskListener : humanTaskListeners) { try { humanTaskListener.onCreate(taskInfo); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } } humanTaskDto.setAssignee(taskInfo.getAssignee()); humanTaskDto.setOwner(taskInfo.getOwner()); } humanTaskDto.setId(Long.toString(taskInfo.getId())); return humanTaskDto; } /** * 保存任务,并处理参与者. */ public HumanTaskDTO saveHumanTaskAndProcess(HumanTaskDTO humanTaskDto) { return this.saveHumanTask(humanTaskDto, true); } public HumanTaskDTO findHumanTaskByTaskId(String taskId) { TaskInfo taskInfo = taskInfoManager.findUniqueBy("taskId", taskId); HumanTaskDTO humanTaskDto = new HumanTaskDTO(); beanMapper.copy(taskInfo, humanTaskDto); return humanTaskDto; } public List<HumanTaskDTO> findHumanTasksByProcessInstanceId( String processInstanceId) { List<TaskInfo> taskInfos = taskInfoManager .find("from TaskInfo where processInstanceId=? order by createTime asc", processInstanceId); return this.convertHumanTaskDtos(taskInfos); } public HumanTaskDTO findHumanTask(String humanTaskId) { Assert.hasText(humanTaskId, "humanTaskId不能为空"); TaskInfo taskInfo = taskInfoManager.get(Long.parseLong(humanTaskId)); return this.convertHumanTaskDto(taskInfo); } public List<HumanTaskDTO> findSubTasks(String parentTaskId) { List<TaskInfo> taskInfos = taskInfoManager.findBy("taskInfo.id", Long.parseLong(parentTaskId)); return this.convertHumanTaskDtos(taskInfos); } /** * 获取任务表单. */ public FormDTO findTaskForm(String humanTaskId) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); FormDTO formDto = null; if (humanTaskDto.getTaskId() != null) { // formDto = internalProcessConnector.findTaskForm(humanTaskDto // .getTaskId()); com.mossle.spi.humantask.FormDTO taskFormDto = taskDefinitionConnector .findForm(humanTaskDto.getCode(), humanTaskDto.getProcessDefinitionId()); if (taskFormDto == null) { logger.info( "cannot find form by code : {}, processDefinition : {}", humanTaskDto.getCode(), humanTaskDto.getProcessDefinitionId()); } else { formDto = new FormDTO(); formDto.setCode(taskFormDto.getKey()); List<String> operations = taskDefinitionConnector .findOperations(humanTaskDto.getCode(), humanTaskDto.getProcessDefinitionId()); formDto.getButtons().addAll(operations); formDto.setActivityId(humanTaskDto.getCode()); formDto.setProcessDefinitionId(humanTaskDto .getProcessDefinitionId()); } } else { formDto = new FormDTO(); formDto.setCode(humanTaskDto.getForm()); formDto.setActivityId(humanTaskDto.getCode()); formDto.setProcessDefinitionId(humanTaskDto .getProcessDefinitionId()); } if (formDto == null) { logger.error("cannot find form : {}", humanTaskId); return new FormDTO(); } formDto.setTaskId(humanTaskId); FormDTO contentFormDto = formConnector.findForm(formDto.getCode(), humanTaskDto.getTenantId()); if (contentFormDto == null) { logger.error("cannot find form : {}", formDto.getCode()); return formDto; } formDto.setRedirect(contentFormDto.isRedirect()); formDto.setUrl(contentFormDto.getUrl()); formDto.setContent(contentFormDto.getContent()); return formDto; } /** * 根据流程定义获得所有任务定义. */ public List<HumanTaskDefinition> findHumanTaskDefinitions( String processDefinitionId) { List<ProcessTaskDefinition> processTaskDefinitions = internalProcessConnector .findTaskDefinitions(processDefinitionId); List<HumanTaskDefinition> humanTaskDefinitions = new ArrayList<HumanTaskDefinition>(); for (ProcessTaskDefinition processTaskDefinition : processTaskDefinitions) { HumanTaskDefinition humanTaskDefinition = new HumanTaskDefinition(); beanMapper.copy(processTaskDefinition, humanTaskDefinition); humanTaskDefinitions.add(humanTaskDefinition); } return humanTaskDefinitions; } /** * 流程发起之前,配置每个任务的负责人. */ public void configTaskDefinitions(String businessKey, List<String> taskDefinitionKeys, List<String> taskAssignees) { if (taskDefinitionKeys == null) { return; } int index = 0; for (String taskDefinitionKey : taskDefinitionKeys) { String taskAssignee = taskAssignees.get(index++); String hql = "from TaskConfUser where businessKey=? and code=?"; TaskConfUser taskConfUser = taskConfUserManager.findUnique(hql, businessKey, taskDefinitionKey); if (taskConfUser == null) { taskConfUser = new TaskConfUser(); } taskConfUser.setBusinessKey(businessKey); taskConfUser.setCode(taskDefinitionKey); taskConfUser.setValue(taskAssignee); taskConfUserManager.save(taskConfUser); } } /** * 完成任务. */ public void completeTask(String humanTaskId, String userId, String action, String comment, Map<String, Object> taskParameters) { Assert.hasText(humanTaskId, "humanTaskId不能为空"); logger.info("completeTask humanTaskId : {}, userId : {}, comment: {}", humanTaskId, userId, comment); HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } humanTaskDto.setStatus("complete"); humanTaskDto.setCompleteTime(new Date()); humanTaskDto.setAction("完成"); if (StringUtils.isNotBlank(action)) { humanTaskDto.setAction(action); } if (StringUtils.isNotBlank(comment)) { humanTaskDto.setComment(comment); } Long longTaskId = Long.parseLong(humanTaskDto.getId()); List<TaskDeadline> taskDeadlines = taskDeadlineManager.find( "from TaskDeadline where taskInfo.id=?", longTaskId); for (TaskDeadline taskDeadline : taskDeadlines) { taskDeadlineManager.remove(taskDeadline); } // 处理抄送任务 if ("copy".equals(humanTaskDto.getCategory())) { humanTaskDto.setStatus("complete"); humanTaskDto.setCompleteTime(new Date()); humanTaskDto.setAction("完成"); this.saveHumanTask(humanTaskDto, false); return; } // 处理startEvent任务 if ("startEvent".equals(humanTaskDto.getCategory())) { humanTaskDto.setStatus("complete"); humanTaskDto.setAction("提交"); humanTaskDto.setCompleteTime(new Date()); this.saveHumanTask(humanTaskDto, false); internalProcessConnector.signalExecution(humanTaskDto .getExecutionId()); return; } logger.debug("{}", humanTaskDto.getDelegateStatus()); // 处理协办任务 if ("pending".equals(humanTaskDto.getDelegateStatus())) { humanTaskDto.setStatus("active"); humanTaskDto.setDelegateStatus("resolved"); humanTaskDto.setAssignee(humanTaskDto.getOwner()); humanTaskDto.setAction("完成"); this.saveHumanTask(humanTaskDto, false); internalProcessConnector.resolveTask(humanTaskDto.getTaskId()); return; } // 处理协办链式任务 if ("pendingCreate".equals(humanTaskDto.getDelegateStatus())) { humanTaskDto.setCompleteTime(new Date()); humanTaskDto.setDelegateStatus("resolved"); humanTaskDto.setStatus("complete"); humanTaskDto.setAction("完成"); this.saveHumanTask(humanTaskDto, false); if (humanTaskDto.getParentId() != null) { HumanTaskDTO targetHumanTaskDto = this .findHumanTask(humanTaskDto.getParentId()); targetHumanTaskDto.setStatus("active"); if (targetHumanTaskDto.getParentId() == null) { targetHumanTaskDto.setDelegateStatus("resolved"); } this.saveHumanTask(targetHumanTaskDto, false); } return; } this.saveHumanTask(humanTaskDto, false); // 判断加签 if ("vote".equals(humanTaskDto.getCatalog()) && (humanTaskDto.getParentId() != null)) { HumanTaskDTO parentTask = this.findHumanTask(humanTaskDto .getParentId()); boolean completed = true; for (HumanTaskDTO childTask : parentTask.getChildren()) { if (!"complete".equals(childTask.getStatus())) { completed = false; break; } } if (completed) { parentTask.setAssignee(parentTask.getOwner()); parentTask.setOwner(""); parentTask.setStatus("complete"); parentTask.setCompleteTime(new Date()); parentTask.setAction("完成"); this.saveHumanTask(parentTask, false); internalProcessConnector.completeTask(humanTaskDto.getTaskId(), userId, taskParameters); } } else { internalProcessConnector.completeTask(humanTaskDto.getTaskId(), userId, taskParameters); } if (humanTaskListeners != null) { Long id = null; try { id = Long.parseLong(humanTaskDto.getId()); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } if (id == null) { return; } TaskInfo taskInfo = taskInfoManager.get(id); for (HumanTaskListener humanTaskListener : humanTaskListeners) { try { humanTaskListener.onComplete(taskInfo); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } } } /** * 待办任务. */ public Page findPersonalTasks(String userId, String tenantId, int pageNo, int pageSize) { Page page = taskInfoManager .pagedQuery( "from TaskInfo where assignee=? and tenantId=? and status='active'", pageNo, pageSize, userId, tenantId); List<TaskInfo> taskInfos = (List<TaskInfo>) page.getResult(); List<HumanTaskDTO> humanTaskDtos = this.convertHumanTaskDtos(taskInfos); page.setResult(humanTaskDtos); return page; } /** * 已办任务. */ public Page findFinishedTasks(String userId, String tenantId, int pageNo, int pageSize) { Page page = taskInfoManager .pagedQuery( "from TaskInfo where assignee=? and tenantId=? and status='complete'", pageNo, pageSize, userId, tenantId); List<TaskInfo> taskInfos = (List<TaskInfo>) page.getResult(); List<HumanTaskDTO> humanTaskDtos = this.convertHumanTaskDtos(taskInfos); page.setResult(humanTaskDtos); return page; } /** * 待领任务. */ public Page findGroupTasks(String userId, String tenantId, int pageNo, int pageSize) { List<String> partyIds = new ArrayList<String>(); partyIds.addAll(this.findGroupIds(userId)); partyIds.addAll(this.findUserIds(userId)); logger.debug("party ids : {}", partyIds); if (partyIds.isEmpty()) { return new Page(); } Map<String, Object> map = new HashMap<String, Object>(); map.put("partyIds", partyIds); map.put("tenantId", tenantId); String hql = "select distinct t from TaskInfo t join t.taskParticipants p with p.ref in (:partyIds) where t.tenantId=:tenantId and t.assignee=null and t.status='active'"; Page page = taskInfoManager.pagedQuery(hql, pageNo, pageSize, map); // List<PropertyFilter> propertyFilters = PropertyFilter // .buildFromMap(parameterMap); // propertyFilters.add(new PropertyFilter("EQS_status", "active")); // propertyFilters.add(new PropertyFilter("INLS_assignee", null)); List<TaskInfo> taskInfos = (List<TaskInfo>) page.getResult(); List<HumanTaskDTO> humanTaskDtos = this.convertHumanTaskDtos(taskInfos); page.setResult(humanTaskDtos); return page; } /** * 经手任务. */ public Page findDelegateTasks(String userId, String tenantId, int pageNo, int pageSize) { Page page = taskInfoManager .pagedQuery( "from TaskInfo where owner=? and tenantId=? and status='active'", pageNo, pageSize, userId, tenantId); List<TaskInfo> taskInfos = (List<TaskInfo>) page.getResult(); List<HumanTaskDTO> humanTaskDtos = this.convertHumanTaskDtos(taskInfos); page.setResult(humanTaskDtos); return page; } /** * 领取任务. */ public void claimTask(String humanTaskId, String userId) { TaskInfo taskInfo = taskInfoManager.get(Integer.parseInt(humanTaskId)); if (taskInfo.getAssignee() != null) { throw new IllegalStateException("task " + humanTaskId + " already be claimed by " + taskInfo.getAssignee()); } taskInfo.setAssignee(userId); taskInfoManager.save(taskInfo); } /** * 释放任务. */ public void releaseTask(String humanTaskId, String comment) { TaskInfo taskInfo = taskInfoManager.get(Integer.parseInt(humanTaskId)); taskInfo.setAssignee(null); taskInfoManager.save(taskInfo); } /** * 转办. */ public void transfer(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setOwner(humanTaskDto.getAssignee()); humanTaskDto.setAssignee(userId); this.saveHumanTask(humanTaskDto, false); internalProcessConnector.transfer(humanTaskDto.getTaskId(), humanTaskDto.getAssignee(), humanTaskDto.getOwner()); } /** * 取消转办. */ public void cancel(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setAssignee(humanTaskDto.getOwner()); humanTaskDto.setOwner(""); this.saveHumanTask(humanTaskDto, false); } /** * 回退,指定节点,重新分配. */ public void rollbackActivity(String humanTaskId, String activityId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollback(taskId, activityId, null); } /** * 回退,指定节点,上个执行人. */ public void rollbackActivityLast(String humanTaskId, String activityId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollbackAuto(taskId, activityId); } /** * 回退,指定节点,指定执行人. */ public void rollbackActivityAssignee(String humanTaskId, String activityId, String userId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollback(taskId, activityId, userId); } /** * 回退,上个节点,重新分配. */ public void rollbackPrevious(String humanTaskId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollback(taskId, null, null); } /** * 回退,上个节点,上个执行人. */ public void rollbackPreviousLast(String humanTaskId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollbackAuto(taskId, null); } /** * 回退,上个节点,指定执行人. */ public void rollbackPreviousAssignee(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); internalProcessConnector.rollback(taskId, null, userId); } /** * 回退,开始事件,流程发起人. */ public void rollbackStart(String humanTaskId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); String processDefinitionId = humanTaskDto.getProcessDefinitionId(); String processInstanceId = humanTaskDto.getProcessInstanceId(); String activityId = this.internalProcessConnector .findInitialActivityId(processDefinitionId); String initiator = this.internalProcessConnector .findInitiator(processInstanceId); internalProcessConnector.rollback(taskId, activityId, initiator); } /** * 回退,流程发起人. */ public void rollbackInitiator(String humanTaskId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); humanTaskDto.setAction("回退(发起人)"); humanTaskDto.setComment(comment); this.saveHumanTask(humanTaskDto, false); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } String taskId = humanTaskDto.getTaskId(); String processDefinitionId = humanTaskDto.getProcessDefinitionId(); String processInstanceId = humanTaskDto.getProcessInstanceId(); String initiator = this.internalProcessConnector .findInitiator(processInstanceId); String activityId = this.internalProcessConnector .findFirstUserTaskActivityId(processDefinitionId, initiator); internalProcessConnector.rollback(taskId, activityId, initiator); } /** * 撤销. */ public void withdraw(String humanTaskId, String comment) { HumanTaskDTO humanTaskDto = findHumanTask(humanTaskId); if (humanTaskDto == null) { throw new IllegalStateException("任务不存在"); } internalProcessConnector.withdrawTask(humanTaskDto.getTaskId()); } /** * 协办. */ public void delegateTask(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setOwner(humanTaskDto.getAssignee()); humanTaskDto.setAssignee(userId); humanTaskDto.setDelegateStatus("pending"); this.saveHumanTask(humanTaskDto, false); internalProcessConnector.delegateTask(humanTaskDto.getTaskId(), userId); } /** * 协办,链状. */ public void delegateTaskCreate(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setDelegateStatus("pendingCreate"); humanTaskDto.setStatus("pending"); this.saveHumanTask(humanTaskDto, false); HumanTaskDTO targetHumanTaskDto = this.createHumanTask(); beanMapper.copy(humanTaskDto, targetHumanTaskDto); targetHumanTaskDto.setStatus("active"); targetHumanTaskDto.setParentId(humanTaskDto.getId()); targetHumanTaskDto.setId(null); targetHumanTaskDto.setOwner(humanTaskDto.getAssignee()); targetHumanTaskDto.setAssignee(userId); this.saveHumanTask(targetHumanTaskDto, false); if (humanTaskDto.getParentId() == null) { humanTaskDto.setOwner(humanTaskDto.getAssignee()); humanTaskDto.setAssignee(userId); // 只有第一次协办才更新bpm的历史 internalProcessConnector.delegateTask(humanTaskDto.getTaskId(), userId); humanTaskDto.setAssignee(humanTaskDto.getOwner()); humanTaskDto.setOwner(null); this.saveHumanTask(humanTaskDto, false); } } /** * 沟通. */ public void communicate(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); HumanTaskDTO target = new HumanTaskDTO(); beanMapper.copy(humanTaskDto, target); target.setId(null); target.setCatalog(HumanTaskConstants.CATALOG_COMMUNICATE); target.setAssignee(userId); target.setParentId(humanTaskId); target.setMessage(comment); this.saveHumanTask(target, false); } /** * 反馈. */ public void callback(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setStatus("complete"); humanTaskDto.setCompleteTime(new Date()); humanTaskDto.setAction("反馈"); humanTaskDto.setComment(comment); this.saveHumanTask(humanTaskDto, false); } /** * 跳过. */ public void skip(String humanTaskId, String userId, String comment) { HumanTaskDTO humanTaskDto = this.findHumanTask(humanTaskId); humanTaskDto.setStatus("complete"); humanTaskDto.setCompleteTime(new Date()); humanTaskDto.setAction("跳过"); humanTaskDto.setComment(comment); humanTaskDto.setOwner(humanTaskDto.getAssignee()); humanTaskDto.setAssignee(userId); this.saveHumanTask(humanTaskDto, false); internalProcessConnector.completeTask(humanTaskDto.getTaskId(), userId, Collections.<String, Object> emptyMap()); } public List<String> findGroupIds(String userId) { String groupSql = "select ps.PARENT_ENTITY_ID as ID from PARTY_STRUCT ps,PARTY_ENTITY child,PARTY_TYPE type" + " where ps.CHILD_ENTITY_ID=child.ID and child.TYPE_ID=type.ID and type.TYPE='1' and child.REF=?"; List<Map<String, Object>> list = jdbcTemplate.queryForList(groupSql, userId); List<String> partyIds = new ArrayList<String>(); for (Map<String, Object> map : list) { partyIds.add(map.get("ID").toString()); } return partyIds; } public List<String> findUserIds(String userId) { String userSql = "select pe.ID as ID from PARTY_ENTITY pe,PARTY_TYPE type" + " where pe.TYPE_ID=type.ID and type.TYPE='1' and pe.REF=?"; List<Map<String, Object>> list = jdbcTemplate.queryForList(userSql, userId); List<String> partyIds = new ArrayList<String>(); for (Map<String, Object> map : list) { partyIds.add(map.get("ID").toString()); } return partyIds; } // ~ ================================================== public List<HumanTaskDTO> convertHumanTaskDtos( Collection<TaskInfo> taskInfos) { List<HumanTaskDTO> humanTaskDtos = new ArrayList<HumanTaskDTO>(); for (TaskInfo taskInfo : taskInfos) { humanTaskDtos.add(convertHumanTaskDto(taskInfo)); } return humanTaskDtos; } public HumanTaskDTO convertHumanTaskDto(TaskInfo taskInfo) { if (taskInfo == null) { return null; } HumanTaskDTO humanTaskDto = new HumanTaskDTO(); beanMapper.copy(taskInfo, humanTaskDto); if (taskInfo.getTaskInfo() != null) { humanTaskDto.setParentId(Long.toString(taskInfo.getTaskInfo() .getId())); } if (!taskInfo.getTaskInfos().isEmpty()) { List<HumanTaskDTO> children = this.convertHumanTaskDtos(taskInfo .getTaskInfos()); humanTaskDto.setChildren(children); } return humanTaskDto; } public void saveParticipant(ParticipantDTO participantDto) { TaskParticipant taskParticipant = new TaskParticipant(); taskParticipant.setRef(participantDto.getCode()); taskParticipant.setType(participantDto.getType()); taskParticipant.setTaskInfo(taskInfoManager.get(Long .parseLong(participantDto.getHumanTaskId()))); taskParticipantManager.save(taskParticipant); } // ~ ================================================== @Resource public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Resource public void setTaskInfoManager(TaskInfoManager taskInfoManager) { this.taskInfoManager = taskInfoManager; } @Resource public void setTaskParticipantManager( TaskParticipantManager taskParticipantManager) { this.taskParticipantManager = taskParticipantManager; } @Resource public void setTaskConfUserManager(TaskConfUserManager taskConfUserManager) { this.taskConfUserManager = taskConfUserManager; } @Resource public void setTaskDeadlineManager(TaskDeadlineManager taskDeadlineManager) { this.taskDeadlineManager = taskDeadlineManager; } @Resource public void setInternalProcessConnector( InternalProcessConnector internalProcessConnector) { this.internalProcessConnector = internalProcessConnector; } @Resource public void setTaskDefinitionConnector( TaskDefinitionConnector taskDefinitionConnector) { this.taskDefinitionConnector = taskDefinitionConnector; } @Resource public void setFormConnector(FormConnector formConnector) { this.formConnector = formConnector; } public void setHumanTaskListeners(List<HumanTaskListener> humanTaskListeners) { this.humanTaskListeners = humanTaskListeners; } }