From 0b1638d7a985ded9eabe369db5aede2822360e62 Mon Sep 17 00:00:00 2001 From: Yen Date: Mon, 22 Aug 2022 16:37:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=81=E7=A8=8B=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/IFlowInstanceService.java | 59 +++ .../modules/bpm/service/IFlowTaskService.java | 158 ++++++ .../impl/IFlowInstanceServiceImpl.java | 116 +++++ .../service/impl/IFlowTaskServiceImpl.java | 448 ++++++++++++++++++ 4 files changed, 781 insertions(+) create mode 100644 src/main/java/com/qs/serve/modules/bpm/service/IFlowInstanceService.java create mode 100644 src/main/java/com/qs/serve/modules/bpm/service/IFlowTaskService.java create mode 100644 src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowInstanceServiceImpl.java create mode 100644 src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowTaskServiceImpl.java diff --git a/src/main/java/com/qs/serve/modules/bpm/service/IFlowInstanceService.java b/src/main/java/com/qs/serve/modules/bpm/service/IFlowInstanceService.java new file mode 100644 index 0000000..c798e59 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/service/IFlowInstanceService.java @@ -0,0 +1,59 @@ +package com.qs.serve.modules.bpm.service; + +import com.qs.serve.modules.bpm.entity.vo.FlowTaskVo; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.task.api.Task; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例服务 + * @author YenHex + * @since 2022/8/22 + */ +public interface IFlowInstanceService { + + List queryListByInstanceId(String instanceId); + + /** + * 结束流程实例 + * + * @param vo + */ + void stopProcessInstance(FlowTaskVo vo); + + /** + * 激活或挂起流程实例 + * + * @param state 状态 + * @param instanceId 流程实例ID + */ + void updateState(Integer state, String instanceId); + + /** + * 删除流程实例ID + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + void delete(String instanceId, String deleteReason); + + /** + * 根据实例ID查询历史实例数据 + * + * @param processInstanceId + * @return + */ + HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId); + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + void startProcessInstanceById(String procDefId, Map variables); + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/service/IFlowTaskService.java b/src/main/java/com/qs/serve/modules/bpm/service/IFlowTaskService.java new file mode 100644 index 0000000..218b009 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/service/IFlowTaskService.java @@ -0,0 +1,158 @@ +package com.qs.serve.modules.bpm.service; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.bpm.entity.vo.FlowTaskVo; +import org.flowable.task.api.Task; + +/** + * 任务服务层 + * @author YenHex + * @since 2022/8/22 + */ +public interface IFlowTaskService { + + /** + * 审批任务 + * @param task 请求实体参数 + */ + R complete(FlowTaskVo task); + + /** + * 驳回任务 + * + * @param flowTaskVo + */ + void taskReject(FlowTaskVo flowTaskVo); + + + /** + * 退回任务 + * + * @param flowTaskVo 请求实体参数 + */ + void taskReturn(FlowTaskVo flowTaskVo); + + /** + * 获取所有可回退的节点 + * + * @param flowTaskVo + * @return + */ + R findReturnTaskList(FlowTaskVo flowTaskVo); + + /** + * 删除任务 + * + * @param flowTaskVo 请求实体参数 + */ + void deleteTask(FlowTaskVo flowTaskVo); + + /** + * 认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void claim(FlowTaskVo flowTaskVo); + + /** + * 取消认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void unClaim(FlowTaskVo flowTaskVo); + + /** + * 委派任务 + * + * @param flowTaskVo 请求实体参数 + */ + void delegateTask(FlowTaskVo flowTaskVo); + + + /** + * 转办任务 + * + * @param flowTaskVo 请求实体参数 + */ + void assignTask(FlowTaskVo flowTaskVo); + + /** + * 我发起的流程 + * @param pageNum + * @param pageSize + * @return + */ + R myProcess(Integer pageNum, Integer pageSize); + + /** + * 取消申请 + * @param flowTaskVo + * @return + */ + R stopProcess(FlowTaskVo flowTaskVo); + + /** + * 撤回流程 + * @param flowTaskVo + * @return + */ + R revokeProcess(FlowTaskVo flowTaskVo); + + + /** + * 代办任务列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return + */ + R todoList(Integer pageNum, Integer pageSize); + + + /** + * 已办任务列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return + */ + R finishedList(Integer pageNum, Integer pageSize); + + /** + * 流程历史流转记录 + * + * @param procInsId 流程实例Id + * @return + */ + R flowRecord(String procInsId,String deployId); + + /** + * 根据任务ID查询挂载的表单信息 + * + * @param taskId 任务Id + * @return + */ + Task getTaskForm(String taskId); + + + /** + * 获取流程执行过程 + * @param procInsId + * @return + */ + R getFlowViewer(String procInsId,String executionId); + + /** + * 获取流程变量 + * @param taskId + * @return + */ + R processVariables(String taskId); + + /** + * 获取下一节点 + * @param flowTaskVo 任务 + * @return + */ + R getNextFlowNode(FlowTaskVo flowTaskVo); +} diff --git a/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowInstanceServiceImpl.java b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowInstanceServiceImpl.java new file mode 100644 index 0000000..3bb760f --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowInstanceServiceImpl.java @@ -0,0 +1,116 @@ +package com.qs.serve.modules.bpm.service.impl; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.modules.bpm.conf.FlowServiceFactory; +import com.qs.serve.modules.bpm.entity.vo.FlowTaskVo; +import com.qs.serve.modules.bpm.service.IFlowInstanceService; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author YenHex + * @since 2022/8/22 + */ +@Service +@Slf4j +public class IFlowInstanceServiceImpl extends FlowServiceFactory implements IFlowInstanceService { + + @Override + public List queryListByInstanceId(String instanceId) { + List list = taskService.createTaskQuery().processInstanceId(instanceId).active().list(); + return list; + } + + /** + * 结束流程实例 + * @param vo + */ + @Override + public void stopProcessInstance(FlowTaskVo vo) { + String taskId = vo.getTaskId(); + //结束流程实例 + } + + /** + * 激活或挂起流程实例 + * @param state 状态 + * @param instanceId 流程实例ID + */ + @Override + public void updateState(Integer state, String instanceId) { + // 激活 + if (state == 1) { + runtimeService.activateProcessInstanceById(instanceId); + } + // 挂起 + if (state == 2) { + runtimeService.suspendProcessInstanceById(instanceId); + } + } + + /** + * 删除流程实例ID + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String instanceId, String deleteReason) { + // 查询历史数据 + HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId); + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + return; + } + // 删除流程实例 + runtimeService.deleteProcessInstance(instanceId, deleteReason); + // 删除历史流程实例 + historyService.deleteHistoricProcessInstance(instanceId); + } + + /** + * 根据实例ID查询历史实例数据 + * @param processInstanceId + * @return + */ + @Override + public HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId) { + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (Objects.isNull(historicProcessInstance)) { + throw new FlowableObjectNotFoundException("流程实例不存在: " + processInstanceId); + } + return historicProcessInstance; + } + + /** + * 根据流程定义ID启动流程实例 + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + @Override + public void startProcessInstanceById(String procDefId, Map variables) { + try { + // 设置流程发起人Id到流程中 + String userId = AuthContextUtils.getSysUserId(); + variables.put("initiator",userId); + variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); + runtimeService.startProcessInstanceById(procDefId, variables); + } catch (Exception e) { + e.printStackTrace(); + } + Assert.throwEx("启动流程失败"); + } + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowTaskServiceImpl.java b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowTaskServiceImpl.java new file mode 100644 index 0000000..5c5942c --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowTaskServiceImpl.java @@ -0,0 +1,448 @@ +package com.qs.serve.modules.bpm.service.impl; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bpm.common.enums.FlowComment; +import com.qs.serve.modules.bpm.common.util.FlowableUtils; +import com.qs.serve.modules.bpm.conf.FlowServiceFactory; +import com.qs.serve.modules.bpm.entity.dto.FlowTaskDto; +import com.qs.serve.modules.bpm.entity.vo.FlowTaskVo; +import com.qs.serve.modules.bpm.service.IFlowTaskService; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.common.engine.api.query.QueryProperty; +import org.flowable.common.engine.impl.identity.Authentication; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.ActivityInstanceQueryProperty; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ActivityInstance; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.task.Comment; +import org.flowable.identitylink.api.history.HistoricIdentityLink; +import org.flowable.image.ProcessDiagramGenerator; +import org.flowable.task.api.DelegationState; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.Collection; +import java.util.Objects; + +/** + * @author YenHex + * @since 2022/8/22 + */ +@Slf4j +@Service +@AllArgsConstructor +public class IFlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService { + + private final SysUserService sysUserService; + private final SysDeptService sysDeptService; + + /** + * 完成任务 + * @param taskVo + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R complete(FlowTaskVo taskVo) { + Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + return R.error("任务不存在"); + } + if (DelegationState.PENDING.equals(task.getDelegationState())) { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); + taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); + } else { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); + String userId = AuthContextUtils.getSysUserId(); + taskService.setAssignee(taskVo.getTaskId(), userId); + taskService.complete(taskVo.getTaskId(), taskVo.getValues()); + } + return R.ok(); + } + + /** + * TODO 驳回任务 + * @param flowTaskVo + */ + @Override + public void taskReject(FlowTaskVo flowTaskVo) { + if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { + Assert.throwEx("任务处于挂起状态"); + } + } + + /** + * 退回任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + public void taskReturn(FlowTaskVo flowTaskVo) { + + } + + /** + * 获取所有可回退的节点 + * @param flowTaskVo + * @return + */ + @Override + public R findReturnTaskList(FlowTaskVo flowTaskVo) { + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息,暂不考虑子流程情况 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + Collection flowElements = process.getFlowElements(); + // 获取当前任务节点元素 + UserTask source = null; + if (flowElements != null) { + for (FlowElement flowElement : flowElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = (UserTask) flowElement; + } + } + } + // 获取节点的所有路线 + List> roads = FlowableUtils.findRoad(source, null, null, null); + // 可回退的节点列表 + List userTaskList = new ArrayList<>(); + for (List road : roads) { + if (userTaskList.size() == 0) { + // 还没有可回退节点直接添加 + userTaskList = road; + } else { + // 如果已有回退节点,则比对取交集部分 + userTaskList.retainAll(road); + } + } + return R.ok(userTaskList); + } + + /** + * 删除任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + public void deleteTask(FlowTaskVo flowTaskVo) { + // todo 待确认删除任务是物理删除任务 还是逻辑删除,让这个任务直接通过? + taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); + } + + /** + * 认领/签收任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void claim(FlowTaskVo flowTaskVo) { + taskService.claim(flowTaskVo.getTaskId(), flowTaskVo.getUserId()); + } + + /** + * 取消认领/签收任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void unClaim(FlowTaskVo flowTaskVo) { + taskService.unclaim(flowTaskVo.getTaskId()); + } + + /** + * 委派任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delegateTask(FlowTaskVo flowTaskVo) { + taskService.delegateTask(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); + } + + /** + * 转办任务 + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void assignTask(FlowTaskVo flowTaskVo) { + taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getComment()); + } + + @Override + public R myProcess(Integer pageNum, Integer pageSize) { + Page page = new Page<>(); + String userId = AuthContextUtils.getSysUserId(); + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .startedBy(userId) + .orderByProcessInstanceStartTime() + .desc(); + List historicProcessInstances = historicProcessInstanceQuery.listPage(pageSize * (pageNum - 1), pageSize); + page.setTotal(historicProcessInstanceQuery.count()); + List flowList = new ArrayList<>(); + for (HistoricProcessInstance hisIns : historicProcessInstances) { + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setCreateTime(hisIns.getStartTime()); + flowTask.setFinishTime(hisIns.getEndTime()); + flowTask.setProcInsId(hisIns.getId()); + // 计算耗时 + if (Objects.nonNull(hisIns.getEndTime())) { + long time = hisIns.getEndTime().getTime() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } else { + long time = System.currentTimeMillis() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(hisIns.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setCategory(pd.getCategory()); + flowTask.setProcDefVersion(pd.getVersion()); + // 当前所处流程 todo: 本地启动放开以下注释 +// List taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); +// if (CollectionUtils.isNotEmpty(taskList)) { +// flowTask.setTaskId(taskList.get(0).getId()); +// } else { +// List historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); +// flowTask.setTaskId(historicTaskInstance.get(0).getId()); +// } + flowList.add(flowTask); + } + page.setRecords(flowList); + return R.ok(page); + } + + /** + * 取消申请 + * @param flowTaskVo + * @return + */ + @Override + public R stopProcess(FlowTaskVo flowTaskVo) { + List task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list(); + if (CollectionUtil.isEmpty(task)) { + Assert.throwEx("流程未启动或已执行完成,取消申请失败"); + } + // 获取当前需撤回的流程实例 + ProcessInstance processInstance = + runtimeService.createProcessInstanceQuery() + .processInstanceId(flowTaskVo.getInstanceId()) + .singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); + if (Objects.nonNull(bpmnModel)) { + Process process = bpmnModel.getMainProcess(); + List endNodes = process.findFlowElementsOfType(EndEvent.class, false); + if (CollectionUtil.isNotEmpty(endNodes)) { + //SysUser loginUser = AuthContextUtils.getSysUserId(); + Authentication.setAuthenticatedUserId(AuthContextUtils.getSysUserId()); +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), +// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment()); + // 获取当前流程最后一个节点 + String endId = endNodes.get(0).getId(); + List executions = + runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list(); + List executionIds = new ArrayList<>(); + executions.forEach(execution -> executionIds.add(execution.getId())); + // 变更流程为已结束状态 + runtimeService.createChangeActivityStateBuilder() + .moveExecutionsToSingleActivityId(executionIds, endId).changeState(); + } + } + return R.ok(); + } + + @Override + public R revokeProcess(FlowTaskVo flowTaskVo) { + Task task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); + if (task == null) { + Assert.throwEx("流程未启动或已执行完成,无法撤回"); + } + String userId = AuthContextUtils.getSysUserId(); + List htiList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .orderByTaskCreateTime() + .asc() + .list(); + String myTaskId = null; + HistoricTaskInstance myTask = null; + for (HistoricTaskInstance hti : htiList) { + if (userId.equals(hti.getAssignee())) { + myTaskId = hti.getId(); + myTask = hti; + break; + } + } + if (null == myTaskId) { + Assert.throwEx("该任务非当前用户提交,无法撤回"); + } + String processDefinitionId = myTask.getProcessDefinitionId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + //变量 +// Map variables = runtimeService.getVariableInstances(currentTask.getExecutionId()); + String myActivityId = null; + List haiList = historyService.createHistoricActivityInstanceQuery() + .executionId(myTask.getExecutionId()).finished().list(); + for (HistoricActivityInstance hai : haiList) { + if (myTaskId.equals(hai.getTaskId())) { + myActivityId = hai.getActivityId(); + break; + } + } + FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId); + Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); + String activityId = execution.getActivityId(); + FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); + //TODO 记录原活动方向 + List oriSequenceFlows = new ArrayList<>(flowNode.getOutgoingFlows()); + return R.ok(); + } + + /** + * 代办任务列表 + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return + */ + @Override + public R todoList(Integer pageNum, Integer pageSize) { + Page page = new Page<>(); + String userId = AuthContextUtils.getSysUserId(); + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() +// .taskAssignee(userId.toString()) + .orderByTaskCreateTime().desc(); + page.setTotal(taskQuery.count()); + List taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); + List flowList = new ArrayList<>(); + for (Task task : taskList) { + FlowTaskDto flowTask = new FlowTaskDto(); + // 当前流程信息 + flowTask.setTaskId(task.getId()); + flowTask.setTaskDefKey(task.getTaskDefinitionKey()); + flowTask.setCreateTime(task.getCreateTime()); + flowTask.setProcDefId(task.getProcessDefinitionId()); + flowTask.setExecutionId(task.getExecutionId()); + flowTask.setTaskName(task.getName()); + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(task.getProcessInstanceId()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + SysUser startUser = sysUserService.getById(historicProcessInstance.getStartUserId()); +// SysUser startUser = sysUserService.selectUserById(Long.parseLong(task.getAssignee())); + flowTask.setStartUserId(startUser.getId()); + flowTask.setStartUserName(startUser.getName()); + if(startUser.getDeptId()!=null){ + SysDept dept = sysDeptService.getById(startUser.getDeptId()); + flowTask.setStartDeptName(dept.getName()); + } + flowList.add(flowTask); + } + page.setRecords(flowList); + return R.ok(page); + } + + @Override + public R finishedList(Integer pageNum, Integer pageSize) { + return null; + } + + @Override + public R flowRecord(String procInsId, String deployId) { + return null; + } + + @Override + public Task getTaskForm(String taskId) { + return null; + } + + @Override + public R getFlowViewer(String procInsId, String executionId) { + return null; + } + + @Override + public R processVariables(String taskId) { + return null; + } + + @Override + public R getNextFlowNode(FlowTaskVo flowTaskVo) { + return null; + } + + /** + * 流程完成时间处理 + * @param ms + * @return + */ + private String getDate(long ms) { + long day = ms / (24 * 60 * 60 * 1000); + long hour = (ms / (60 * 60 * 1000) - day * 24); + long minute = ((ms / (60 * 1000)) - day * 24 * 60 - hour * 60); + long second = (ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); + + if (day > 0) { + return day + "天" + hour + "小时" + minute + "分钟"; + } + if (hour > 0) { + return hour + "小时" + minute + "分钟"; + } + if (minute > 0) { + return minute + "分钟"; + } + if (second > 0) { + return second + "秒"; + } else { + return 0 + "秒"; + } + } + +}