4 changed files with 781 additions and 0 deletions
@ -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<Task> 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<String, Object> variables); |
||||
|
|
||||
|
} |
@ -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); |
||||
|
} |
@ -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<Task> queryListByInstanceId(String instanceId) { |
||||
|
List<Task> 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<String, Object> 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("启动流程失败"); |
||||
|
} |
||||
|
|
||||
|
} |
@ -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<FlowElement> flowElements = process.getFlowElements(); |
||||
|
// 获取当前任务节点元素
|
||||
|
UserTask source = null; |
||||
|
if (flowElements != null) { |
||||
|
for (FlowElement flowElement : flowElements) { |
||||
|
// 类型为用户节点
|
||||
|
if (flowElement.getId().equals(task.getTaskDefinitionKey())) { |
||||
|
source = (UserTask) flowElement; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// 获取节点的所有路线
|
||||
|
List<List<UserTask>> roads = FlowableUtils.findRoad(source, null, null, null); |
||||
|
// 可回退的节点列表
|
||||
|
List<UserTask> userTaskList = new ArrayList<>(); |
||||
|
for (List<UserTask> 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<FlowTaskDto> page = new Page<>(); |
||||
|
String userId = AuthContextUtils.getSysUserId(); |
||||
|
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() |
||||
|
.startedBy(userId) |
||||
|
.orderByProcessInstanceStartTime() |
||||
|
.desc(); |
||||
|
List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage(pageSize * (pageNum - 1), pageSize); |
||||
|
page.setTotal(historicProcessInstanceQuery.count()); |
||||
|
List<FlowTaskDto> 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<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list();
|
||||
|
// if (CollectionUtils.isNotEmpty(taskList)) {
|
||||
|
// flowTask.setTaskId(taskList.get(0).getId());
|
||||
|
// } else {
|
||||
|
// List<HistoricTaskInstance> 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> 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<EndEvent> 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<Execution> executions = |
||||
|
runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list(); |
||||
|
List<String> 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<HistoricTaskInstance> 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<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId());
|
||||
|
String myActivityId = null; |
||||
|
List<HistoricActivityInstance> 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<SequenceFlow> oriSequenceFlows = new ArrayList<>(flowNode.getOutgoingFlows()); |
||||
|
return R.ok(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 代办任务列表 |
||||
|
* @param pageNum 当前页码 |
||||
|
* @param pageSize 每页条数 |
||||
|
* @return |
||||
|
*/ |
||||
|
@Override |
||||
|
public R<?> todoList(Integer pageNum, Integer pageSize) { |
||||
|
Page<FlowTaskDto> page = new Page<>(); |
||||
|
String userId = AuthContextUtils.getSysUserId(); |
||||
|
TaskQuery taskQuery = taskService.createTaskQuery() |
||||
|
.active() |
||||
|
.includeProcessVariables() |
||||
|
// .taskAssignee(userId.toString())
|
||||
|
.orderByTaskCreateTime().desc(); |
||||
|
page.setTotal(taskQuery.count()); |
||||
|
List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); |
||||
|
List<FlowTaskDto> 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 + "秒"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue