From b2801fbb8eaa629820c82d5204a08e1e81b082a5 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Jun 2024 17:43:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?update=20-=20Client=20API=20Feign=20?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A2=9E=E5=8A=A0=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowEngineClientAutoConfiguration.java | 5 +++-- .../client/config/WorkflowRequestInterceptor.java | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java index 18029b184..abfde80e5 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; import javax.annotation.Nullable; @@ -199,8 +200,8 @@ public class WorkflowEngineClientAutoConfiguration { } @Bean - public RequestInterceptor workflowRequestInterceptor(String serviceVersion) { - return new WorkflowRequestInterceptor(serviceVersion); + public RequestInterceptor workflowRequestInterceptor(String serviceVersion, Environment environment) { + return new WorkflowRequestInterceptor(serviceVersion, environment); } } diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java index ea35fc79f..a5c831343 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java @@ -3,6 +3,7 @@ package cn.axzo.workflow.client.config; import feign.RequestInterceptor; import feign.RequestTemplate; import feign.Target; +import org.springframework.core.env.Environment; /** * 通用的 Feign 请求拦截器 @@ -12,14 +13,16 @@ import feign.Target; */ public class WorkflowRequestInterceptor implements RequestInterceptor { private final String serviceVersion; + private final Environment environment; - public WorkflowRequestInterceptor(String serviceVersion) { + public WorkflowRequestInterceptor(String serviceVersion, Environment environment) { this.serviceVersion = serviceVersion; + this.environment = environment; } - public static final String HEADER_HTTP_CLIENT = "http-client"; - public static final String HEADER_HTTP_CLIENT_VALUE = "workflowEngine-feign"; - public static final String HEADER_API_VERSION = "service-version"; + public static final String HEADER_HTTP_CLIENT = "Http-Client"; + public static final String HEADER_HTTP_CLIENT_VALUE = "WorkflowEngine-Feign"; + public static final String HEADER_API_VERSION = "Service-Version"; public static final String HEADER_SERVER_NAME = "X-SERVER-NAME"; @@ -31,6 +34,7 @@ public class WorkflowRequestInterceptor implements RequestInterceptor { || apiClassPath.contains("cn.axzo.workflow.client.feign.manage")) { requestTemplate.header(HEADER_HTTP_CLIENT, HEADER_HTTP_CLIENT_VALUE); requestTemplate.header(HEADER_API_VERSION, serviceVersion); + requestTemplate.header(HEADER_SERVER_NAME, environment.getProperty("spring.application.name")); } } } From b4d0a53842c836505e63dc6f60162d0968b04c41 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 9 May 2025 16:07:59 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix=20-=20=E5=A2=9E=E5=8A=A0=20BpmnFlowNode?= =?UTF-8?q?Type=20=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java index 1dc7eb85d..c03147331 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java @@ -19,6 +19,7 @@ public enum BpmnFlowNodeType { NODE_ROBOT("NODE_ROBOT", "机器人节点"), NODE_COMMENT("NODE_COMMENT", "评论节点"), NODE_ABORT("NODE_ABORT", "中止节点"), + NODE_ALTER("NODE_ALTER", "告警节点"), NODE_CANCEL("NODE_CANCEL", "撤回节点"), NODE_EMPTY("NODE_EMPTY", "空节点"), ; From 207ab3aebf0051c94ffcc89d536a1202a05460ea Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 19 Aug 2025 14:18:29 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix=20-=20=E6=B7=BB=E5=8A=A0=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E5=80=BC=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/BpmnProcessInstanceResultEnum.java | 2 ++ .../common/model/response/mq/ProcessInstanceDTO.java | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java index 81ba92e01..aa29c667a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java @@ -6,10 +6,12 @@ public enum BpmnProcessInstanceResultEnum { PROCESSING("PROCESSING", "审批中"), APPROVED("APPROVED", "已通过"), REJECTED("REJECTED", "已驳回"), + BACKED("BACKED", "已回退"), CANCELLED("CANCELLED", "已撤回"), ABORTED("ABORTED", "已中止"), TRANSFER("TRANSFER", "已转交"), COUNTERSIGN("COUNTERSIGN", "已加签"), + UPGRADED("UPGRADED", "已提级"), COMMENTED("COMMENTED", "已评论"), DELETED("DELETED", "已删除"), ; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java index 4911cfbe7..f1e193c1a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java @@ -85,9 +85,14 @@ public class ProcessInstanceDTO implements Serializable { */ private BpmnTaskDelegateAssigner initiator; + /** + * 关闭审批实例前最后一个操作人 + */ + private BpmnTaskDelegateAssigner lastOperationAssigner; + /** * 对流程实例做否定操作时的原因 - * + *

* 如: 中止/驳回/撤回功能 */ private String reason; From 6078dc36b1e0cf670bc63e274661d6472e54a7ab Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 20 Aug 2025 11:20:47 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=20common=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=89=88=E6=9C=AC=EF=BC=8C=E4=BF=9D=E8=AF=81?= =?UTF-8?q?=E4=BB=A5=E5=90=8E=E6=9C=8D=E5=8A=A1=E7=89=88=E6=9C=AC=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=EF=BC=8C=E4=BD=8E=E7=89=88=E6=9C=AC=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9A=84=20starter=20=E4=BB=8D=E8=83=BD=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +- workflow-engine-api/pom.xml | 2 +- workflow-engine-axzo-ext/pom.xml | 2 +- workflow-engine-common/pom.xml | 1 + .../starter/api/WorkflowCoreService.java | 381 ++++---- .../starter/api/WorkflowManageService.java | 882 +++++++++--------- 6 files changed, 651 insertions(+), 620 deletions(-) diff --git a/pom.xml b/pom.xml index fd3624845..d502d1d68 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 7.10.2 2.0.0 2.5.0 + 0.0.1-SNAPSHOT @@ -74,7 +75,7 @@ ${project.groupId} workflow-engine-common - ${project.version} + ${workflow-engine-common.version} ${project.groupId} diff --git a/workflow-engine-api/pom.xml b/workflow-engine-api/pom.xml index 11ba8fffc..5bf3c9f5c 100644 --- a/workflow-engine-api/pom.xml +++ b/workflow-engine-api/pom.xml @@ -21,7 +21,7 @@ ${project.groupId} workflow-engine-common - ${project.version} + ${workflow-engine-common.version} io.github.openfeign diff --git a/workflow-engine-axzo-ext/pom.xml b/workflow-engine-axzo-ext/pom.xml index f59afb25c..059eddb85 100644 --- a/workflow-engine-axzo-ext/pom.xml +++ b/workflow-engine-axzo-ext/pom.xml @@ -14,7 +14,7 @@ cn.axzo.workflow workflow-engine-common - ${project.version} + ${workflow-engine-common.version} cn.axzo.basics diff --git a/workflow-engine-common/pom.xml b/workflow-engine-common/pom.xml index f02bb046b..8b7641ac1 100644 --- a/workflow-engine-common/pom.xml +++ b/workflow-engine-common/pom.xml @@ -12,6 +12,7 @@ workflow-engine-common jar workflow Engine Common + ${workflow-engine-common.version} diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowCoreService.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowCoreService.java index 0ee910c9a..d44ce9b76 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowCoreService.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowCoreService.java @@ -5,47 +5,30 @@ import cn.axzo.workflow.common.util.ThreadUtil; import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC; import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC; import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient; -import cn.axzo.workflow.common.annotation.Manageable; -import cn.azxo.framework.common.model.CommonResponse; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; import cn.axzo.workflow.common.annotation.InvokeMode; +import cn.axzo.workflow.common.annotation.Manageable; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; +import cn.azxo.framework.common.model.CommonResponse; import io.swagger.v3.oas.annotations.Operation; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import javax.validation.constraints.NotBlank; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO; -import cn.axzo.workflow.common.model.response.BpmPageResult; -import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; -import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO; -import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO; -import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO; -import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO; -import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO; -import javax.annotation.Nullable; -import javax.validation.constraints.NotEmpty; +import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO; +import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO; +import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO; +import cn.axzo.workflow.common.model.response.form.FormVO; +import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO; +import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO; import java.util.List; -import java.util.Map; import cn.axzo.workflow.common.model.dto.SignFileDTO; import cn.axzo.workflow.common.model.dto.SimpleDocDTO; +import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO; @@ -62,10 +45,13 @@ import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverRead import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; +import cn.axzo.workflow.common.model.response.BpmPageResult; +import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO; +import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO; import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO; import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO; import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO; @@ -73,7 +59,29 @@ import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PutMapping; +import javax.annotation.Nullable; import javax.validation.constraints.NotNull; +import java.util.Map; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO; +import javax.validation.constraints.NotEmpty; /** * Workflow Engine Starter Core Service @@ -119,160 +127,26 @@ public interface WorkflowCoreService { Boolean setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto); /** - * 同意 - * - *

-     * MQ 触发规则:
-     *  1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
-     *  如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
-     *  2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
-     *  2.2. 流程实例正常结束会触发 process-instance-completed 事件
-     * 
+ * 获取指定审批业务的流程表单设置, + * @param dto + * @return */ - @Operation(summary = "同意,MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件),2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件,2.2. 流程实例正常结束会触发 process-instance-completed 事件") - @PostMapping("/api/process/task/approve") - Boolean approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto); + @PostMapping("/api/form/admin/start/form") + @InvokeMode(SYNC) + FormDefinitionVO getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto); /** - * 同意时并提交表单数据 + * 查询指定审批实例的表单模型和数据 + *

+ * dto 中的 processInstanceId 与 taskId,至少有一个属性有值,一般建议直接使用实例 ID。 + * 当传入 taskId 时,将只查询该任务绑定的表单模型和数据。 * * @param dto * @return */ - @Operation(summary = "同意时并提交表单") - @PostMapping("/api/process/task/form/approve") - Boolean approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto); - - /** - * 批量同意 - * - * @param dtos - * @return - */ - @Operation(summary = "批量同意") - @PostMapping("/api/process/task/batch/approve") - BatchOperationResultVO batchApproveTask(@Validated @RequestBody List dtos); - - /** - * 获取当前节点可回退节点选项列表 - * - * @param taskId 当前任务id - * @return 可以回退节点列表 - */ - @Operation(summary = "获取当前节点可回退节点选项列表") - @GetMapping("/api/process/task/back/optional/nodes") - List getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId); - - /** - * 回退到指定节点 - * - * @param dto - * @return - */ - @Operation(summary = "回退") - @PostMapping("/api/process/task/back") - Boolean backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto); - - /** - * 用于系统内部操作,跳转到指定节点 - * @param dto 请求参数 - * @return 是否成功 - */ - @Operation(summary = "系统操作回退任务到指定节点") - @PostMapping("/api/process/task/system/back") - Boolean systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto); - - /** - * 驳回 - * - *

-     * MQ 触发规则:
-     *   1. 当前审批任务会触发 process-task-deleted 事件
-     *   2. 当前流程实例会触发 process-instance-rejected 事件
-     * 
- */ - @Operation(summary = "驳回,MQ 触发规则:1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件") - @PostMapping("/api/process/task/reject") - Boolean rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto); - - /** - * 批量驳回 - * - * @param dtos 批量请求参数 - * @return - */ - @PostMapping("/api/process/task/batch/reject") - BatchOperationResultVO batchRejectTask(@Validated @RequestBody List dtos); - - /** - * 转交 - * - * @param dto - * @return - */ - @Operation(summary = "直接修改审批任务的审批人") - @PostMapping("/api/process/task/transfer") - Boolean transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto); - - /** - * 批量转交 - * - * @param dtos - * @return - */ - @Operation(summary = "批量修改审批任务的审批人") - @PostMapping("/api/process/task/batch/transfer") - BatchOperationResultVO batchTransferTask(@Validated @RequestBody List dtos); - - /** - * 评论 - * - * @param dto 评论请求参数 - * @return - */ - @Operation(summary = "审批流程评论") - @PostMapping("/api/process/task/comment") - Boolean commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto); - - /** - * 加签 - * - * @param dto 加签请求参数 - * @return - */ - @Operation(summary = "审批流程加签") - @PostMapping("/api/process/task/countersign") - Boolean countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto); - - /** - * 重置节点审批人(提级审批) - * - * @param dto - * @return - */ - @Operation(summary = "重置节点审批人(提级审批)") - @PostMapping("/api/process/task/approvers/reset") - Boolean resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto); - - /** - * 暂停流程任务,并创建机器人节点,等待业务推动 - * - * @param dto - * @return 返回机器人节点任务 ID - */ - @Operation(summary = "创建机器人节点, 暂停流程任务") - @PostMapping("/api/process/task/robot/create") - String createRobotTask(@Validated @RequestBody BpmnRobotTaskCreateDTO dto); - - /** - * 完成机器人节点 - * - * @param dto - * @return - */ - @Operation(summary = "完成机器人节点, 继续流程任务") - @PostMapping("/api/process/task/robot/complete") - Boolean completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto); + @PostMapping("/api/form/admin/instance/render") + @InvokeMode(SYNC) + FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto); /** * 创建流程前的节点列表 @@ -442,6 +316,163 @@ public interface WorkflowCoreService { @InvokeMode(SYNC) List getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId); + /** + * 同意 + * + *
+     * MQ 触发规则:
+     *  1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
+     *  如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
+     *  2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
+     *  2.2. 流程实例正常结束会触发 process-instance-completed 事件
+     * 
+ */ + @Operation(summary = "同意,MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件),2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件,2.2. 流程实例正常结束会触发 process-instance-completed 事件") + @PostMapping("/api/process/task/approve") + Boolean approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto); + + /** + * 同意时并提交表单数据 + * + * @param dto + * @return + */ + @Operation(summary = "同意时并提交表单") + @PostMapping("/api/process/task/form/approve") + Boolean approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto); + + /** + * 批量同意 + * + * @param dtos + * @return + */ + @Operation(summary = "批量同意") + @PostMapping("/api/process/task/batch/approve") + BatchOperationResultVO batchApproveTask(@Validated @RequestBody List dtos); + + /** + * 获取当前节点可回退节点选项列表 + * + * @param taskId 当前任务id + * @return 可以回退节点列表 + */ + @Operation(summary = "获取当前节点可回退节点选项列表") + @GetMapping("/api/process/task/back/optional/nodes") + List getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId); + + /** + * 回退到指定节点 + * + * @param dto + * @return + */ + @Operation(summary = "回退") + @PostMapping("/api/process/task/back") + Boolean backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto); + + /** + * 用于系统内部操作,跳转到指定节点 + * + * @param dto 请求参数 + * @return 是否成功 + */ + @Operation(summary = "系统操作回退任务到指定节点") + @PostMapping("/api/process/task/system/back") + Boolean systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto); + + /** + * 驳回 + * + *
+     * MQ 触发规则:
+     *   1. 当前审批任务会触发 process-task-deleted 事件
+     *   2. 当前流程实例会触发 process-instance-rejected 事件
+     * 
+ */ + @Operation(summary = "驳回,MQ 触发规则:1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件") + @PostMapping("/api/process/task/reject") + Boolean rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto); + + /** + * 批量驳回 + * + * @param dtos 批量请求参数 + * @return + */ + @PostMapping("/api/process/task/batch/reject") + BatchOperationResultVO batchRejectTask(@Validated @RequestBody List dtos); + + /** + * 转交 + * + * @param dto + * @return + */ + @Operation(summary = "直接修改审批任务的审批人") + @PostMapping("/api/process/task/transfer") + Boolean transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto); + + /** + * 批量转交 + * + * @param dtos + * @return + */ + @Operation(summary = "批量修改审批任务的审批人") + @PostMapping("/api/process/task/batch/transfer") + BatchOperationResultVO batchTransferTask(@Validated @RequestBody List dtos); + + /** + * 评论 + * + * @param dto 评论请求参数 + * @return + */ + @Operation(summary = "审批流程评论") + @PostMapping("/api/process/task/comment") + Boolean commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto); + + /** + * 加签 + * + * @param dto 加签请求参数 + * @return + */ + @Operation(summary = "审批流程加签") + @PostMapping("/api/process/task/countersign") + Boolean countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto); + + /** + * 重置节点审批人(提级审批) + * + * @param dto + * @return + */ + @Operation(summary = "重置节点审批人(提级审批)") + @PostMapping("/api/process/task/approvers/reset") + Boolean resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto); + + /** + * 暂停流程任务,并创建机器人节点,等待业务推动 + * + * @param dto + * @return 返回机器人节点任务 ID + */ + @Operation(summary = "创建机器人节点, 暂停流程任务") + @PostMapping("/api/process/task/robot/create") + String createRobotTask(@Validated @RequestBody BpmnRobotTaskCreateDTO dto); + + /** + * 完成机器人节点 + * + * @param dto + * @return + */ + @Operation(summary = "完成机器人节点, 继续流程任务") + @PostMapping("/api/process/task/robot/complete") + Boolean completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto); + /** * 强制使用‘异步’模式调用该方法,请在调用真实方法前调用该方法 *
diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowManageService.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowManageService.java
index b435064bb..f10d3a464 100644
--- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowManageService.java
+++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/api/WorkflowManageService.java
@@ -5,65 +5,34 @@ import cn.axzo.workflow.common.util.ThreadUtil;
 import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
 import cn.axzo.workflow.common.annotation.InvokeMode;
 import cn.axzo.workflow.common.annotation.Manageable;
-import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
-import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
-import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
-import cn.axzo.workflow.common.model.response.BpmPageResult;
-import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
+import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
+import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
 import cn.azxo.framework.common.model.CommonResponse;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.validation.annotation.Validated;
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
-import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
 import java.util.List;
-import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
-import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
-import cn.axzo.workflow.common.model.request.category.*;
-import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
-import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
-import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
-import org.springframework.web.bind.annotation.*;
-import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
+import java.util.Map;
+import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO;
+import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
+import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
+import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
 import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
 import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
 import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
 import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
-import io.swagger.v3.oas.annotations.Operation;
-import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable;
-import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
-import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
-import java.util.Map;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
-import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
-import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
-import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
-import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
-import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
-import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
-import javax.annotation.Nullable;
-import javax.validation.constraints.NotEmpty;
 import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
 import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
 import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
 import cn.axzo.workflow.common.model.response.form.FormVO;
 import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
 import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
+import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
+import cn.axzo.workflow.common.model.response.BpmPageResult;
+import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
 import cn.axzo.workflow.common.model.dto.SignFileDTO;
 import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
+import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
 import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
 import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
 import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
@@ -80,17 +49,29 @@ import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverRead
 import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
 import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
 import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
+import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
+import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
 import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
 import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import javax.annotation.Nullable;
+import javax.validation.constraints.NotNull;
+import cn.axzo.workflow.common.model.request.category.*;
+import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
+import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
+import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
+import org.springframework.web.bind.annotation.*;
+import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
 import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
 import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO;
+import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
 import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocByIdDTO;
 import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocCreateDTO;
 import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocOrderDTO;
@@ -107,10 +88,31 @@ import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
 import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelExtVO;
 import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
 import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
-import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO;
-import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
-import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
-import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
+import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
+import javax.validation.constraints.NotEmpty;
+import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
+import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
 
 /**
  * Workflow Engine Starter Management Service
@@ -122,91 +124,225 @@ import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
 @org.springframework.cloud.openfeign.FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = WorkflowEngineStarterFeignConfiguration.class)
 public interface WorkflowManageService {
 
-    /**
-     * 获取活跃的流程定义分页
-     */
-    @GetMapping("/api/process/definition/page")
+    @Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
+    @GetMapping("/api/print/admin/template/exists")
     @InvokeMode(SYNC)
-    BpmPageResult getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto);
+    Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
+
+    @Operation(summary = "获取打印模板中可打印的字段")
+    @PostMapping("/api/print/admin/fields")
+    @InvokeMode(SYNC)
+    List getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
+
+    @Operation(summary = "获取指定流程下用于替换打印的相关变量")
+    @GetMapping("/api/print/admin/field/variables")
+    @InvokeMode(SYNC)
+    Map getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
 
     /**
-     * 通过模型 ID 更新流程定义
+     * 查询管理员
+     * @param dto 管理员数据
+     * @return 管理员id
+     */
+    @PostMapping("/api/process/admin/query")
+    @InvokeMode(SYNC)
+    List queryProcessAdmins(@RequestBody ProcessAdminQueryDTO dto);
+
+    /**
+     * 查询管理员
+     * @param dto 管理员数据
+     * @return 管理员id
+     */
+    @PostMapping("/api/process/admin/query/count")
+    @InvokeMode(SYNC)
+    Integer queryProcessAdminsCount(@RequestBody ProcessAdminQueryDTO dto);
+
+    /**
+     * 添加管理员
+     * @param dto 管理员数据
+     * @return 管理员id
+     */
+    @PostMapping("/api/process/admin/create")
+    @InvokeMode(SYNC)
+    Long createProcessAdmin(@RequestBody ProcessAdminCreateDTO dto);
+
+    /**
+     * 批量添加管理员
+     * @param dtos
+     * @return
+     */
+    @PostMapping("/api/process/admin/batch/create")
+    @InvokeMode(SYNC)
+    Void batchCreateProcessAdmin(@RequestBody List dtos);
+
+    /**
+     * 删除管理员
+     * @param id 配置表id
+     * @return
+     */
+    @DeleteMapping("/api/process/admin/delete")
+    @InvokeMode(SYNC)
+    Integer deleteCommonProcessAdmin(@RequestParam Long id);
+
+    /**
+     * 根据条件删除管理员
+     * @param dto 删除条件
+     * @return
+     */
+    @DeleteMapping("/api/process/admin/delete/criteria")
+    @InvokeMode(SYNC)
+    Integer deleteProcessAdminCriteria(@RequestBody ProcessAdminDeleteDTO dto);
+
+    /**
+     * 删除管理员
+     * @param ids 管理员配置id列表
+     * @return
+     */
+    @DeleteMapping("/api/process/admin/batch/delete")
+    @InvokeMode(SYNC)
+    Integer batchDeleteProcessAdmin(@RequestBody List ids);
+
+    /**
+     * 该功能应该利用引擎的 TimerBoundaryEvent 来实现,但为了简便,先利用引擎的任务调度来实现
+     *
+     * @return
+     */
+    @PostMapping("/api/process/activity/timeout/trigger")
+    @Manageable
+    @Operation(summary = "设置指定业务节点定时继续往下执行")
+    Boolean setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
+
+    /**
+     * 为指定业务节点设置定时回调
+     *
+     * @return
+     */
+    @Manageable
+    @PostMapping("/api/process/activity/timeout/callback")
+    @Operation(summary = "设置指定业务节点定时回调")
+    Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
+
+    @PostMapping("/api/form/admin/form/page")
+    @InvokeMode(SYNC)
+    @Manageable
+    List formPage(@Validated @RequestBody FormSearchDTO dto);
+
+    /**
+     * 从 ES 中搜索符合条件的实例纬度数据
      *
      * @param dto
      * @return
      */
-    @PutMapping("/api/process/definition/update")
+    @PostMapping("/api/es/instance/search")
     @InvokeMode(SYNC)
-    Boolean updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto);
+    BpmPageResult searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto);
+
+    @DeleteMapping("/api/process/instance/super/cancel")
+    @Manageable
+    Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
 
     /**
-     * 获得指定定义编号对应的流程定义内容
+     * 查询所有的审批流
      *
-     * @param processDefinitionId 编号
-     * @return 流程定义
-     */
-    @GetMapping("/api/process/definition/get")
-    @InvokeMode(SYNC)
-    BpmnProcessDefinitionVO getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId);
-
-    /**
-     * 获得 deploymentId 对应的 ProcessDefinition
-     *
-     * @param deploymentId 部署编号
-     * @return 流程定义
-     */
-    @GetMapping("/api/process/definition/getByDeploymentId")
-    @InvokeMode(SYNC)
-    BpmnProcessDefinitionVO getProcessDefinitionByDeploymentId(@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId);
-
-    /**
-     * 获得流程定义标识对应的激活的流程定义
-     *
-     * @param key 流程定义的标识
-     * @return 流程定义
-     */
-    @GetMapping("/api/process/definition/active/getByKey")
-    @InvokeMode(SYNC)
-    BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key, @RequestParam(required = false, defaultValue = NO_TENANT_ID) String tenantId);
-
-    /**
-     * 挂起/激活流程,
-     * 激活:SuspensionState.ACTIVE.getStateCode()
-     * 挂起:SuspensionState.SUSPENDED.getStateCode()
-     * {@see SuspensionState}
-     */
-    @PutMapping("/api/process/definition/state/update")
-    @InvokeMode(SYNC)
-    Boolean getActiveProcessDefinitionByKey(@NotBlank(message = "流程定义ID不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer state);
-
-    /**
-     * 获取指定模型的定义 ID
-     *
-     * @return 流程定义ID
-     */
-    @GetMapping("/api/process/definition/active/getByCategory")
-    @InvokeMode(SYNC)
-    String getActiveProcessDefinitionId(@RequestParam(required = false) String tenantId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String category);
-
-    /**
-     * 获取指定模型激活的流程定义 JSON 模型
-     *
-     * @return 流程定义ID
-     */
-    @GetMapping("/api/process/definition/active/json/model")
-    @InvokeMode(SYNC)
-    BpmnModelUpdateDTO getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String key, @RequestParam(required = false) String tenantId);
-
-    /**
-     * 删除流程部署及定义
-     *
-     * @param deploymentId 流程定义部署 ID
-     * @param cascade      是否级联参数定义对应的流程实例及 job 等管理内容
      * @return
      */
-    @GetMapping("/api/process/definition/delete")
+    @Operation(summary = "查询所有的审批流")
+    @PostMapping("/api/process/instance/page/all")
+    @Manageable
     @InvokeMode(SYNC)
-    Void delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId, @RequestParam(required = false) Boolean cascade);
+    BpmPageResult getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
+
+    /**
+     * 我发起的审批列表
+     */
+    @Operation(summary = "我发起的审批列表")
+    @PostMapping("/api/process/instance/page/my")
+    @Manageable
+    @InvokeMode(SYNC)
+    BpmPageResult getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
+
+    /**
+     * 更新流程定义的状态
+     *
+     * @param processDefinitionId 流程定义的编号
+     * @param status              1, "active"; 2, "suspended"
+     */
+    @Operation(summary = "更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例")
+    @PutMapping("/api/process/instance/status/update")
+    @Manageable
+    @InvokeMode(SYNC)
+    Boolean updateProcessStatus(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer status);
+
+    /**
+     * 获取审批流程实例的运行图
+     *
+     * @param processInstanceId
+     * @param tenantId
+     * @return
+     */
+    @Operation(summary = "获取审批流程实例的运行图")
+    @GetMapping("/api/process/instance/graphical")
+    @Manageable
+    @InvokeMode(SYNC)
+    ObjectNode processInstanceGraphical(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
+
+    /**
+     * 推断指定流程实例的所有节点执行顺序
+     *
+     * @return
+     */
+    @Operation(summary = "推断指定流程实例的所有节点执行顺序")
+    @GetMapping("/api/process/instance/node/forecasting")
+    @Manageable
+    @InvokeMode(SYNC)
+    List processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
+
+    /**
+     * 推断指定流程实例的过滤掉部分节点执行顺序
+     *
+     * @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数
+     *                如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
+     * @return
+     */
+    @Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序")
+    @GetMapping("/api/process/instance/node/filter/forecasting")
+    @Manageable
+    @InvokeMode(SYNC)
+    List processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId, @RequestParam(required = false, defaultValue = "false") Boolean allNode, @Nullable @RequestParam(required = false) List nodeDefinitionKeys);
+
+    /**
+     * 查询实例的租户集合
+     *
+     * @return
+     */
+    @Operation(summary = "查询实例的租户集合")
+    @GetMapping("/api/process/instance/tenant/ids")
+    @Manageable
+    @InvokeMode(SYNC)
+    List getTenantIds();
+
+    /**
+     * 校验指定流程实例下,是否存在指定的审批人正处理待审批
+     *
+     * @return true 是在当前流程实例中,存在指定的审批人
+     */
+    @Operation(summary = "校验指定流程实例下,是否存在指定的审批人")
+    @PostMapping("/api/process/instance/check/approver")
+    @Manageable
+    @InvokeMode(SYNC)
+    Boolean checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto);
+
+    /**
+     * 查询 ExtAxProcessLog 表中审批人的冗余信息
+     *
+     * @param dto
+     * @return
+     */
+    @Operation(summary = "查询 ExtAxProcessLog 表中审批人的冗余信息")
+    @GetMapping("/api/process/instance/log/approve/ext")
+    @Manageable
+    @InvokeMode(SYNC)
+    List getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto);
 
     /**
      * 将死信队列中的任务转移到正常 JOB 队列中
@@ -240,25 +376,6 @@ public interface WorkflowManageService {
     @Manageable
     String getDeadLetterJobExceptionStacktraceByJobId(@RequestParam String jobId);
 
-    /**
-     * 获取流程操作按钮列表
-     *
-     * @return 流程操作按钮列表
-     */
-    @GetMapping("/api/process/config/button/list")
-    @InvokeMode(SYNC)
-    List getDefaultButtons();
-
-    /**
-     * 从 ES 中搜索符合条件的实例纬度数据
-     *
-     * @param dto
-     * @return
-     */
-    @PostMapping("/api/es/instance/search")
-    @InvokeMode(SYNC)
-    BpmPageResult searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto);
-
     /**
      * 获取指定业务分类
      *
@@ -414,274 +531,13 @@ public interface WorkflowManageService {
     Boolean upsertCategoryGroupAndVars(@Validated @RequestBody CategoryGroupVarUpsertDto dto);
 
     /**
-     * 该功能应该利用引擎的 TimerBoundaryEvent 来实现,但为了简便,先利用引擎的任务调度来实现
+     * 获取流程操作按钮列表
      *
-     * @return
+     * @return 流程操作按钮列表
      */
