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<HistoricVariableInstance> getHistoryVariables(String Key) { List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().variableName(Key).list(); return list; } @Override public ArrayList<HistoricActivityInstance> getHistoryAction(String workflowId) { ArrayList<HistoricActivityInstance> result = new ArrayList<HistoricActivityInstance>(); List<HistoricActivityInstance> 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<String> getMyHistotyApprove(String workflowId) { TUser onlineUser = getOnlineUser(); ArrayList<String> result = new ArrayList<String>(); List<HistoricActivityInstance> 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<String,String> variableMap = new LinkedHashMap<String, String>(); List<HistoricVariableInstance> 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<Field> 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<Map<String, String>> result = new ArrayList<Map<String, String>>(); TUser user = getOnlineUser(); List<HistoricProcessInstance> unFinishedTaskList = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().list(); Map<String, String> 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<HistoricProcessInstance> getHistoryTask() { TUser user = getOnlineUser(); List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery().taskAssignee(user.getUserId()).list(); HashSet<String> workflowIdSet = new HashSet<>(); for (HistoricTaskInstance historicTaskInstance : taskList) { String processInstanceId = historicTaskInstance.getProcessInstanceId(); workflowIdSet.add(processInstanceId); } List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().processInstanceIds(workflowIdSet).list(); return historicProcessInstances; } @Override public List<Map<String, String>> getMyRunTask() { TUser onlineUser = getOnlineUser(); List<Map<String, String>> result = new ArrayList<Map<String, String>>(); List<HistoricProcessInstance> unFinishedTaskList = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().unfinished().list(); Map<String, String> 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<String, String> packageTaskInfo(SimpleDateFormat sdf, HistoricProcessInstance historicProcessInstance, ProcessDefinition processDefinition) { TUser user = getOnlineUser(); Map<String, String> singleTask = new HashMap<String, String>(); 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<String, String> packageTaskInfo(Task task, ProcessDefinition processDefinition) { Map<String, String> singleTask = new HashMap<String, String>(); Map<String,Object> 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; } }