package com.highdatas.mdm.service.act.impl; import com.highdatas.mdm.entity.TUser; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.history.HistoricVariableInstance; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.task.Task; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.*; @Slf4j @Service public class HistoryServiceImpl extends BaseServiceImpl implements com.highdatas.mdm.service.act.HistoryService{ @Autowired HistoryService historyService; @Autowired RepositoryService repositoryService; @Autowired TaskService taskService; public HistoricVariableInstance getRecentHistoryVariables(String key, String processId) { HistoricVariableInstance singleResult = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName(key).orderByVariableName().desc().singleResult(); return singleResult; } public List getHistoryVariables(String Key) { List list = historyService.createHistoricVariableInstanceQuery().variableName(Key).list(); return list; } @Override public ArrayList getHistoryAction(String workflowId) { ArrayList result = new ArrayList(); List list = historyService.createHistoricActivityInstanceQuery().processInstanceId(workflowId).list(); for (HistoricActivityInstance historicActivityInstance : list) { if (!historicActivityInstance.getActivityType().equalsIgnoreCase("exclusiveGateway")) { result.add(historicActivityInstance); } } return result; //resultPool.addValue(result); } @Override public List getMyHistotyApprove(String workflowId) { TUser onlineUser = getOnlineUser(); ArrayList result = new ArrayList(); List list = historyService.createHistoricActivityInstanceQuery().processInstanceId(workflowId).list(); for (HistoricActivityInstance historicActivityInstance : list) { if (!historicActivityInstance.getActivityType().equalsIgnoreCase("exclusiveGateway") ) { //TODO userType // if (onlineUser.getSysType().equalsIgnoreCase("DM") || (historicActivityInstance.getAssignee() != null && historicActivityInstance.getAssignee().equalsIgnoreCase(onlineUser.getUserId()))) { // result.add(historicActivityInstance.getProcessInstanceId()); // } } } return result; } @Override public boolean isTaskFinished(String processId) { if (processId.isEmpty()) { return true; } HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); Date endTime = instance.getEndTime(); String endActivityId = instance.getEndActivityId(); return (endActivityId!=null && !StringUtils.isEmpty(endActivityId) && endTime !=null); } @Override public void getTaskDetail(String processId) { String tableName = null; String userId = null; LinkedHashMap variableMap = new LinkedHashMap(); List list = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).list(); for (HistoricVariableInstance historicVariableInstance : list) { String variableName = historicVariableInstance.getVariableName(); if (variableName.equalsIgnoreCase("tablename")) { tableName = (String) historicVariableInstance.getValue(); continue; } if (variableName.equalsIgnoreCase("applyUserId")) { userId = (String) historicVariableInstance.getValue(); continue; } variableMap.put(variableName, String.valueOf(historicVariableInstance.getValue())); } //TODO db // if (tableName != null && userId != null) { // NamedSQL namedSQL = NamedSQL.getInstance("getLineById"); // namedSQL.setTableName(tableName); // namedSQL.setParam("fieldNameId", "user_id"); // namedSQL.setParam("id", "'"+userId+"'"); // Entity entity = SQLRunner.getEntity(namedSQL); // TableMeta tableMeta = entity.getTableMeta(); // List fields = tableMeta.getFields(); // for (Field field : fields) { // String fieldValue = entity.getString(field.getName()); // variableMap.put(field.getName(), fieldValue); // } // } //resultPool.addValue(variableMap); } @Override public void getAllTask() { List> result = new ArrayList>(); TUser user = getOnlineUser(); List unFinishedTaskList = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().list(); Map singleTask = null ; for (HistoricProcessInstance historicProcessInstance : unFinishedTaskList) { String userId = historicProcessInstance.getStartUserId(); if (user.getUserId().equalsIgnoreCase(userId)) { if (historicProcessInstance.getEndTime() == null) { Task Assigneetask = taskService.createTaskQuery().taskAssignee(userId).processInstanceId(historicProcessInstance.getId()).singleResult(); if (Assigneetask != null) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult(); singleTask = packageTaskInfo( Assigneetask, processDefinition); singleTask.put("status", "待办理"); } Task CandiDateTask = taskService.createTaskQuery().taskCandidateUser(userId).processInstanceId(historicProcessInstance.getId()).singleResult(); if (CandiDateTask != null) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult(); singleTask = packageTaskInfo( CandiDateTask, processDefinition); singleTask.put("status", "待接收"); } } else { String processDefinitionId = historicProcessInstance.getProcessDefinitionId(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult(); singleTask = packageTaskInfo(new SimpleDateFormat("yyyy-MM-dd hh:mm"),historicProcessInstance, processDefinition); singleTask.put("status", "已结束"); } result.add(singleTask); } } //resultPool.addValue("myUnFinishedTask", result, new TodoTaskWriter()); } @Override public List getHistoryTask() { TUser user = getOnlineUser(); List taskList = historyService.createHistoricTaskInstanceQuery().taskAssignee(user.getUserId()).list(); HashSet workflowIdSet = new HashSet<>(); for (HistoricTaskInstance historicTaskInstance : taskList) { String processInstanceId = historicTaskInstance.getProcessInstanceId(); workflowIdSet.add(processInstanceId); } List historicProcessInstances = historyService.createHistoricProcessInstanceQuery().processInstanceIds(workflowIdSet).list(); return historicProcessInstances; } @Override public List> getMyRunTask() { TUser onlineUser = getOnlineUser(); List> result = new ArrayList>(); List unFinishedTaskList = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().unfinished().list(); Map singleTask = null; for (HistoricProcessInstance historicProcessInstance : unFinishedTaskList) { String userId = historicProcessInstance.getStartUserId(); if (onlineUser.getUserId().equalsIgnoreCase(userId)) { Task Assigneetask = taskService.createTaskQuery().taskAssignee(userId).processInstanceId(historicProcessInstance.getId()).singleResult(); if (Assigneetask != null) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult(); singleTask = packageTaskInfo( Assigneetask, processDefinition); singleTask.put("status", "待办理"); } Task CandiDateTask = taskService.createTaskQuery().taskCandidateUser(userId).processInstanceId(historicProcessInstance.getId()).singleResult(); if (CandiDateTask != null) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult(); singleTask = packageTaskInfo( CandiDateTask, processDefinition); singleTask.put("status", "待接收"); } result.add(singleTask); } } return result; //resultPool.addValue("myUnFinishedTask", result, new TodoTaskWriter()); } public Map packageTaskInfo(SimpleDateFormat sdf, HistoricProcessInstance historicProcessInstance, ProcessDefinition processDefinition) { TUser user = getOnlineUser(); Map singleTask = new HashMap(); singleTask.put("sid", user.getUserId()); singleTask.put("id", historicProcessInstance.getId()); singleTask.put("name", "已结束"); singleTask.put("createTime", sdf.format(historicProcessInstance.getStartTime())); singleTask.put("pdname", processDefinition.getName()); singleTask.put("pdversion", Integer.toString(processDefinition.getVersion())); singleTask.put("pid", historicProcessInstance.getId()); return singleTask; } public Map packageTaskInfo(Task task, ProcessDefinition processDefinition) { Map singleTask = new HashMap(); Map taskVariables = taskService.getVariables(task.getId()); singleTask.put("sid", (String)taskVariables.get("applyUserId")); singleTask.put("id", task.getId()); singleTask.put("name", task.getName()); singleTask.put("isSuspension", String.valueOf(task.isSuspended())); singleTask.put("createTime", new SimpleDateFormat("yyyy-MM-dd hh:mm").format(task.getCreateTime())); singleTask.put("pdname", processDefinition.getName()); singleTask.put("pdversion", Integer.toString(processDefinition.getVersion())); singleTask.put("pid", task.getProcessInstanceId()); return singleTask; } }