-    @PostMapping("/api/process/activity/timeout/trigger")
-    @Manageable
-    @Operation(summary = "设置指定业务节点定时继续往下执行")
-    Boolean setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
-
-    /**
-     * 为指定业务节点设置定时回调
-     *
-     * @return
-     */
-    @Manageable
-    @PostMapping("/api/process/activity/timeout/callback")
-    @Operation(summary = "设置指定业务节点定时回调")
-    Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
-
-    /**
-     * 为指定流程新增变量
-     */
-    @PostMapping("/api/process/variable/create/{executionId}")
+    @GetMapping("/api/process/config/button/list")
     @InvokeMode(SYNC)
-    Void createVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
-
-    /**
-     * 仅更新流程已存在的变量
-     *
-     * @param executionId
-     * @param restVariable
-     * @return
-     */
-    @PostMapping("/api/process/variable/update/{executionId}")
-    @InvokeMode(SYNC)
-    Void updateVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
-
-    /**
-     * 批量删除流程变量
-     */
-    @DeleteMapping("/api/process/variable/delete/{executionId}")
-    @InvokeMode(SYNC)
-    Void deleteVariables(@PathVariable("executionId") String executionId, @RequestParam String variableNames, @RequestParam(value = "scope", required = false) String scope);
-
-    @Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
-    @GetMapping("/api/print/admin/template/exists")
-    @InvokeMode(SYNC)
-    Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
-
-    @Operation(summary = "获取打印模板中可打印的字段")
-    @PostMapping("/api/print/admin/fields")
-    @InvokeMode(SYNC)
-    List getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
-
-    @Operation(summary = "获取指定流程下用于替换打印的相关变量")
-    @GetMapping("/api/print/admin/field/variables")
-    @InvokeMode(SYNC)
-    Map getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
-
-    /**
-     * 催办
-     *
-     * @param dto
-     * @return
-     */
-    @Operation(summary = "审批流程催办")
-    @PostMapping("/api/process/task/remind")
-    @Manageable
-    @InvokeMode(SYNC)
-    Boolean remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto);
-
-    /**
-     * 添加附件
-     *
-     * @param dto
-     * @return
-     */
-    @Operation(summary = "添加附件")
-    @PostMapping("/api/process/task/attachment")
-    @Manageable
-    Void addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto);
-
-    /**
-     * 待审核列表
-     */
-    @Operation(summary = "待审核列表")
-    @GetMapping("/api/process/task/page/todo")
-    @Manageable
-    @InvokeMode(SYNC)
-    BpmPageResult getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
-
-    /**
-     * 已完成的审批列表
-     */
-    @Operation(summary = "已完成的审批列表")
-    @GetMapping("/api/process/task/page/done")
-    @Manageable
-    @InvokeMode(SYNC)
-    BpmPageResult getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
-
-    /**
-     * 获取指定流程实例的审批过程信息
-     * 

- * 同一层级结构 - */ - @Operation(summary = "获取指定流程实例的审批过程信息") - @GetMapping("/api/process/task/list/flat") - @Manageable - @InvokeMode(SYNC) - List getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " + "不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); - - /** - * 获取指定流程实例的审批过程信息 - *

- * 分组结构 - */ - @Operation(summary = "获取指定流程实例的审批过程信息") - @GetMapping("/api/process/task/list/group") - @Manageable - @InvokeMode(SYNC) - List getTaskListGroupByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); - - /** - * 获取实例正在审核的人列表 - */ - @Operation(summary = "获取实例正在审核的人列表") - @GetMapping("/api/process/task/active/list") - @Manageable - @InvokeMode(SYNC) - List getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @NotBlank(message = "租户不能为空") @RequestParam String tenantId); - - /** - * 根据实例 ID 和自然人 ID 查询对应待处理的任务 ID - * - * @return - */ - @Operation(summary = "根据实例 ID 和自然人 ID 查询对应待处理的任务 ID") - @GetMapping("/api/process/task/find") - @Manageable - @InvokeMode(SYNC) - String findTaskIdByInstanceIdAndPersonId(@RequestParam(required = false) @NotBlank(message = "流程实例 ID 不能为空") String processInstanceId, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId); - - /** - * 根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID - * - * @return - */ - @Operation(summary = "根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID") - @GetMapping("/api/process/task/batch/find") - @Manageable - @InvokeMode(SYNC) - Map findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List processInstanceIds, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId); - - @PostMapping("/api/form/admin/form/page") - @InvokeMode(SYNC) - List formPage(@Validated @RequestBody FormSearchDTO dto); - - @PostMapping("/api/form/admin/start/form") - @InvokeMode(SYNC) - FormDefinitionVO getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto); - - /** - * 查询指定审批实例的表单模型和数据 - *

- * dto 中的 processInstanceId 与 taskId,至少有一个属性有值,一般建议直接使用实例 ID。 - * 当传入 taskId 时,将只查询该任务绑定的表单模型和数据。 - * - * @param dto - * @return - */ - @PostMapping("/api/form/admin/instance/render") - @InvokeMode(SYNC) - FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto); - - @DeleteMapping("/api/process/instance/super/cancel") - @Manageable - Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto); - - /** - * 查询所有的审批流 - * - * @return - */ - @Operation(summary = "查询所有的审批流") - @PostMapping("/api/process/instance/page/all") - @Manageable - @InvokeMode(SYNC) - BpmPageResult getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto); - - /** - * 我发起的审批列表 - */ - @Operation(summary = "我发起的审批列表") - @PostMapping("/api/process/instance/page/my") - @Manageable - @InvokeMode(SYNC) - BpmPageResult getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto); - - /** - * 更新流程定义的状态 - * - * @param processDefinitionId 流程定义的编号 - * @param status 1, "active"; 2, "suspended" - */ - @Operation(summary = "更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例") - @PutMapping("/api/process/instance/status/update") - @Manageable - @InvokeMode(SYNC) - Boolean updateProcessStatus(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer status); - - /** - * 获取审批流程实例的运行图 - * - * @param processInstanceId - * @param tenantId - * @return - */ - @Operation(summary = "获取审批流程实例的运行图") - @GetMapping("/api/process/instance/graphical") - @Manageable - @InvokeMode(SYNC) - ObjectNode processInstanceGraphical(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); - - /** - * 推断指定流程实例的所有节点执行顺序 - * - * @return - */ - @Operation(summary = "推断指定流程实例的所有节点执行顺序") - @GetMapping("/api/process/instance/node/forecasting") - @Manageable - @InvokeMode(SYNC) - List processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); - - /** - * 推断指定流程实例的过滤掉部分节点执行顺序 - * - * @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数 - * 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点 - * @return - */ - @Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序") - @GetMapping("/api/process/instance/node/filter/forecasting") - @Manageable - @InvokeMode(SYNC) - List processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId, @RequestParam(required = false, defaultValue = "false") Boolean allNode, @Nullable @RequestParam(required = false) List nodeDefinitionKeys); - - /** - * 查询实例的租户集合 - * - * @return - */ - @Operation(summary = "查询实例的租户集合") - @GetMapping("/api/process/instance/tenant/ids") - @Manageable - @InvokeMode(SYNC) - List getTenantIds(); - - /** - * 校验指定流程实例下,是否存在指定的审批人正处理待审批 - * - * @return true 是在当前流程实例中,存在指定的审批人 - */ - @Operation(summary = "校验指定流程实例下,是否存在指定的审批人") - @PostMapping("/api/process/instance/check/approver") - @Manageable - @InvokeMode(SYNC) - Boolean checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto); + List getDefaultButtons(); /** * 流程模型列表 @@ -1009,67 +865,209 @@ public interface WorkflowManageService { List hasFilesTenantIds(@Validated @RequestBody DocTenantQueryDTO dto); /** - * 查询管理员 - * @param dto 管理员数据 - * @return 管理员id + * 为指定流程新增变量 */ - @PostMapping("/api/process/admin/query") + @PostMapping("/api/process/variable/create/{executionId}") @InvokeMode(SYNC) - List queryProcessAdmins(@RequestBody ProcessAdminQueryDTO dto); + Void createVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable); /** - * 查询管理员 - * @param dto 管理员数据 - * @return 管理员id - */ - @PostMapping("/api/process/admin/query/count") - @InvokeMode(SYNC) - Integer queryProcessAdminsCount(@RequestBody ProcessAdminQueryDTO dto); - - /** - * 添加管理员 - * @param dto 管理员数据 - * @return 管理员id - */ - @PostMapping("/api/process/admin/create") - @InvokeMode(SYNC) - Long createProcessAdmin(@RequestBody ProcessAdminCreateDTO dto); - - /** - * 批量添加管理员 - * @param dtos + * 仅更新流程已存在的变量 + * + * @param executionId + * @param restVariable * @return */ - @PostMapping("/api/process/admin/batch/create") + @PostMapping("/api/process/variable/update/{executionId}") @InvokeMode(SYNC) - Void batchCreateProcessAdmin(@RequestBody List dtos); + Void updateVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable); /** - * 删除管理员 - * @param id 配置表id - * @return + * 批量删除流程变量 */ - @DeleteMapping("/api/process/admin/delete") + @DeleteMapping("/api/process/variable/delete/{executionId}") @InvokeMode(SYNC) - Integer deleteCommonProcessAdmin(@RequestParam Long id); + Void deleteVariables(@PathVariable("executionId") String executionId, @RequestParam String variableNames, @RequestParam(value = "scope", required = false) String scope); /** - * 根据条件删除管理员 - * @param dto 删除条件 + * 催办 + * + * @param dto * @return */ - @DeleteMapping("/api/process/admin/delete/criteria") + @Operation(summary = "审批流程催办") + @PostMapping("/api/process/task/remind") + @Manageable @InvokeMode(SYNC) - Integer deleteProcessAdminCriteria(@RequestBody ProcessAdminDeleteDTO dto); + Boolean remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto); /** - * 删除管理员 - * @param ids 管理员配置id列表 + * 添加附件 + * + * @param dto * @return */ - @DeleteMapping("/api/process/admin/batch/delete") + @Operation(summary = "添加附件") + @PostMapping("/api/process/task/attachment") + @Manageable + Void addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto); + + /** + * 待审核列表 + */ + @Operation(summary = "待审核列表") + @GetMapping("/api/process/task/page/todo") + @Manageable @InvokeMode(SYNC) - Integer batchDeleteProcessAdmin(@RequestBody List ids); + BpmPageResult getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto); + + /** + * 已完成的审批列表 + */ + @Operation(summary = "已完成的审批列表") + @GetMapping("/api/process/task/page/done") + @Manageable + @InvokeMode(SYNC) + BpmPageResult getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto); + + /** + * 获取指定流程实例的审批过程信息 + *

