package org.jeecg.modules.approval.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.FlowNode; import org.activiti.bpmn.model.SequenceFlow; import org.activiti.engine.*; import org.activiti.engine.history.*; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.runtime.Execution; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskInfo; import org.activiti.engine.task.TaskQuery; import org.activiti.image.ProcessDiagramGenerator; import org.apache.shiro.SecurityUtils; import org.jeecg.common.Constant; import org.jeecg.common.base.entity.BaseTaskEntity; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.utils.DictEnum; import org.jeecg.common.utils.DictModelConstant; import org.jeecg.common.utils.StringUtils; import org.jeecg.common.config.CustomProcessDiagramGenerator; import org.jeecg.modules.approval.model.dto.ApprovalOpinionDTO; import org.jeecg.modules.approval.model.vo.*; import org.jeecg.modules.approval.service.ApprovalService; import org.jeecg.modules.approval.service.ApprovalTaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.yaml.snakeyaml.Yaml; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.util.*; import java.util.stream.Collectors; /** * 任务处理实现 * * @author LEN */ @Service("actTaskService") @Slf4j public class ApprovalTaskServiceImpl implements ApprovalTaskService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private RepositoryService repositoryService; @Autowired private HistoryService historyService; @Autowired private ProcessEngine processEngine; @Autowired private ApprovalService approvalService; /** * 待处理任务 * * @return * @param */ @Override public IPage listMyTask(Integer pageNo, Integer pageSize,HttpServletRequest req) { Map parms = req.getParameterMap(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String tenantId = req.getHeader("tenant-id"); TaskQuery taskQuery = taskService.createTaskQuery() .taskCandidateOrAssigned(sysUser.getId()) .includeProcessVariables() .orderByTaskCreateTime() .taskTenantId(tenantId) .desc(); if(parms !=null){ String[] keys = parms.get("approveName"); if (!"".equals(keys) && keys != null) { String key = keys[0]; //taskQuery.taskName(key); taskQuery.processDefinitionName(key); } } List taskList = taskQuery.listPage((pageNo - 1) * pageSize, pageSize); List tasks = new ArrayList<>(); for (Task task : taskList) { Map map = task.getProcessVariables(); BaseTaskEntity baseTaskEntity = JSON.parseObject(map.get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); TaskVO taskVO = new TaskVO(task); taskVO.setUserName(baseTaskEntity.getUserName()); taskVO.setRemarks(baseTaskEntity.getRemarks()); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); taskVO.setCreateTime(task.getCreateTime()); Map param = baseTaskEntity.getParam(); if (StringUtils.isNotEmpty(param)) { taskVO.setParam(param); } tasks.add(taskVO); } IPage page = new Page<>(pageNo, pageSize); page.setTotal((int) taskQuery.count()); return page.setRecords(tasks); } /** * 已处理任务列表 * * @param * @return */ @Override public IPage listMyProcessedTask(Integer pageNo,Integer pageSize,HttpServletRequest req) { String tenantId = req.getHeader("tenant-id"); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = sysUser.getId(); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .taskAssignee(userId) .finished() .taskTenantId(tenantId) .includeProcessVariables() .orderByTaskCreateTime() .desc(); String[] keys = req.getParameterMap().get("approveName"); if (!"".equals(keys) && keys != null) { String key = keys[0]; historicTaskInstanceQuery.processDefinitionName(key); } List taskList = historicTaskInstanceQuery.listPage((pageNo - 1) * pageSize, pageSize); List tasks = new ArrayList<>(); for (HistoricTaskInstance task : taskList) { Map variables = task.getProcessVariables(); BaseTaskEntity baseTaskEntity = JSONObject .parseObject(variables.get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); HistoryTaskVO taskVO = new HistoryTaskVO(task); taskVO.setUserName(baseTaskEntity.getUserName()); taskVO.setRemarks(baseTaskEntity.getRemarks()); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); if (StringUtils.isNotEmpty(baseTaskEntity.getResult())) { taskVO.setResultStr(DictEnum.getValue(DictModelConstant.MODEL_APPLY, DictModelConstant.MODEL_APPLY_RESULT, baseTaskEntity.getResult())); } Map param = baseTaskEntity.getParam(); if (StringUtils.isNotEmpty(param)) { taskVO.setParam(param); } //我审批的结果 Object opinionStr = variables.get(Constant.ACT_APPLY_OPINION_LIST); if (null != opinionStr) { List approvalOpinionVOS = JSONArray .parseArray(opinionStr.toString(), ApprovalOpinionVO.class); for (ApprovalOpinionVO approvalOpinionVO : approvalOpinionVOS) { if (task.getId().equals(approvalOpinionVO.getTaskId()) && approvalOpinionVO.getOpId().equals(userId)) { taskVO.setResult(approvalOpinionVO.getFlag()); } } } tasks.add(taskVO); } IPage page = new Page<>(pageNo,pageSize); page.setTotal((int) historicTaskInstanceQuery.count()); return page.setRecords(tasks); } /** * 我发起的流程 * * @return * processInstanceTenantId(UserUtils.getTenantId()) */ @Override public IPage listApprovalMyStarted(Integer pageNo, Integer pageSize, HttpServletRequest req) { //获取当前登录人 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String tenantId = req.getHeader("tenant-id"); HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() .startedBy(sysUser.getId()) .orderByProcessInstanceStartTime() .processInstanceTenantId(tenantId) .desc() .includeProcessVariables(); List processInstances = historicProcessInstanceQuery.listPage((pageNo - 1) * pageSize, pageSize); List tasks = Lists.newArrayList(); for (HistoricProcessInstance processInstance : processInstances) { BaseTaskEntity baseTaskEntity = JSONObject .parseObject(processInstance.getProcessVariables().get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); HistoryTaskVO taskVO = new HistoryTaskVO(); taskVO.setId(processInstance.getId()); taskVO.setProcessInstanceId(processInstance.getId()); taskVO.setTaskNodeName(""); taskVO.setCreateTime(processInstance.getStartTime()); taskVO.setProcessDefinitionId(processInstance.getProcessDefinitionId()); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setUserName(baseTaskEntity.getUserName()); taskVO.setRemarks(baseTaskEntity.getRemarks()); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); Map param = baseTaskEntity.getParam(); if (StringUtils.isNotEmpty(param)) { taskVO.setParam(param); } //判断流程是否结束 wrapperInfoByProcessStatus(processInstance, taskVO); tasks.add(taskVO); } IPage page = new Page<>(pageNo,pageSize); page.setTotal(historicProcessInstanceQuery.count()); page.setRecords(tasks); return page; } private void wrapperInfoByProcessStatus(HistoricProcessInstance processInstance, HistoryTaskVO taskVO) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); ProcessInstance pi = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstance.getId()) .processInstanceTenantId(processInstance.getTenantId()) .singleResult(); if (null == pi) { Object flagObj = processInstance.getProcessVariables().get(Constant.ACT_TASK_FLAG); String flag = ""; String result = DictEnum.APPLY_RESULT_PROCESSING.getKey(); if (null == flagObj) { result = DictEnum.APPLY_RESULT_CANCEL.getKey(); } else { flag = flagObj.toString(); } if (DictEnum.Apply_APPROVAL_OPINION_REFUSE.getKey().equals(flag)) { result = DictEnum.APPLY_RESULT_REFUSE.getKey(); } else if (DictEnum.Apply_APPROVAL_OPINION_AGREE.getKey().equals(flag)) { result = DictEnum.APPLY_RESULT_AGREE.getKey(); } else if (DictEnum.APPLY_APPROVAL_OPINION_ABANDON.getKey().equals(flag)) { result = DictEnum.APPLY_RESULT_CANCEL.getKey(); } else if (DictEnum.APPLY_APPROVAL_OPINION_CONFIRM.getKey().equals(flag)) { result = DictEnum.APPLY_RESULT_AGREE.getKey(); } taskVO.setResult(result); if (StringUtils.isNotEmpty(result)) { taskVO.setResultStr(DictEnum.getValue(DictModelConstant.MODEL_APPLY, DictModelConstant.MODEL_APPLY_RESULT, result)); } taskVO.setId(""); taskVO.setFinished(true); } else { taskVO.setFinished(false); TaskQuery taskQuery = taskService.createTaskQuery() .processInstanceId(processInstance.getId()); List list = taskQuery.list(); for (Task task : list) { if (null != task) { taskVO.setId(task.getId()); taskVO.setTaskNodeName(task.getName()); taskVO.setAssignee(task.getAssignee()); } } } } /** * 任务明细 * * @param taskId * @return */ @Override public Object getTask(String taskId) { Map variables = taskService.getVariables(taskId); BaseTaskEntity baseTask = (BaseTaskEntity) variables.get(Constant.ACT_BASE_TASK); return baseTask; } /** * 追踪流程图片 * * @param processInstanceId * @return * @throws Exception */ @Override public byte[] getProcessImage(String processInstanceId) throws Exception { // 获取历史流程实例 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (historicProcessInstance == null) { throw new Exception(); } else { // 获取流程定义 ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService .getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); // 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序 List historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId) .orderByHistoricActivityInstanceId().desc().list(); // 已执行的节点ID集合 List executedActivityIdList = new ArrayList<>(); for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { if ("userTask".equals(activityInstance.getActivityType()) && StringUtils.isNull(activityInstance.getEndTime())) { executedActivityIdList.add(activityInstance.getActivityId() + "#"); } else { executedActivityIdList.add(activityInstance.getActivityId()); } } // 获取流程图图像字符流 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); // 通过流程实例ID获取流程中 正在执行的节点 List runningActivitiIdList = new ArrayList(); List runningActivityInstanceList = getRunningActivityInst(processInstanceId); for (Execution execution : runningActivityInstanceList) { if (StringUtils.isNotEmpty(execution.getActivityId())) { runningActivitiIdList.add(execution.getActivityId()); } } // 已执行flow的集和 List executedFlowIdList = getHighLightedFlows(bpmnModel, historicActivityInstanceList); // 定义流程画布生成器 // 如果完成,流程图高亮颜色为绿色,如果没有已经完成为红色 ProcessDiagramGenerator processDiagramGenerator = new CustomProcessDiagramGenerator(); // 使用默认配置获得流程图表生成器,并生成追踪图片字符流 InputStream imageStream = ((CustomProcessDiagramGenerator) processDiagramGenerator) .generateDiagramCustom(bpmnModel, "png", executedActivityIdList, runningActivitiIdList, executedFlowIdList, "宋体", "微软雅黑", "黑体", null, 2.0); // 将InputStream数据流转换为byte[] byte[] buffer = new byte[imageStream.available()]; imageStream.read(buffer); imageStream.close(); return buffer; } } /** * Desc: 通过流程实例ID获取流程中正在执行的节点 * * @param procInstId * @return * @author liuxz */ public List getRunningActivityInst(String procInstId) { return runtimeService.createExecutionQuery().processInstanceId(procInstId).list(); } /** * 获取已经流转的线 * * @param bpmnModel * @param historicActivityInstances * @return */ private static List getHighLightedFlows(BpmnModel bpmnModel, List historicActivityInstances) { // 高亮流程已发生流转的线id集合 List highLightedFlowIds = new ArrayList<>(); // 全部活动节点 List historicActivityNodes = new ArrayList<>(); // 已完成的历史活动节点 List finishedActivityInstances = new ArrayList<>(); for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true); historicActivityNodes.add(flowNode); if (historicActivityInstance.getEndTime() != null) { finishedActivityInstances.add(historicActivityInstance); } } FlowNode currentFlowNode = null; FlowNode targetFlowNode = null; // 遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的 for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) { // 获得当前活动对应的节点信息及outgoingFlows信息 currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true); List sequenceFlows = currentFlowNode.getOutgoingFlows(); /** * 遍历outgoingFlows并找到已已流转的 满足如下条件认为已已流转: 1.当前节点是并行网关或兼容网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转 * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最早的流转节点视为有效流转 */ if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) { // 遍历历史活动节点,找到匹配流程目标节点的 for (SequenceFlow sequenceFlow : sequenceFlows) { targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true); if (historicActivityNodes.contains(targetFlowNode)) { highLightedFlowIds.add(targetFlowNode.getId()); } } } else { List> tempMapList = new ArrayList<>(); for (SequenceFlow sequenceFlow : sequenceFlows) { for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) { Map map = new HashMap<>(); map.put("highLightedFlowId", sequenceFlow.getId()); map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime()); tempMapList.add(map); } } } if (!CollectionUtils.isEmpty(tempMapList)) { // 遍历匹配的集合,取得开始时间最早的一个 long earliestStamp = 0L; String highLightedFlowId = null; for (Map map : tempMapList) { long highLightedFlowStartTime = Long.valueOf(map.get("highLightedFlowStartTime").toString()); if (earliestStamp == 0 || earliestStamp >= highLightedFlowStartTime) { highLightedFlowId = map.get("highLightedFlowId").toString(); earliestStamp = highLightedFlowStartTime; } } highLightedFlowIds.add(highLightedFlowId); } } } return highLightedFlowIds; } @Override public long countUnprocessed() { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); return taskService.createTaskQuery(). taskCandidateOrAssigned(sysUser.getId()) .count(); } @Override public long countMyStarted() { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); return historyService.createHistoricProcessInstanceQuery() .startedBy(sysUser.getId()) .count(); } /** * 我审批的 * * @param * @param param * @return */ @Override public IPage listApiMyApproval(Map params, ApprovalTaskQueryVo param) { int pageNo = Integer.parseInt( params.get("pageNo")); int pageSize = Integer.parseInt( params.get("pageSize")); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String formType = param.getFormType(); String status = param.getStatus(); boolean processed = param.isProcessed(); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery(); historicTaskInstanceQuery .includeProcessVariables() .taskAssignee(sysUser.getId()) .orderByTaskCreateTime() .desc(); if (StringUtils.isNotEmpty(formType)) { historicTaskInstanceQuery.processInstanceBusinessKeyLikeIgnoreCase(formType + "/%"); } if (processed) { historicTaskInstanceQuery.finished(); //流程状态 if (StringUtils.isNotEmpty(status)) { if (Constant.ACT_TASK_QUERY_STATUS_RUN.equals(status)) { historicTaskInstanceQuery.processUnfinished(); } else if (Constant.ACT_TASK_STATUS_END.equals(status)) { historicTaskInstanceQuery.processFinished(); } } } else { historicTaskInstanceQuery.unfinished(); } List taskList = historicTaskInstanceQuery .listPage( (pageNo - 1) * pageSize, pageSize); List tasks = new ArrayList<>(); HistoryTaskVO taskVO = null; for (HistoricTaskInstance task : taskList) { BaseTaskEntity baseTaskEntity = JSONObject .parseObject(task.getProcessVariables().get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); taskVO = new HistoryTaskVO(task); taskVO.setUserName(baseTaskEntity.getUserName()); taskVO.setRemarks(baseTaskEntity.getRemarks()); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); //我审批的结果 Object o = task.getProcessVariables().get(Constant.ACT_APPLY_OPINION_LIST); if (null != o) { List approvalOpinionVOS = JSONArray .parseArray(o.toString(), ApprovalOpinionVO.class); for (ApprovalOpinionVO approvalOpinionVO : approvalOpinionVOS) { if (task.getId().equals(approvalOpinionVO.getTaskId()) && approvalOpinionVO.getOpId().equals(sysUser.getId())) { taskVO.setResult(approvalOpinionVO.getFlag()); taskVO.setResultStr(DictEnum.getValue(DictModelConstant.MODEL_APPLY,DictModelConstant.MODEL_APPLY_APPROVAL_OPINION_FLAG,approvalOpinionVO.getFlag())); } } } //流程是否结束标识 taskVO.setFinished(!approvalService.getApprovalStatus(task.getProcessInstanceId())); tasks.add(taskVO); } IPage page = new Page(pageNo, pageSize); page.setTotal(historicTaskInstanceQuery.count()); return page.setRecords(tasks); } /** * 我发起的 * * @param * @param param * @return */ @Override public IPage listApiMyStarted(Map params, ApprovalTaskQueryVo param) { int pageNo = Integer.parseInt( params.get("pageNo")); int pageSize = Integer.parseInt( params.get("pageSize")); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String status = param.getStatus(); String formType = param.getFormType(); //我发起的 HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery(); historicProcessInstanceQuery .includeProcessVariables() .startedBy(sysUser.getId()) .orderByProcessInstanceStartTime() .desc(); List tasks = new ArrayList<>(); if (StringUtils.isNotEmpty(formType)) { List list = historyService.createHistoricTaskInstanceQuery() .processInstanceBusinessKeyLike(formType + "/%") .list(); Set collect = list.stream().map(TaskInfo::getProcessInstanceId).collect(Collectors.toSet()); if (StringUtils.isNotEmpty(collect)) { historicProcessInstanceQuery.processInstanceIds(collect); } else { IPage page = new Page(pageNo, pageSize); page.setTotal(0); } } if (StringUtils.isNotEmpty(status)) { if (status.equals(Constant.ACT_TASK_STATUS_END)) { historicProcessInstanceQuery.finished(); } else if (status.equals(Constant.ACT_TASK_QUERY_STATUS_RUN)) { historicProcessInstanceQuery.unfinished(); } } List processInstances = historicProcessInstanceQuery .listPage((pageNo - 1) * pageSize, pageSize); for (HistoricProcessInstance processInstance : processInstances) { BaseTaskEntity baseTaskEntity = JSONObject .parseObject(processInstance.getProcessVariables().get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); HistoryTaskVO taskVO = new HistoryTaskVO(); taskVO.setId(processInstance.getId()); taskVO.setProcessInstanceId(processInstance.getId()); taskVO.setTaskNodeName(""); taskVO.setCreateTime(processInstance.getStartTime()); taskVO.setProcessDefinitionId(processInstance.getProcessDefinitionId()); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setUserName(baseTaskEntity.getUserName()); taskVO.setRemarks(baseTaskEntity.getRemarks()); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); //我发起的流程审批结果 if (status.equals(Constant.ACT_TASK_STATUS_END)) { taskVO.setResult(processInstance.getProcessVariables().get(Constant.ACT_TASK_FLAG).toString()); taskVO.setFinished(true); } else { wrapperInfoByProcessStatus(processInstance, taskVO); } tasks.add(taskVO); } IPage page = new Page(pageNo, pageSize); page.setTotal(historicProcessInstanceQuery.count()); return page.setRecords(tasks); } @Override public TaskVO getMyApprovalTask(String processInstanceId) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); Task task = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskCandidateOrAssigned(sysUser.getId()) .includeProcessVariables() .singleResult(); if (task == null) { return null; } TaskVO taskVO = new TaskVO(task); Map processVariableMap = task.getProcessVariables(); BaseTaskEntity baseTaskEntity = JSONObject.parseObject(processVariableMap.get(Constant.ACT_BASE_TASK).toString(), BaseTaskEntity.class); taskVO.setTaskUrl(String.format("%s/%s", baseTaskEntity.getFormKey(), baseTaskEntity.getId())); taskVO.setProcessDefinitionKey(baseTaskEntity.getProcessKey()); taskVO.setProcessDefinitionName(baseTaskEntity.getProcessInstanceName()); taskVO.setApproveName(DictEnum.getValue(DictModelConstant.MODEL_APPLY_CONFIG, DictModelConstant.MODEL_APPLY_CONFIG_FORMKEY, baseTaskEntity.getFormKey())); return taskVO; } @Override public List listOpinionsByPId(String processInstanceId) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .includeProcessVariables() .singleResult(); if (historicProcessInstance == null) { return Lists.newArrayList(); } Map processVariables = historicProcessInstance.getProcessVariables(); Object obj = processVariables.get(Constant.ACT_APPLY_OPINION_LIST); if (StringUtils.isNull(obj)) { return Lists.newArrayList(); } List approvalOpinionDTOS = JSONArray.parseArray(obj.toString(), ApprovalOpinionDTO.class); for (ApprovalOpinionDTO approvalOpinionDTO : approvalOpinionDTOS) { approvalOpinionDTO.setFlagStr(DictEnum.getValue(DictModelConstant.MODEL_APPLY, DictModelConstant.MODEL_APPLY_APPROVAL_OPINION_FLAG, approvalOpinionDTO.getFlag())); } //获取审批结果 并修改样式 for (ApprovalOpinionDTO approvalOpinionDTO : approvalOpinionDTOS) { if (StringUtils.isEmpty(approvalOpinionDTO.getFlagStr())) { approvalOpinionDTO.setFlagStr(DictEnum.getValue(DictModelConstant.MODEL_APPLY, DictModelConstant.MODEL_APPLY_APPROVAL_OPINION_FLAG, approvalOpinionDTO.getFlag())); } List rejectStyle = Lists.newArrayList(DictEnum.Apply_APPROVAL_OPINION_REFUSE.getKey(), DictEnum.APPLY_APPROVAL_OPINION_REJECT.getKey(), DictEnum.APPLY_APPROVAL_OPINION_ABANDON.getKey()); String style= rejectStyle.contains(approvalOpinionDTO.getFlag())?"error":"success"; approvalOpinionDTO.setStyle(style); } return approvalOpinionDTOS; } }