From db64ae65eafa80b09213c48ed526dda29691e949 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 17 Jun 2023 19:01:26 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9E=9A=E4=B8=BE=E3=80=82=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=90=AF=E5=8A=A8=EF=BC=8C=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=EF=BC=8C=E7=BB=88=E6=AD=A2=E7=AD=89=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/BusinessStatusEnum.java | 91 +++++++++++++++++++ .../ActProcessInstanceController.java | 3 +- .../workflow/domain/bo/ProcessInvalidBo.java | 5 +- .../flowable/cmd/UpdateBusinessStatusCmd.java | 37 ++++++++ .../impl/ActProcessInstanceServiceImpl.java | 16 ++-- .../service/impl/ActTaskServiceImpl.java | 31 +++++-- 6 files changed, 168 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java new file mode 100644 index 000000000..4fb4c23f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -0,0 +1,91 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.exception.ServiceException; + +/** + * 业务状态枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum BusinessStatusEnum { + /** + * 已撤销 + */ + CANCEL("cancel", "已撤销"), + /** + * 草稿 + */ + DRAFT("draft", "草稿"), + /** + * 待审核 + */ + WAITING("waiting", "待审核"), + /** + * 已完成 + */ + FINISH("finish", "已完成"), + /** + * 已作废 + */ + INVALID("invalid", "已作废"), + /** + * 已退回 + */ + BACK("back", "已退回"), + /** + * 已终止 + */ + TERMINATION("termination", "已终止"); + + /** + * 状态 + */ + private final String status; + + /** + * 描述 + */ + private final String desc; + + /** + * 启动流程校验 + * + * @param status 状态 + */ + public static void checkStartStatus(String status) { + if (status.equals(WAITING.getStatus())) { + throw new ServiceException("该单据已提交过申请,正在审批中!"); + } else if (status.equals(FINISH.getStatus())) { + throw new ServiceException("该单据已完成申请!"); + } else if (status.equals(INVALID.getStatus())) { + throw new ServiceException("该单据已作废!"); + } else if (status.equals(TERMINATION.getStatus())) { + throw new ServiceException("该单据已终止!"); + } + } + + /** + * 校验流程申请 + * + * @param status 状态 + */ + public static void checkStatus(String status) { + if (status.equals(FINISH.getStatus())) { + throw new ServiceException("该单据已完成申请!"); + } else if (status.equals(INVALID.getStatus())) { + throw new ServiceException("该单据已作废!"); + } else if (status.equals(CANCEL.getStatus())) { + throw new ServiceException("该单据已撤销!"); + } else if (status.equals(BACK.getStatus())) { + throw new ServiceException("该单据已退回!"); + } else if (status.equals(TERMINATION.getStatus())) { + throw new ServiceException("该单据已终止!"); + } + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index ae94236f8..488da078a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -78,7 +79,7 @@ public class ActProcessInstanceController extends BaseController { */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @PostMapping("/deleteRuntimeProcessInst") - public R deleteRuntimeProcessInst(@RequestBody ProcessInvalidBo processInvalidBo) { + public R deleteRuntimeProcessInst(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java index 0bfebf533..35d565255 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.bo; +import jakarta.validation.constraints.NotBlank; import lombok.Data; +import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; @@ -19,7 +21,8 @@ public class ProcessInvalidBo implements Serializable { /** * 流程实例id */ - private String processInstId; + @NotBlank(message = "流程实例id不能为空", groups = {AddGroup.class}) + private String processInstanceId; /** * 作废原因 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java new file mode 100644 index 000000000..3ba120aef --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.flowable.cmd; + +import org.dromara.common.core.exception.ServiceException; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntity; +import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +/** + * 修改流程状态 + * + * @author may + */ +public class UpdateBusinessStatusCmd implements Command { + + private final String processInstanceId; + private final String status; + + public UpdateBusinessStatusCmd(String processInstanceId, String status) { + this.processInstanceId = processInstanceId; + this.status = status; + } + + @Override + public Boolean execute(CommandContext commandContext) { + try { + HistoricProcessInstanceEntityManager manager = CommandContextUtil.getHistoricProcessInstanceEntityManager(); + HistoricProcessInstanceEntity processInstance = manager.findById(processInstanceId); + processInstance.setBusinessStatus(status); + manager.update(processInstance); + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 65a240ee7..17626f398 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -16,6 +16,7 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; @@ -326,20 +327,24 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService */ @Override public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() - .processInstanceId(processInvalidBo.getProcessInstId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); try { - List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstId()) + List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstanceId()) .taskTenantId(TenantHelper.getTenantId()).list(); - List subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); + } String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); } - runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstId(), deleteReason); + runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); + runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); return true; } catch (Exception e) { e.printStackTrace(); @@ -351,7 +356,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * * @param processInstanceId 流程实例id - * @return */ @Override public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index de291f82d..186820ea4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -14,15 +14,14 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; -import org.flowable.engine.HistoryService; -import org.flowable.engine.IdentityService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; +import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; @@ -51,6 +50,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final TaskService taskService; private final HistoryService historyService; private final IdentityService identityService; + private final ManagementService managementService; /** * 启动任务 @@ -65,11 +65,14 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException("启动工作流时必须包含业务ID"); } // 判断当前业务是否启动过流程 - List instanceList = historyService.createHistoricProcessInstanceQuery() - .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantIdLike(TenantHelper.getTenantId()).list(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); + } TaskQuery taskQuery = taskService.createTaskQuery(); List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); - if (CollUtil.isNotEmpty(instanceList)) { + if (CollUtil.isNotEmpty(taskResult)) { map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("taskId", taskResult.get(0).getId()); return map; @@ -89,6 +92,8 @@ public class ActTaskServiceImpl implements IActTaskService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } + + runtimeService.updateBusinessStatus(pi.getProcessInstanceId(), BusinessStatusEnum.DRAFT.getStatus()); taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString()); taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId()); map.put("processInstanceId", pi.getProcessInstanceId()); @@ -126,10 +131,16 @@ public class ActTaskServiceImpl implements IActTaskService { taskService.complete(newTask.getId()); return true; } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); + if (CollUtil.isEmpty(list)) { + UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); + managementService.executeCommand(updateBusinessStatusCmd); + } return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -233,6 +244,11 @@ public class ActTaskServiceImpl implements IActTaskService { if (task.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); + } try { if (StringUtils.isBlank(terminationBo.getComment())) { terminationBo.setComment(LoginHelper.getUsername() + "终止了申请"); @@ -249,6 +265,7 @@ public class ActTaskServiceImpl implements IActTaskService { } runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); return true; } catch (Exception e) { throw new ServiceException(e.getMessage());