+ * 同一层级结构 + */ + @Operation(summary = "获取指定流程实例的审批过程信息") + @GetMapping("/api/process/task/list/flat") + @Manageable + @InvokeMode(SYNC) + List getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " + "不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); + + /** + * 获取指定流程实例的审批过程信息 + *

+ * 分组结构 + */ + @Operation(summary = "获取指定流程实例的审批过程信息") + @GetMapping("/api/process/task/list/group") + @Manageable + @InvokeMode(SYNC) + List getTaskListGroupByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); + + /** + * 获取实例正在审核的人列表 + */ + @Operation(summary = "获取实例正在审核的人列表") + @GetMapping("/api/process/task/active/list") + @Manageable + @InvokeMode(SYNC) + List getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @NotBlank(message = "租户不能为空") @RequestParam String tenantId); + + /** + * 根据实例 ID 和自然人 ID 查询对应待处理的任务 ID + * + * @return + */ + @Operation(summary = "根据实例 ID 和自然人 ID 查询对应待处理的任务 ID") + @GetMapping("/api/process/task/find") + @Manageable + @InvokeMode(SYNC) + String findTaskIdByInstanceIdAndPersonId(@RequestParam(required = false) @NotBlank(message = "流程实例 ID 不能为空") String processInstanceId, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId); + + /** + * 根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID + * + * @return + */ + @Operation(summary = "根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID") + @GetMapping("/api/process/task/batch/find") + @Manageable + @InvokeMode(SYNC) + Map findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List processInstanceIds, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId); + + /** + * 获取活跃的流程定义分页 + */ + @GetMapping("/api/process/definition/page") + @InvokeMode(SYNC) + BpmPageResult getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto); + + /** + * 通过模型 ID 更新流程定义 + * + * @param dto + * @return + */ + @PutMapping("/api/process/definition/update") + @InvokeMode(SYNC) + Boolean updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto); + + /** + * 获得指定定义编号对应的流程定义内容 + * + * @param processDefinitionId 编号 + * @return 流程定义 + */ + @GetMapping("/api/process/definition/get") + @InvokeMode(SYNC) + BpmnProcessDefinitionVO getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId); + + /** + * 获得 deploymentId 对应的 ProcessDefinition + * + * @param deploymentId 部署编号 + * @return 流程定义 + */ + @GetMapping("/api/process/definition/getByDeploymentId") + @InvokeMode(SYNC) + BpmnProcessDefinitionVO getProcessDefinitionByDeploymentId(@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId); + + /** + * 获得流程定义标识对应的激活的流程定义 + * + * @param key 流程定义的标识 + * @return 流程定义 + */ + @GetMapping("/api/process/definition/active/getByKey") + @InvokeMode(SYNC) + BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key, @RequestParam(required = false, defaultValue = NO_TENANT_ID) String tenantId); + + /** + * 挂起/激活流程, + * 激活:SuspensionState.ACTIVE.getStateCode() + * 挂起:SuspensionState.SUSPENDED.getStateCode() + * {@see SuspensionState} + */ + @PutMapping("/api/process/definition/state/update") + @InvokeMode(SYNC) + Boolean getActiveProcessDefinitionByKey(@NotBlank(message = "流程定义ID不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer state); + + /** + * 获取指定模型的定义 ID + * + * @return 流程定义ID + */ + @GetMapping("/api/process/definition/active/getByCategory") + @InvokeMode(SYNC) + String getActiveProcessDefinitionId(@RequestParam(required = false) String tenantId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String category); + + /** + * 获取指定模型激活的流程定义 JSON 模型 + * + * @return 流程定义ID + */ + @GetMapping("/api/process/definition/active/json/model") + @InvokeMode(SYNC) + BpmnModelUpdateDTO getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String key, @RequestParam(required = false) String tenantId); + + /** + * 删除流程部署及定义 + * + * @param deploymentId 流程定义部署 ID + * @param cascade 是否级联参数定义对应的流程实例及 job 等管理内容 + * @return + */ + @GetMapping("/api/process/definition/delete") + @InvokeMode(SYNC) + Void delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId, @RequestParam(required = false) Boolean cascade); /** * 强制使用‘同步’模式调用该方法,请在调用真实方法前调用该方法