| | |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.utils.StreamUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.workflow.common.constant.FlowConstant; |
| | |
| | | import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; |
| | | import org.dromara.workflow.service.IActHiProcinstService; |
| | | import org.dromara.workflow.service.IActProcessInstanceService; |
| | | import org.dromara.workflow.service.IWfTaskBackNodeService; |
| | | import org.dromara.workflow.utils.QueryUtils; |
| | | import org.dromara.workflow.utils.WorkflowUtils; |
| | | import org.flowable.bpmn.model.*; |
| | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_DEFINITION_ID; |
| | | |
| | | /** |
| | | * 流程实例 服务层实现 |
| | |
| | | private final IActHiProcinstService actHiProcinstService; |
| | | private final ManagementService managementService; |
| | | private final FlowEventStrategy flowEventStrategy; |
| | | private final IWfTaskBackNodeService iWfTaskBackNodeService; |
| | | |
| | | @Value("${flowable.activity-font-name}") |
| | | private String activityFontName; |
| | |
| | | /** |
| | | * 分页查询正在运行的流程实例 |
| | | * |
| | | * @param processInstanceBo 参数 |
| | | * @param bo 参数 |
| | | */ |
| | | @Override |
| | | public TableDataInfo<ProcessInstanceVo> getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) { |
| | | public TableDataInfo<ProcessInstanceVo> getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { |
| | | List<ProcessInstanceVo> list = new ArrayList<>(); |
| | | ProcessInstanceQuery query = QueryUtils.instanceQuery(); |
| | | if (StringUtils.isNotBlank(processInstanceBo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); |
| | | if (StringUtils.isNotBlank(bo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getKey())) { |
| | | query.processDefinitionKey(processInstanceBo.getKey()); |
| | | if (StringUtils.isNotBlank(bo.getKey())) { |
| | | query.processDefinitionKey(bo.getKey()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getStartUserId())) { |
| | | query.startedBy(processInstanceBo.getStartUserId()); |
| | | if (StringUtils.isNotBlank(bo.getStartUserId())) { |
| | | query.startedBy(bo.getStartUserId()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); |
| | | if (StringUtils.isNotBlank(bo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(bo.getBusinessKey()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { |
| | | query.processDefinitionCategory(processInstanceBo.getCategoryCode()); |
| | | if (StringUtils.isNotBlank(bo.getCategoryCode())) { |
| | | query.processDefinitionCategory(bo.getCategoryCode()); |
| | | } |
| | | query.orderByStartTime().desc(); |
| | | List<ProcessInstance> processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); |
| | | List<ProcessInstance> processInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); |
| | | for (ProcessInstance processInstance : processInstances) { |
| | | ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); |
| | | processInstanceVo.setIsSuspended(processInstance.isSuspended()); |
| | |
| | | /** |
| | | * 分页查询已结束的流程实例 |
| | | * |
| | | * @param processInstanceBo 参数 |
| | | * @param bo 参数 |
| | | */ |
| | | @Override |
| | | public TableDataInfo<ProcessInstanceVo> getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) { |
| | | public TableDataInfo<ProcessInstanceVo> getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { |
| | | List<ProcessInstanceVo> list = new ArrayList<>(); |
| | | HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery() |
| | | .finished().orderByProcessInstanceEndTime().desc(); |
| | | if (StringUtils.isNotEmpty(processInstanceBo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); |
| | | if (StringUtils.isNotEmpty(bo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getKey())) { |
| | | query.processDefinitionKey(processInstanceBo.getKey()); |
| | | if (StringUtils.isNotBlank(bo.getKey())) { |
| | | query.processDefinitionKey(bo.getKey()); |
| | | } |
| | | if (StringUtils.isNotEmpty(processInstanceBo.getStartUserId())) { |
| | | query.startedBy(processInstanceBo.getStartUserId()); |
| | | if (StringUtils.isNotEmpty(bo.getStartUserId())) { |
| | | query.startedBy(bo.getStartUserId()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); |
| | | if (StringUtils.isNotBlank(bo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(bo.getBusinessKey()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { |
| | | query.processDefinitionCategory(processInstanceBo.getCategoryCode()); |
| | | if (StringUtils.isNotBlank(bo.getCategoryCode())) { |
| | | query.processDefinitionCategory(bo.getCategoryCode()); |
| | | } |
| | | List<HistoricProcessInstance> historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); |
| | | List<HistoricProcessInstance> historicProcessInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); |
| | | for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { |
| | | ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); |
| | | processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(historicProcessInstance.getBusinessStatus())); |
| | |
| | | */ |
| | | @SneakyThrows |
| | | @Override |
| | | public String getHistoryProcessImage(String processInstanceId) { |
| | | public String getHistoryImage(String processInstanceId) { |
| | | String processDefinitionId; |
| | | // 获取当前的流程实例 |
| | | ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult(); |
| | |
| | | * @param processInstanceId 流程实例id |
| | | */ |
| | | @Override |
| | | public Map<String, Object> getHistoryProcessList(String processInstanceId) { |
| | | public Map<String, Object> getHistoryList(String processInstanceId) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | List<Map<String, Object>> taskList = new ArrayList<>(); |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); |
| | |
| | | for (HistoricTaskInstance historicTaskInstance : list) { |
| | | ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); |
| | | BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); |
| | | actHistoryInfoVo.setAssignee(StringUtils.isNotBlank(historicTaskInstance.getAssignee()) ? Long.valueOf(historicTaskInstance.getAssignee()) : null); |
| | | actHistoryInfoVo.setStatus(actHistoryInfoVo.getEndTime() == null ? "待处理" : "已处理"); |
| | | if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { |
| | | actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { |
| | | public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) { |
| | | try { |
| | | List<Task> list = QueryUtils.taskQuery(processInvalidBo.getProcessInstanceId()).list(); |
| | | List<Task> subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); |
| | |
| | | for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) { |
| | | taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason); |
| | | } |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInvalidBo.getProcessInstanceId()).singleResult(); |
| | | if (ObjectUtil.isNotEmpty(historicProcessInstance) && BusinessStatusEnum.FINISH.getStatus().equals(historicProcessInstance.getBusinessStatus())) { |
| | | throw new ServiceException("该单据已完成申请!"); |
| | | } |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInvalidBo.getProcessInstanceId()).singleResult(); |
| | | BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); |
| | | runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); |
| | | runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteRuntimeProcessAndHisInst(List<String> processInstanceIds) { |
| | | public boolean deleteRunAndHisInstance(List<String> processInstanceIds) { |
| | | try { |
| | | // 1.删除运行中流程实例 |
| | | List<Task> list = QueryUtils.taskQuery(processInstanceIds).list(); |
| | |
| | | if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { |
| | | historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); |
| | | } |
| | | iWfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List<String> businessKeys) { |
| | | public boolean deleteRunAndHisInstanceByBusinessKeys(List<String> businessKeys) { |
| | | try { |
| | | // 1.删除运行中流程实例 |
| | | List<ActHiProcinst> actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); |
| | |
| | | if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { |
| | | historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); |
| | | } |
| | | iWfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteFinishProcessAndHisInst(List<String> processInstanceIds) { |
| | | public boolean deleteFinishAndHisInstance(List<String> processInstanceIds) { |
| | | try { |
| | | historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); |
| | | iWfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | if (processInstance.isSuspended()) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); |
| | | } |
| | | if (BusinessStatusEnum.CANCEL.getStatus().equals(processInstance.getBusinessStatus())) { |
| | | throw new ServiceException("该单据已撤销!"); |
| | | } |
| | | BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus()); |
| | | List<Task> taskList = QueryUtils.taskQuery(processInstanceId).list(); |
| | | for (Task task : taskList) { |
| | | taskService.setAssignee(task.getId(), String.valueOf(LoginHelper.getUserId())); |
| | | taskService.setAssignee(task.getId(), null); |
| | | taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请"); |
| | | } |
| | | HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); |
| | |
| | | /** |
| | | * 分页查询当前登录人单据 |
| | | * |
| | | * @param processInstanceBo 参数 |
| | | * @param bo 参数 |
| | | */ |
| | | @Override |
| | | public TableDataInfo<ProcessInstanceVo> getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo) { |
| | | public TableDataInfo<ProcessInstanceVo> getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { |
| | | List<ProcessInstanceVo> list = new ArrayList<>(); |
| | | HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); |
| | | query.startedBy(processInstanceBo.getStartUserId()); |
| | | if (StringUtils.isNotBlank(processInstanceBo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); |
| | | query.startedBy(String.valueOf(LoginHelper.getUserId())); |
| | | if (StringUtils.isNotBlank(bo.getName())) { |
| | | query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getKey())) { |
| | | query.processDefinitionKey(processInstanceBo.getKey()); |
| | | if (StringUtils.isNotBlank(bo.getKey())) { |
| | | query.processDefinitionKey(bo.getKey()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); |
| | | if (StringUtils.isNotBlank(bo.getBusinessKey())) { |
| | | query.processInstanceBusinessKey(bo.getBusinessKey()); |
| | | } |
| | | if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { |
| | | query.processDefinitionCategory(processInstanceBo.getCategoryCode()); |
| | | if (StringUtils.isNotBlank(bo.getCategoryCode())) { |
| | | query.processDefinitionCategory(bo.getCategoryCode()); |
| | | } |
| | | query.orderByProcessInstanceStartTime().desc(); |
| | | List<HistoricProcessInstance> historicProcessInstanceList = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); |
| | | List<HistoricProcessInstance> historicProcessInstanceList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); |
| | | List<TaskVo> taskVoList = new ArrayList<>(); |
| | | if (CollUtil.isNotEmpty(historicProcessInstanceList)) { |
| | | List<String> processInstanceIds = StreamUtils.toList(historicProcessInstanceList, HistoricProcessInstance::getId); |
| | |
| | | } |
| | | list.add(processInstanceVo); |
| | | } |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); |
| | | WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID); |
| | | } |
| | | long count = query.count(); |
| | | return new TableDataInfo<>(list, count); |
| | | } |