diff --git a/.gitignore b/.gitignore
index a66b8e2f1..d217b08a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,8 @@ target/
*.iws
*.iml
*.ipr
+WorkflowCoreService.java
+WorkflowManageService.java
### NetBeans ###
/nbproject/private/
@@ -36,4 +38,5 @@ application-local.yml
*.log
rebel.xml
-.flattened-pom.xml
\ No newline at end of file
+.flattened-pom.xml
+.DS_Store
\ No newline at end of file
diff --git a/Changelog.md b/Changelog.md
index 486d24314..708c2392f 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,4 +1,48 @@
# Change logs
+### 1.5.1-SNAPSHOT
+
+> - 集成表单引擎
+> - 新增表单组件文本框和附件的支撑
+
+### 1.5.0-SNAPSHOT
+
+> - 新增 ElasticSearch 组件支撑
+> - 提供 ES 相关的搜索查询功能
+
+### 1.4.1-SNAPSHOT
+
+> - 配合 REQ-2616 完成工程完结需求
+> - 新增业务节点定时回调功能
+
+### 1.4.0-SNAPSHOT
+
+> - 新增 workflow-engine-spring-boot-starter 组件,大幅简化业务方接入使用的难度。
+> - 在 Starter 中新增 MQ 监控功能,避免死信依赖运维。
+> - 优化发送待办时,提前判断是否有按钮,以及能否支持批量处理。
+> - 修复同一个实例下,多个人同时操作任务,可能导致数据库的 FK 异常等问题。
+> - 修复其他的一些小问题
+
+### 1.3.3-SNAPSHOT
+
+> - 支持“政务”类型的模型管理。
+> - 支持模型批量控制和手写签名的控制。
+> - 新增转交、加签、中止功能的异步支持。
+> - 新增批量转交和中止的功能支持。
+> - 优化引擎内部异步任务携带真实的 traceId。
+
+### 1.3.2-SNAPSHOT
+
+> - 新增创建流程、同意、驳回三个功能的异步动作支持。
+> - 优化引擎内部事件处理效率。
+> - 优化流程实例推测功能。
+
+### 1.3.1-SNAPSHOT
+
+> - 新增相邻两个审批节点中,存在有相同的审批人时,切前一个审批节点的人已经正常通过,则自动过审功能。
+> - 同意审批节点,支持手写签名。
+> - 新增抄送功能。
+> - 优化引擎前后端模型协议转换逻辑。
+> - 优化引擎内部事件处理逻辑。
### 1.3.0-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index b9ca48e97..fd3624845 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,6 @@
-
+
4.0.0
@@ -12,12 +13,13 @@
workflow-engine
pom
${revision}
- workflow-engine
+ Workflow Engine
- 1.3.1-SNAPSHOT
+ 1.5.3-SNAPSHOT
2.0.0-SNAPSHOT
2.0.0-SNAPSHOT
+ 1.0.0-SNAPSHOT
11.8
1.18.22
1.4.2.Final
@@ -25,6 +27,10 @@
2.0.0
3.7.1
3.2.5
+ 3.26.0
+ 7.10.2
+ 2.0.0
+ 2.5.0
@@ -43,6 +49,12 @@
${axzo-dependencies.version}
pom
import
+
+
+ com.xuxueli
+ xxl-job-core
+
+
io.github.openfeign
@@ -54,21 +66,41 @@
workflow-engine-api
${project.version}
+
+ cn.axzo.workflow
+ workflow-engine-axzo-ext
+ ${project.version}
+
${project.groupId}
workflow-engine-common
${project.version}
+
+ ${project.groupId}
+ workflow-engine-form
+ ${project.version}
+
${project.groupId}
workflow-engine-core
${project.version}
+
+ ${project.groupId}
+ workflow-engine-elasticsearch
+ ${project.version}
+
${project.groupId}
workflow-engine-server
${project.version}
+
+ cn.axzo.workflow
+ workflow-engine-spring-boot-starter
+ ${project.version}
+
cn.axzo.maokai
maokai-api
@@ -99,6 +131,53 @@
maven-artifact
${apache-maven.version}
+
+ com.github.javaparser
+ javaparser-core
+ ${javaparse.version}
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-high-level-client
+ ${elasticsearch.version}
+
+
+
+ org.elasticsearch
+ elasticsearch
+ ${elasticsearch.version}
+
+
+
+ org.dromara.easy-es
+ easy-es-boot-starter
+ ${easy-es.version}
+
+
+ org.dromara.easy-es
+ easy-es-annotation
+ ${easy-es.version}
+
+
+ cn.axzo
+ riven-api
+ ${axzo-dependencies.version}
+
+
+ cn.axzo.org
+ org-api
+ ${axzo-dependencies.org.version}
+
+
+ com.xuxueli
+ xxl-job-core
+ ${xxl-job.version}
+
+
+ cn.axzo.nanopart
+ doc-api
+ ${axzo-dependencies.version}
+
@@ -120,6 +199,11 @@
mapstruct-processor
${mapstruct.version}
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${spring.boot.version}
+
@@ -135,9 +219,13 @@
workflow-engine-api
+ workflow-engine-axzo-ext
workflow-engine-common
+ workflow-engine-form
workflow-engine-core
+ workflow-engine-elasticsearch
workflow-engine-server
-
+ workflow-engine-support
+ workflow-engine-spring-boot-starter
diff --git a/workflow-engine-api/pom.xml b/workflow-engine-api/pom.xml
index ae99c41a8..11ba8fffc 100644
--- a/workflow-engine-api/pom.xml
+++ b/workflow-engine-api/pom.xml
@@ -11,7 +11,7 @@
workflow-engine-api
jar
- workflow-engine-api
+ Workflow Engine Api
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/annotation/WorkflowEngineFeignClient.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/annotation/WorkflowEngineFeignClient.java
new file mode 100644
index 000000000..f6dc5a700
--- /dev/null
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/annotation/WorkflowEngineFeignClient.java
@@ -0,0 +1,22 @@
+package cn.axzo.workflow.client.annotation;
+
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 用于开启原生 FeignClient
+ *
+ * @author wangli
+ * @since 2024-09-10 11:30
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface WorkflowEngineFeignClient {
+}
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/CommonFeignConfiguration.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/CommonFeignConfiguration.java
new file mode 100644
index 000000000..3db5067c4
--- /dev/null
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/CommonFeignConfiguration.java
@@ -0,0 +1,18 @@
+package cn.axzo.workflow.client.config;
+
+import feign.Retryer;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * 开启 Feign 重试策略
+ *
+ * @author wangli
+ * @since 2024/6/5 13:50
+ */
+public class CommonFeignConfiguration {
+
+ @Bean
+ public Retryer defaultRetryer() {
+ return new Retryer.Default();
+ }
+}
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 abfde80e5..37beb9211 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
@@ -2,7 +2,6 @@ package cn.axzo.workflow.client.config;
import feign.RequestInterceptor;
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;
@@ -14,7 +13,6 @@ import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
-import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -32,7 +30,7 @@ import java.util.regex.Pattern;
* @Date: 2022/9/17
* @Description:
*/
-@EnableFeignClients(basePackages = {"cn.axzo.workflow.client.feign"})
+//@EnableFeignClients(basePackages = {"cn.axzo.workflow.client.feign"})
@Configuration(proxyBeanMethods = false)
@Slf4j
public class WorkflowEngineClientAutoConfiguration {
@@ -43,7 +41,7 @@ public class WorkflowEngineClientAutoConfiguration {
private static final Pattern POM_VERSION = Pattern.compile(".*(\\S+).*",
Pattern.DOTALL);
- @Bean
+ @Bean("serviceVersion")
public String serviceVersion() {
Map env = System.getenv();
if (env != null) {
@@ -63,9 +61,12 @@ public class WorkflowEngineClientAutoConfiguration {
log.error("get version error: {}", e.getMessage(), e);
}
- String serviceVersion = Objects.isNull(version) ? "1.2.0-SNAPSHOT" : version;
+ String serviceVersion = Objects.isNull(version) ? "1.2.0" : version;
log.info("client current version: {}", serviceVersion);
- return serviceVersion;
+ return serviceVersion
+ .replaceAll("-SNAPSHOT", "")
+ .replaceAll("-RELEASE", "")
+ .trim();
}
private String getVersionFromPod(URL location) throws URISyntaxException {
@@ -82,7 +83,7 @@ public class WorkflowEngineClientAutoConfiguration {
Map env = new HashMap<>();
env.put("create", "true");
try {
- FileSystem zipfs = FileSystems.newFileSystem(location.toURI(), env);
+ FileSystems.newFileSystem(location.toURI(), env);
} catch (Exception e1) {
log.error("linux env create new FS error: {}", e1.getMessage());
}
@@ -100,7 +101,7 @@ public class WorkflowEngineClientAutoConfiguration {
Map env = new HashMap<>();
env.put("create", "true");
try {
- FileSystem zipfs = FileSystems.newFileSystem(location.toURI(), env);
+ FileSystems.newFileSystem(location.toURI(), env);
} catch (Exception e) {
log.error("linux env create new FS error: {}", e.getMessage());
}
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 a5c831343..cfdfd3958 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
@@ -24,6 +24,7 @@ public class WorkflowRequestInterceptor implements RequestInterceptor {
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";
+ public static final String HEADER_W_E = "WE";
@Override
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java
index 3fc94102e..1cbca027b 100644
--- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java
@@ -1,8 +1,14 @@
package cn.axzo.workflow.client.feign.bpmn;
+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.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 org.springframework.cloud.openfeign.FeignClient;
+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;
@@ -11,27 +17,69 @@ import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
+import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
+
/**
* 流程活动的 API
*
* @author wangli
* @since 2023/11/17 16:28
*/
-@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}")
+//@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = CommonFeignConfiguration.class)
+@WorkflowEngineFeignClient
public interface ProcessActivityApi {
/**
- * 业务节点唤醒
+ * 业务节点唤醒, 该节点废弃,请换成 {@link ProcessActivityApi#trigger(cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO)} 接口
+ *
+ * 当模型中使用了“业务节点”,且设置了“不设置审批人”模式,则当业务监听到 PROCESS_ACTIVITY_START 事件时,可通过该接口推动流程继续运行
*/
+ @Deprecated
@GetMapping("/api/process/activity/trigger")
+ @InvokeMode(SYNC)
CommonResponse trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
/**
- * 业务节点设置审批人
+ * 业务节点唤醒
+ *
+ * @param dto
+ * @return
+ */
+ @PostMapping("/api/process/activity/trigger")
+ CommonResponse trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
+
+
+ /**
+ * 业务节点设置审批人, 不支持重复设置
+ *
+ * 当模型中使用了“业务节点”,且设置了“业务指定审批人”模式,则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时,可通过该接口设置动态设置审批人
+ *
+ * 注意:如果调用接口时,传入的审批人集合为空,流程引擎将对该审批流程实例自动中止。
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/assignee/set")
+ @Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
CommonResponse setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
+
+ /**
+ * 该功能应该利用引擎的 TimerBoundaryEvent 来实现,但为了简便,先利用引擎的任务调度来实现
+ *
+ * @return
+ */
+ @PostMapping("/api/process/activity/timeout/trigger")
+ @Manageable
+ @Operation(summary = "设置指定业务节点定时继续往下执行")
+ CommonResponse setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
+
+ /**
+ * 为指定业务节点设置定时回调
+ *
+ * @return
+ */
+ @Manageable
+ @PostMapping("/api/process/activity/timeout/callback")
+ @Operation(summary = "设置指定业务节点定时回调")
+ CommonResponse setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
}
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessDefinitionApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessDefinitionApi.java
index a91122a15..6b196947d 100644
--- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessDefinitionApi.java
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessDefinitionApi.java
@@ -1,12 +1,14 @@
package cn.axzo.workflow.client.feign.bpmn;
+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.azxo.framework.common.model.CommonResponse;
-import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
@@ -16,13 +18,18 @@ import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
+
/**
* 流程定义 API
*
* @author wangli
* @since 2023/9/21 16:25
*/
-@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}")
+//@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = CommonFeignConfiguration.class)
+@WorkflowEngineFeignClient
+@Manageable
public interface ProcessDefinitionApi {
@@ -30,6 +37,7 @@ public interface ProcessDefinitionApi {
* 获取活跃的流程定义分页
*/
@GetMapping("/api/process/definition/page")
+ @InvokeMode(SYNC)
CommonResponse> getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto);
/**
@@ -39,6 +47,7 @@ public interface ProcessDefinitionApi {
* @return
*/
@PutMapping("/api/process/definition/update")
+ @InvokeMode(SYNC)
CommonResponse updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto);
/**
@@ -48,6 +57,7 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/get")
+ @InvokeMode(SYNC)
CommonResponse getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId);
/**
@@ -57,6 +67,7 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/getByDeploymentId")
+ @InvokeMode(SYNC)
CommonResponse getProcessDefinitionByDeploymentId(
@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId);
@@ -68,7 +79,9 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/active/getByKey")
- CommonResponse getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key);
+ @InvokeMode(SYNC)
+ CommonResponse getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key,
+ @RequestParam(required = false, defaultValue = NO_TENANT_ID) String tenantId);
/**
@@ -78,6 +91,7 @@ public interface ProcessDefinitionApi {
* {@see SuspensionState}
*/
@PutMapping("/api/process/definition/state/update")
+ @InvokeMode(SYNC)
CommonResponse getActiveProcessDefinitionByKey(@NotBlank(message = "流程定义ID不能为空") @RequestParam String processDefinitionId,
@NotNull(message = "状态不能为空") @RequestParam Integer state);
@@ -87,6 +101,7 @@ public interface ProcessDefinitionApi {
* @return 流程定义ID
*/
@GetMapping("/api/process/definition/active/getByCategory")
+ @InvokeMode(SYNC)
CommonResponse getActiveProcessDefinitionId(@RequestParam(required = false) String tenantId,
@NotBlank(message = "分类不能为空") @RequestParam(required = false) String category);
@@ -96,8 +111,9 @@ public interface ProcessDefinitionApi {
* @return 流程定义ID
*/
@GetMapping("/api/process/definition/active/json/model")
+ @InvokeMode(SYNC)
CommonResponse getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId,
- @NotBlank(message = "分类不能为空") @RequestParam(required = false) String category,
+ @NotBlank(message = "分类不能为空") @RequestParam(required = false) String key,
@RequestParam(required = false) String tenantId);
/**
@@ -107,7 +123,8 @@ public interface ProcessDefinitionApi {
* @param cascade 是否级联参数定义对应的流程实例及 job 等管理内容
* @return
*/
- @GetMapping("/api/process/definition/detele")
+ @GetMapping("/api/process/definition/delete")
+ @InvokeMode(SYNC)
CommonResponse delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId,
@RequestParam(required = false) Boolean cascade);
}
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java
index 91b466260..cd9ee5cbb 100644
--- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java
@@ -1,23 +1,41 @@
package cn.axzo.workflow.client.feign.bpmn;
-import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
+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.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;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
-import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateWithFormDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO;
+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;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.azxo.framework.common.model.CommonResponse;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.v3.oas.annotations.Operation;
-import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@@ -30,6 +48,9 @@ import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
+import java.util.Map;
+
+import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 流程实例 API
@@ -37,21 +58,20 @@ import java.util.List;
* @author wangli
* @since 2023/9/21 16:26
*/
-@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}")
+//@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = CommonFeignConfiguration.class)
+@WorkflowEngineFeignClient
public interface ProcessInstanceApi {
+
/**
- * 查询所有的审批流
+ * 创建流程前的节点列表
+ * 用于发起人自选
*
* @return
*/
- @PostMapping("/api/process/instance/page/all")
- CommonResponse> getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
-
- /**
- * 我发起的审批列表
- */
- @PostMapping("/api/process/instance/page/my")
- CommonResponse> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
+ @Operation(summary = "创建审批流程前,返回模型节点列表以及节点能否设置审批人")
+ @PostMapping("/api/process/instance/create/before")
+ @InvokeMode(SYNC)
+ CommonResponse> nodesBeforeCreateProcessInstance(@Validated @RequestBody BeforeProcessInstanceCreateDTO dto);
/**
* 创建审批流程
@@ -64,18 +84,11 @@ public interface ProcessInstanceApi {
*
* @param dto {@link BpmnProcessInstanceCreateDTO}
*/
+ @Operation(summary = "创建审批流程, MQ 触发规则:1. 当前流程实例会依次触发 process-instance-created 和 process-instance-started 事件,2. 第一个审批任务会依次触发 process-task-assigned 和 process-task-created 事件")
@PostMapping("/api/process/instance/create")
+ @InvokeMode(SYNC)
CommonResponse createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto);
- /**
- * 创建审批流程并带上表单
- *
- * @param dto
- * @return
- */
- @PostMapping("/api/process/instance/form/create")
- CommonResponse createProcessInstanceWith(@Validated @RequestBody BpmnProcessInstanceCreateWithFormDTO dto);
-
/**
* 发起人主动撤回审核
*
@@ -88,35 +101,89 @@ public interface ProcessInstanceApi {
* @param dto {@link BpmnProcessInstanceCancelDTO}
* @return
*/
+ @Operation(summary = "发起人主动撤回审核,MQ 触发规则:1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件,2. 当前流程实例会触发 process-instance-cancelled 事件")
@DeleteMapping("/api/process/instance/cancel")
CommonResponse cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
+ @DeleteMapping("/api/process/instance/super/cancel")
+ @Manageable
+ CommonResponse superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
+
/**
* 中止流程实例
*
* @param dto
* @return
*/
+ @Operation(summary = "中止流程实例")
@DeleteMapping("/api/process/instance/abort")
CommonResponse abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
- * 抄送流程实例
+ * 批量中止流程实例
+ *
+ * @param dtos
+ * @return
+ */
+ @Operation(summary = "批量中止流程实例")
+ @DeleteMapping("/api/process/instance/batch/abort")
+ CommonResponse batchAbortProcessInstance(@Validated @RequestBody List dtos);
+
+ /**
+ * 抄送流程实例(未实现)
*
* @param dto
* @return
*/
+ @Operation(summary = "抄送流程实例")
@PostMapping("/api/process/instance/carbon-copy")
+ @Deprecated
CommonResponse carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
+
/**
* 获得流程实例
*
* @param dto {@link BpmnProcessInstanceQueryDTO} 可根据 Id,BusinessKey进行查询
* @return 流程实例, 租户Id不必传
*/
+ @Operation(summary = "获得流程实例")
@GetMapping("/api/process/instance/get")
+ @InvokeMode(SYNC)
CommonResponse getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
+ /**
+ * 获取指定流程实例的流程变量
+ *
+ * @param processInstanceId
+ * @param tenantId
+ * @return
+ */
+ @Operation(summary = "获取指定流程实例的流程变量")
+ @GetMapping("/api/process/instance/cooperation-org")
+ @InvokeMode(SYNC)
+ CommonResponse
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/InvokeMode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/InvokeMode.java
new file mode 100644
index 000000000..26a45dcf6
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/InvokeMode.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.annotation;
+
+import cn.axzo.workflow.common.enums.RpcInvokeModeEnum;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
+
+/**
+ * 用于标记接口的方法调用模式
+ *
+ * @author wangli
+ * @since 2024/6/1 19:01
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface InvokeMode {
+
+ /**
+ * 调用模式, 默认异步
+ */
+ RpcInvokeModeEnum value() default ASYNC;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/Manageable.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/Manageable.java
new file mode 100644
index 000000000..f8d9622a1
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/annotation/Manageable.java
@@ -0,0 +1,10 @@
+package cn.axzo.workflow.common.annotation;
+
+/**
+ * 控制接口是否调用受限,标记了注解的方法,表示受控,不允许暴露给客户端使用
+ *
+ * @author wangli
+ * @since 2024/6/7 18:21
+ */
+public @interface Manageable {
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/AsyncJobRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/AsyncJobRespCode.java
new file mode 100644
index 000000000..54ee86b2f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/AsyncJobRespCode.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.code;
+
+import cn.axzo.framework.domain.web.code.IModuleRespCode;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 异步任务相关响应码
+ *
+ * @author wangli
+ * @since 2024/4/29 20:30
+ */
+@Getter
+@AllArgsConstructor
+public enum AsyncJobRespCode implements IModuleRespCode {
+ DATA_NOT_EXISTS("001", "ExtTaskInst 数据不存在, instId: {}, taskId: {}"),
+ JOB_NOT_EXISTS_JOB_ID("002", "id为【{}】对应任务不存在"),
+ JOB_NOT_EXISTS_PROC_INST_ID("003", "流程实例id为【{}】对应任务不存在"),
+ RESUME_JOB_REQUEST_PARAM_ERROR("004", "恢复任务请求参数错误,jobId 和 procInstId 不能同时为空"),
+ ;
+ private final String code;
+ private final String message;
+
+ @Override
+ public String getModuleCode() {
+ return "11";
+ }
+
+ @Override
+ public String getProjectCode() {
+ return "998";
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnInstanceRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
similarity index 64%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnInstanceRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
index dc3094271..bcf21af7c 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnInstanceRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -25,9 +25,17 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
PROCESS_INSTANCE_CANT_DELETE("010", "流程实例不能删除"),
PROCESS_INSTANCE_CANT_START("011", "流程实例不能启动"),
TASK_CANT_COMMENT_INSTANCE_NOT_EXISTS("012", "流程实例【{}】不存在, 不能评论"),
+ RUNNING_INSTANCE_ONLY_FORECAST("013", "仅运行中的实例可以推测"),
+ ENGINE_EXEC_EXCEPTION("014", "引擎内部异常:【{}】"),
+ PROCESS_TASK_NOT_EXISTS("015", "流程任务不存在或已处理"),
+ PROCESS_DOC_READ_PARAM_ERROR("016", "查询审批人阅读状态参数丢失自然人 ID 数据"),
+ PROCESS_DOC_ID_NOT_IN_MODEL("017", "当前流程中,不存在指定文档"),
+ PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
+ PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
+ PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -39,12 +47,4 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java
new file mode 100644
index 000000000..d1881847e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java
@@ -0,0 +1,47 @@
+package cn.axzo.workflow.common.code;
+
+import cn.axzo.framework.domain.web.code.IModuleRespCode;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 流程模型响应码
+ *
+ * @author wangli
+ * @since 2023/12/14 16:25
+ */
+@Getter
+@AllArgsConstructor
+public enum BpmnModelRespCode implements IModuleRespCode {
+ MODEL_KEY_EXISTS("001", "已经存在流程标识为【{}】的流程"),
+ MODEL_ID_NOT_EXISTS("002", "流程模型ID【{}】不存在"),
+ MODEL_KEY_NOT_EXISTS("003", "流程模型KEY【{}】不存在"),
+ MODEL_NOT_EXISTS("004", "流程模型不存在"),
+ BPMN_BYTES_NOT_EXISTS("005", "模型定义内容字节码不存在"),
+ MODEL_IS_DISABLE("006", "模型已经被停用"),
+ MODEL_FILE_TAG_DUPLICATE("007", "模型关联的文档业务标签重复"),
+ MODEL_FILE_TAG_EXISTS("008", "模型关联的文档业务标签已存在"),
+ MODEL_FILE_NOT_EXISTS("009", "模型关联的文档不存在或已被删除"),
+ MODEL_FILE_CLONE_ERROR("010", "克隆文档失败, 原因:【{}】"),
+ MODEL_FILE_TYPE_CLONE_NOT_SUPPORT("011", "不支持的文档类型克隆"),
+ MODEL_FILE_CONTENT_DATA_ERROR("012", "文档内容数据异常"),
+ MODEL_FILE_QUERY_ERROR("013", "文档搜索参数实例 ID 和业务 ID 不能同时为空"),
+ MODEL_FILE_HIPRINT_ID_INVAILD("014", "查询HiPrint文档主键参数非法"),
+ MODEL_FILE_REPLACE_CONTENT_ERROR("015", "替换文档变量失败,原因:【{}】"),
+ ;
+
+ private final String code;
+ private final String message;
+
+ @Override
+ public String getModuleCode() {
+ return "03";
+ }
+
+ @Override
+ public String getProjectCode() {
+ return "998";
+ }
+
+
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnProcessDefinitionRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
similarity index 80%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnProcessDefinitionRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
index 9166337e6..a7889dec2 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnProcessDefinitionRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -21,10 +21,12 @@ public enum BpmnProcessDefinitionRespCode implements IModuleRespCode {
PROCESS_DEFINITION_IS_SUSPENDED("006", "流程定义KEY【{}】处于挂起状态"),
PROCESS_DEFINITION_KEY_NOT_MATCH("007", "流程定义的标识不一致, 请修改 BPMN 流程图"),
PROCESS_DEFINITION_NAME_NOT_MATCH("008", "流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图"),
- PROCESS_DEFINITION_HAS_DIRTY_DATA("009", "流程定义KEY【{}】存在脏数据,当前模型没有流程定义内容")
+ PROCESS_DEFINITION_HAS_DIRTY_DATA("009", "流程定义KEY【{}】存在脏数据,当前模型没有流程定义内容"),
+ PROCESS_DEFINITION_IS_INVALID("010", "暂时无法发起,请先配置流程模型"),
+ PROCESS_DEFINITION_ID_ILLEGAL("011", "流程定义 ID 数据不合法")
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -36,12 +38,4 @@ public enum BpmnProcessDefinitionRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnTaskRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
similarity index 67%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnTaskRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
index 2b42a409e..5ef7f0586 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnTaskRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
@@ -1,9 +1,11 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVAL_ASSIGNER_LIMIT_NUMBER;
+
/**
* 流程模型响应码
*
@@ -31,10 +33,19 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
DUMMY_TASK_CREATED_ERROR("016", "流程实例 ID【{}】: 不存在, 不允许创建机器人节点"),
TASK_HAS_BEEN_COMPLETE("017", "审批任务已被处理"),
FIND_TASK_BY_PERSON_ID_ERROR("018", "流程实例中:【{}】未查找指定自然人:【{}】的待处理的流程任务!"),
+ PROCESS_INSTANCE_IS_NOT_EXIST("019", "Execution:{} 对应流程实例不存在,流程状态异常!"),
+ TASK_TYPE_MISMATCH("020", "节点类型不匹配,当前节点类型:【{}】,指定节点类型:【{}】!"),
+ PROCESS_CANT_SET_ASSIGNEE("021", "当前审批状态不允许设置审批人"),
+ ASSIGNER_NUMBER_EXCEEDS_NUMBER_LIMIT("022", String.format("人员数量超过限制,节点审批人限制数量为: %d!", APPROVAL_ASSIGNER_LIMIT_NUMBER)),
+ BACK_TARGET_ACTIVITY_NOT_EXISTS("023", "回退到指定节点【{}】失败!"),
+ BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
+ REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
+ TRANSFER_TO_SELF("026", "任务不能转交给自己"),
+ REMIND_TASK_TOO_MANY("027", "催办任务数据异常")
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -46,13 +57,4 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnVariablesRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnVariablesRespCode.java
new file mode 100644
index 000000000..e14b81a85
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnVariablesRespCode.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.code;
+
+import cn.axzo.framework.domain.web.code.IModuleRespCode;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum BpmnVariablesRespCode implements IModuleRespCode {
+ PROCESS_VARIABLE_NOT_EXIST("001", "流程实例【{}】不存在名称为:【{}】的变量"),
+ PROCESS_VARIABLE_EXIST("002", "变量【{}】已存在流程实例【{}】中"),
+ PROCESS_VARIABLE_SCOPE_ERROR("003", "变量【{}】的作用域为【{}】不支持"),
+ PROCESS_VARIABLE_NAME_MUST_BE_NOT_NULL("004", "变量的名称不能为空"),
+ PROCESS_VARIABLE_VARS_NOT_NULL("005", "流程变量列表参数不能为空"),
+ ;
+
+
+ private final String code;
+ private final String message;
+
+ @Override
+ public String getModuleCode() {
+ return "12";
+ }
+
+ @Override
+ public String getProjectCode() {
+ return "998";
+ }
+
+ @Override
+ public String getCode() {
+ return code;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/CategoryRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/CategoryRespCode.java
similarity index 78%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/CategoryRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/CategoryRespCode.java
index cca3ac338..ca601a73e 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/CategoryRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/CategoryRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -21,8 +21,8 @@ public enum CategoryRespCode implements IModuleRespCode {
CATEGORY_CONFIG_EXISTS("006", "分类【{}】的【{}】配置中已存在重复数据"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -34,13 +34,5 @@ public enum CategoryRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/ConvertorRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/ConvertorRespCode.java
similarity index 82%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/ConvertorRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/ConvertorRespCode.java
index 84ea0fb9c..073d3e6b6 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/ConvertorRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/ConvertorRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -23,8 +23,8 @@ public enum ConvertorRespCode implements IModuleRespCode {
CONVERTOR_OPERATION_CHECKBOX_TYPE_ERROR("008", "条件节点(复选)运算符【{}】暂不支持"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -36,13 +36,4 @@ public enum ConvertorRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FlowableEngineRespCode.java
similarity index 56%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FlowableEngineRespCode.java
index cdc9f933d..5915f3b99 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FlowableEngineRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -16,11 +16,14 @@ public enum FlowableEngineRespCode implements IModuleRespCode {
ENGINE_EXECUTION_LOST_ID_ERROR("001", "Execution 丢失"),
ENGINE_USER_TASK_CALC_ERROR("002", "计算用户任务节点【nodeId:{}】的审批人发生异常, 配置类型:【{}】, 异常信息:【{}】"),
ENGINE_USER_TASK_TYPE_NOT_SUPPORT("003", "审批指定方式暂不支持"),
- ENGINE_USER_TASK_PARAM_ERROR("004", "构建后的查询审批人入参为空. 任务节点【nodeId:{}】, 审批人所在范围:【{}】"),
+ ENGINE_USER_TASK_PARAM_ERROR("004", "构建后的查询审批人入参为空. 任务节点【nodeId:{}】, 该节点选择的\"审批人所在范围\"是:【{}】,请检查 cooperationOrg 参数"),
+ ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"),
+ ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"),
+ ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -32,13 +35,4 @@ public enum FlowableEngineRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormDefinitionRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormDefinitionRespCode.java
similarity index 50%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormDefinitionRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormDefinitionRespCode.java
index 4f1e9901b..fd7610380 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormDefinitionRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormDefinitionRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -13,12 +13,11 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FormDefinitionRespCode implements IModuleRespCode {
- FORM_DEFINITION_NOT_EXISTS("001", "表单定义内容转换出错, 建议重新修改表单定义后重试"),
- FORM_DEFINITION_PARSER_ERROR("002", "表单定义内容解析出错"),
+ FORM_DEFINITION_EXISTS("001", ""),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -30,13 +29,4 @@ public enum FormDefinitionRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java
new file mode 100644
index 000000000..8b878fffe
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java
@@ -0,0 +1,52 @@
+package cn.axzo.workflow.common.code;
+
+import cn.axzo.framework.domain.web.code.IModuleRespCode;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 表单实例相关响应码
+ *
+ * @author wangli
+ * @since 2024-11-13 14:34
+ */
+@Getter
+@AllArgsConstructor
+public enum FormInstanceRespCode implements IModuleRespCode {
+ FORM_PARAM_ERROR("001", "流程实例 ID 和任务 ID 不能都为空"),
+ FORM_FIELD_NOT_FOUND("002", "无法获取全量表单字段权限配置信息"),
+ FORM_FIELD_VALIDATOR_ERROR("003", "表单字段校验不通过"),
+ FORM_INSTANCE_PARSE_ERROR("004", "表单实例数据解析错误"),
+ FORM_INSTANCE_DATA_NOT_FOUND("005", "未找到指定实例【{}】的表单数据"),
+ FORM_DATA_PARSE_ERROR("006", "表单数据解析异常"),
+ FORM_DATA_PARSE_ERROR_BY_UPLOAD("007", "表单上传组件的数据解析异常"),
+ FORM_DATA_PARSE_ERROR_BY_IMAGE("008", "表单图片组件的数据解析异常"),
+ FORM_DATA_PARSE_ERROR_BY_CUSTOM_COMPONENT("009", "表单自定义组件的数据解析异常"),
+ FORM_DATA_PARSE_ERROR_BY_AMOUNT("010", "表单金额组件的数据解析异常"),
+ ;
+
+ private final String code;
+ private final String message;
+
+ @Override
+ public String getModuleCode() {
+ return "13";
+ }
+
+ @Override
+ public String getProjectCode() {
+ return "998";
+ }
+
+ @Override
+ public String getCode() {
+ return code;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormModelRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
similarity index 62%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormModelRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
index 4650677ee..8742fc036 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FormModelRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -13,12 +13,13 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FormModelRespCode implements IModuleRespCode {
- FORM_MODEL_NOT_EXISTS("001", "表单模型不存在"),
+ FORM_MODEL_NOT_EXISTS("001", "表单模型不存在,请检查审批模板的字段管理Tab页"),
FORM_MODEL_ID_NOT_EXISTS("002", "表单模型ID【{}】不存在"),
+ FORM_MODEL_EXISTS("003", "表单模型已存在"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -30,13 +31,4 @@ public enum FormModelRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/OtherRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
similarity index 56%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/OtherRespCode.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
index 9c473fb18..c8d4f93f3 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/OtherRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.code;
+package cn.axzo.workflow.common.code;
import cn.axzo.framework.domain.web.code.IModuleRespCode;
import lombok.AllArgsConstructor;
@@ -17,11 +17,15 @@ public enum OtherRespCode implements IModuleRespCode {
REPEAT_SUBMIT_TIME_ERROR_TIPS("002", "重复提交间隔时间不能小于{}秒"),
REPEAT_SUBMIT_ERROR_TIPS("003", "{}"),
CLIENT_VERSION_SUPPORT("004", "客户端 JAR 包版本不支持,请升级到 {} 版本, 当前版本 {}"),
- MICRO_SERVER_NEED_REBUILD("005", "微服务 {} 需要重新编译发布"),
+ MICRO_SERVER_NEED_REBUILD("005", "微服务 {} 需要重新编译发布, 如果是本地调用,请访问 WebApi 接口,在现有的接口地址前加上“web/v1/”即可"),
+ MESSAGE_PUSH_EVENT_BUILD_ERROR("006", "不能使用 createEvent 函数创建`发送待办`的事件, 请调用 createPendingPushEvent 函数"),
+ ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"),
+ ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"),
+ MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"),
;
- private String code;
- private String message;
+ private final String code;
+ private final String message;
@Override
public String getModuleCode() {
@@ -33,12 +37,4 @@ public enum OtherRespCode implements IModuleRespCode {
return "998";
}
- public void setCode(String code) {
- this.code = code;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
index 5f801a1ce..eae75fd51 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
@@ -9,7 +9,10 @@ public interface BpmnConstants {
/**
* 引擎自己的隐藏指令
*/
+ String ADSCRIPTION_TENANT_ID = "adscriptionTenantId";
String FLOWABLE_SKIP_EXPRESSION_ENABLE = "[_FLOWABLE_SKIP_EXPRESSION_ENABLED_]";
+ String MQ_UNIQUE_ID = "[_MQ_UNIQUE_ID_]";
+ String PROCESS_OWNERSHIP_APPLICATION = "[_PROCESS_OWNERSHIP_APPLICATION_]";
String WORKFLOW_ENGINE_VERSION = "[_WORKFLOW_ENGINE_VERSION_]";
String INTERNAL_INITIATOR = "[_INTERNAL_INITIATOR_]";
@Deprecated
@@ -29,7 +32,9 @@ public interface BpmnConstants {
String BIZ_ORG_RELATION = "[_BIZ_ORG_RELATION_]";
String PENDING_TEMPLATE_VARIABLE = "[_PENDING_VARIABLES]";
String INTERNAL_PROCESS_AGENT = "[_INTERNAL_PROCESS_AGENT]";
+ String CREATE_INSTANCE_PARAMS = "[_CREATE_INSTANCE_PARAMS]";
String INTERNAL_PROCESS_WORKSPACE_TYPE = "[_INTERNAL_PROCESS_WORKSPACE_TYPE]";
+ String INTERNAL_PROCESS_BIZ_TYPE = "[_INTERNAL_PROCESS_BIZ_TYPE]";
// 用于多实例审批时,保存计算出来的审批人
String INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO = "[_ASSIGNEE_LIST_INFO_]";
// 单任务节点,
@@ -37,6 +42,9 @@ public interface BpmnConstants {
@Deprecated
String OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT = "[_ASSIGNEE_INFO_SNAPSHOT_]";
String INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT = "[_ACTIVITY_INFO_SNAPSHOT_]";
+ String BIZ_NODE_ALTER = "[_BIZ_NODE_ALTER_]";
+ String INITIATOR_SPECIFY = "[_INITIATOR_SPECIFY_]";
+ String SIGNATURE_COLLECTION = "[_SIGNATURE_COLLECTION_]";
String PROCESS_PREFIX = "Flowable";
@Deprecated
String OLD_TASK_ASSIGNEE_SKIP_FLAT = "taskSkip";
@@ -50,15 +58,33 @@ public interface BpmnConstants {
String ROBOT_ASSIGNEE_ID = NO_TENANT_ID + "|" + ROBOT_ASSIGNEE + "|" + ROBOT_ASSIGNEE_TYPE;
String HIDDEN_ASSIGNEE_ID = NO_TENANT_ID + "|hidden|" + TASK_ASSIGNEE_SKIP_FLAT;
String NO_ASSIGNEE = "|";
+ String FLOW_MODEL_BIZ_TYPE = "modelType";
String FLOW_NODE_JSON = "jsonValue";
String FLOW_SERVER_VERSION = "serverVersion";
String FLOW_SERVER_VERSION_121 = "1.2.1";
String FLOW_SERVER_VERSION_130 = "1.3.0";
+ // 1.4.2 开始启用新版本日志
+ String FLOW_SERVER_VERSION_142 = "1.4.2";
+ String CONFIG_SIGN = "signConfig";
String CONFIG_NOTICE = "noticeConfig";
- String TEMPLATE_NOTICE_MESSAGE_ID = "noticeMessageId";
+ String CONFIG_APPROVE = "approveConfig";
+ String TEMPLATE_NOTICE_MESSAGE_CONFIG = "noticeMessageConfig";
+ String TEMPLATE_NOTICE_MESSAGE_EVENTS = "noticeMessageEvents";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION = "noticeMessageDestination";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION_INITIATOR = "initiator";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION_HISTORIES = "histories";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES = "roles";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION_POSITIONS = "positions";
+ String TEMPLATE_NOTICE_MESSAGE_DESTINATION_ASSIGNERS = "assigners";
String TEMPLATE_PENDING_MESSAGE_ID = "pendingMessageId";
+ String TEMPLATE_SIGN_PENDING_MESSAGE_ID = "signPendingMessageId";
String TEMPLATE_CARBON_COPY_MESSAGE_ID = "carbonCopyMessageId";
String TEMPLATE_SMS_MESSAGE_ID = "smsMessageId";
+ String TEMPLATE_UPGRADE_APPROVAL_CONF = "upgradeApprovalConf";
+ String TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF = "limitConfig";
+ String TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE = "specifyValue";
+ String APPROVE_SUPPORT_BATCH_OPERATION = "supportBatchOperation";
+ String APPROVE_USER_AGREE_SIGNATURE = "userAgreeSignature";
String CONFIG_BUTTON = "buttonConfig";
String CONFIG_CARBON_COPIES = "carbonCopyConfigs";
String CONFIG_CARBON_COPY = "carbonCopyConfig";
@@ -68,10 +94,14 @@ public interface BpmnConstants {
String CONFIG_BUTTON_META = "button";
String CONFIG_FIELD = "fieldConfig";
String CONFIG_APPROVAL_METHOD = "approvalMethod";
+ String CONFIG_SIGN_APPROVER_LIMIT = "signApproverLimit";
+ String CONFIG_SIGN_APPROVER_ORG_LIMIT = "orgLimit";
+ String CONFIG_SIGN_APPROVER_ROLE_LIMIT = "roleLimit";
String CONFIG_APPROVER_SCOPE = "approverScope";
String CONFIG_APPROVER_SPECIFY = "approverSpecify";
String CONFIG_APPROVER_MODE_TYPE = "approverModeType";
String CONFIG_APPROVER_EMPTY_HANDLE_TYPE = "approverEmptyHandleType";
+ String CONFIG_ACTIVITY_SIGNATURE = "signature";
String CONFIG_FIELD_META = "field";
String CONFIG_FIELD_PERMISSION = "fieldPermission";
String CONFIG_FIELD_OPTION = "option";
@@ -80,6 +110,7 @@ public interface BpmnConstants {
String CONFIG_BUTTON_TYPE_CURRENT = "current";
String CONFIG_BUTTON_TYPE_HISTORY = "history";
String CONFIG_BUTTON_TYPE_CARBON_COPY = "carbonCopy";
+ String CONFIG_SIGN_TYPE = "signType";
String ELEMENT_ATTRIBUTE_NAME = "name";
String ELEMENT_ATTRIBUTE_VALUE = "value";
String ELEMENT_ATTRIBUTE_DESC = "desc";
@@ -89,11 +120,16 @@ public interface BpmnConstants {
String ELEMENT_ATTRIBUTE_CHECKED = "checked";
String ELEMENT_ATTRIBUTE_DISABLED = "disabled";
String ELEMENT_ATTRIBUTE_TYPE = "type";
+ String ELEMENT_ATTRIBUTE_ORG_LIMIT = "orgLimit";
+ String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY = "approverSpecify";
String START_EVENT_ID = "startEventNode";
String SEQUENCE_FLOW_ID = "SequenceFlowId";
String END_EVENT_ID = "endEventNode";
String BPM_MODEL_CATEGORY = "bpm_model_category";
String BPM_ALLOW_SKIP_USER_TASK = "_INTERNAL_SKIP_USER_TASK_";
+ String AUTO_APPROVAL_TYPE = "autoApprovalType";
+ String PROCESS_CLOSING_TYPE = "[_PROCESS_CLOSING_TYPE]";
+ String SKIP_MQ = "skipMQ";
/**
* 用于国内审批节点填写审批建议
*
@@ -106,6 +142,8 @@ public interface BpmnConstants {
String NUMBER_OF_INSTANCES = "nrOfInstances";
String MULTI_INSTANCE_LOOP_COUNTER = "loopCounter";
String TASK_COMPLETE_OPERATION_TYPE = "_TASK_COMPLETE_TYPE";
+ String TASK_ATTACHMENTS_VAR_NAME = "TASK_ATTACHMENTS";
+
/**
* 会签表达式
*/
@@ -130,4 +168,85 @@ public interface BpmnConstants {
*/
Integer DISABLED = 0;
+ /**
+ * 手写签配置默认值
+ */
+ Boolean USER_AGREE_SIGNATURE_DEFAULT_VALUE = true;
+
+ /**
+ * 批量操作配置默认值
+ */
+ Boolean SUPPORT_BATCH_OPERATION_DEFAULT_VALUE = false;
+ /**
+ * 用于 MQ 的 Header, 记录当前事件的归属应用
+ */
+ String MQ_OWNERSHIP_APPLICATION = "MQ_OWNERSHIP_APPLICATION";
+ String MQ_OWNERSHIP_PROCESS_DEFINITION_KEY = "MQ_OWNERSHIP_PROCESS_DEFINITION_KEY";
+
+ /**
+ * 审批人数量限制
+ */
+ Integer APPROVAL_ASSIGNER_LIMIT_NUMBER = 60;
+
+ /**
+ * 抄送人员数量限制
+ */
+ Integer CARBON_ASSIGNER_LIMIT_NUMBER = 100;
+
+ /**
+ * MQ消息每批次人员数量
+ */
+ Integer MQ_ASSIGNER_BATCH_SIZE = 20;
+
+ /**
+ * 加签显示人员数量
+ */
+ Integer COUNTERSIGN_ASSIGNER_SHOW_NUMBER = 2;
+ /**
+ * 重置任务审批人显示人员数量
+ */
+ Integer RESET_TASK_ASSIGNER_SHOW_NUMBER = 2;
+
+ /**
+ * 回退操作次数上限
+ */
+ Integer MAX_BACKED_OPERATE_COUNT = 20;
+ String LATEST_SYNC_TO_ELASTICSEARCH_TIME = "latest.sync.to.elasticsearch.time";
+ /**
+ * 固定父子文档在相同分片
+ */
+ String ES_FIXED_ROUTING = "workflow_engine_join_routing";
+
+ /**
+ * ouId+workspaceId 下限制人员数量为20
+ */
+ Integer MAX_ORG_WORKSPACE_ADMIN_COUNT = 20;
+
+ /**
+ * 发起人撤回时,当前流程停留住的节点定义key
+ */
+ String CANCEL_PROCESS_NODE_DEF_KEY_NAME = "[_CANCEL_PROCESS_NODE_DEF_KEY_]";
+ // 被转交人
+ String TRANSFER_TO = "[TRANSFER_TO_]";
+ // 转交时的意见
+ String TRANSFER_TO_ADVICE = "[TRANSFER_TO_ADVICE]";
+ // 结束流程的最后一个操作人
+ String CLOSE_PROCESS_ASSIGNER = "[_CLOSE_PROCESS_ASSIGNER_]";
+ /**
+ * 签署业务发起流程实例时,重新选择的文档tag 集合
+ */
+ String SIGN_PROCESS_ENABLE_DOC_IDS = "[_SIGN_PROCESS_ENABLE_DOC_IDS_]";
+ /**
+ * 签署业务,基于业务自定义变量的传入
+ */
+ String SIGN_VARIABLE = "[_SIGN_VARIABLES_]";
+ /**
+ * 签署人
+ */
+ String SIGNATORIES = "[_SIGNATORIES_]";
+ String TASK_SUBMIT_FORM_VARIABLE = "[_TASK_SUBMIT_FORM_VARIABLE_]";
+ /**
+ * 提级审批变量标识
+ */
+ String SUPPORT_UPGRADE_VARIABLE = "[_SUPPORT_UPGRADE_]";
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java
new file mode 100644
index 000000000..5bbe9334b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java
@@ -0,0 +1,29 @@
+package cn.axzo.workflow.common.constant;
+
+/**
+ * 表单引擎相关的常量
+ *
+ * @author wangli
+ * @since 2024-11-05 10:20
+ */
+public interface FormConstants {
+
+ String FIELD_PROPERTY_REQUIRED = "required";
+
+ String FIELD_PROPERTY_EDITABLE = "editable";
+
+ String FIELD_PROPERTY_READONLY = "readonly";
+
+ String FIELD_PROPERTY_HIDDEN = "hidden";
+
+ String FIELD_PROPERTY_DEFAULT_VALUE= "defaultValue";
+
+ String FORM_FIELD_TYPE_INPUT = "input";
+ String FORM_FIELD_TYPE_TEXTAREA = "textarea";
+ String FORM_FIELD_TYPE_IMAGE = "image";
+ String FORM_FIELD_TYPE_CUSTOM_COMPONENT = "customComponent";
+ String FORM_FIELD_TYPE_TASK_ORDER = "taskOrder";
+ String FORM_FIELD_TYPE_RECTIFY_ORDER = "rectifyOrder";
+ String FORM_FIELD_TYPE_CHANGE_SIGNATURE_ORDER = "changeSignatureOrder";
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/LogFieldConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/LogFieldConstants.java
new file mode 100644
index 000000000..900b8a452
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/LogFieldConstants.java
@@ -0,0 +1,6 @@
+package cn.axzo.workflow.common.constant;
+
+public interface LogFieldConstants {
+
+ String X_REQUEST_ID = "x-request-id";
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/StarterConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/StarterConstants.java
new file mode 100644
index 000000000..66747128f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/StarterConstants.java
@@ -0,0 +1,16 @@
+package cn.axzo.workflow.common.constant;
+
+/**
+ * Starter 常量类
+ *
+ * @author wangli
+ * @since 2024/5/29 11:13
+ */
+public interface StarterConstants {
+ String STARTER_INVOKE_MODE = "WORKFLOW-ENGINE-STARTER-INVOKE-MODE";
+ String DEBUGGING_MQ_SUFFIX = "_debugging";
+ String K8S_POD_NAME_SPACE = "MY_POD_NAMESPACE";
+ String NACOS_PROFILES_ACTIVE = "NACOS_PROFILES_ACTIVE";
+ String MQ_GID_NAME_SEGMENT = "GID_SEGMENT";
+ String ENABLE_MANAGEABLE = "ENABLE_MANAGEABLE";
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java
new file mode 100644
index 000000000..6e2d7a1ac
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java
@@ -0,0 +1,12 @@
+package cn.axzo.workflow.common.constant;
+
+/**
+ * 自定义的流程回退及转发事件常亮
+ *
+ * @author wangli
+ * @since 2025-01-20 14:06
+ */
+public interface TaskListenerExtConstants {
+ String EVENTNAME_TRANSFER = "process-task-transfer";
+ String EVENTNAME_FALLBACK = "process-task-fallback";
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
index 74b6c8515..b0ae9caa8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
@@ -24,4 +24,41 @@ public interface VariableConstants {
String VAR_ACTIVITY_NAME = "activityName";
String VAR_PROCESS_RESULT = "processResult";
String VAR_OPERATOR_TYPE = "operatorType";
+ String VAR_USER_AGREE_SIGNATURE = "userAgreeSignature";
+
+
+ //=============== 打印时的变量集合中 key 的命名 =================
+ String VAR_PREFIX = "业务变量";
+ String PRINT_VAR_PROCESS_DEFINITION_KEY = "processDefinitionKey";
+ String PRINT_VAR_PROCESS_DEFINITION_KEY_DESC = "业务名称";
+ String PRINT_VAR_PROCESS_INSTANCE_ID = "processInstanceId";
+ String PRINT_VAR_PROCESS_INSTANCE_ID_DESC = "审批编号";
+ String PRINT_VAR_PROCESS_START_TIME = "startTime";
+ String PRINT_VAR_PROCESS_START_TIME_DESC = "发起时间";
+ String PRINT_VAR_PROCESS_END_TIME = "endTime";
+ String PRINT_VAR_PROCESS_END_TIME_DESC = "审批结束时间";
+ String PRINT_VAR_PROCESS_INITIATOR = "initiator";
+ String PRINT_VAR_PROCESS_INITIATOR_DESC = "发起者";
+ String PRINT_VAR_PROCESS_INITIATOR_NAME = "initiatorName";
+ String PRINT_VAR_PROCESS_INITIATOR_NAME_DESC = "发起人姓名";
+ String PRINT_VAR_PROCESS_INITIATOR_POSITION = "initiatorPosition";
+ String PRINT_VAR_PROCESS_INITIATOR_POSITION_DESC = "发起人岗位";
+ String PRINT_VAR_PROCESS_INITIATOR_PHONE = "initiatorPhone";
+ String PRINT_VAR_PROCESS_INITIATOR_PHONE_DESC = "发起人联系方式";
+ String PRINT_VAR_PROCESS_LOGS = "processLogs";
+ String PRINT_VAR_PROCESS_LOGS_DESC = "审批日志";
+ String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME = "activityName";
+ String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC = "节点名称";
+ String PRINT_VAR_PROCESS_LOG_APPROVER_NAME = "approverName";
+ String PRINT_VAR_PROCESS_LOG_APPROVER_NAME_DESC = "审批人";
+ String PRINT_VAR_PROCESS_LOG_UNIT = "unit";
+ String PRINT_VAR_PROCESS_LOG_UNIT_DESC = "单位";
+ String PRINT_VAR_PROCESS_LOG_POSITION = "position";
+ String PRINT_VAR_PROCESS_LOG_POSITION_DESC = "岗位";
+ String PRINT_VAR_PROCESS_LOG_ADVICE = "advice";
+ String PRINT_VAR_PROCESS_LOG_ADVICE_DESC = "审批意见";
+ String PRINT_VAR_PROCESS_LOG_OPERATION_TIME = "operationTime";
+ String PRINT_VAR_PROCESS_LOG_OPERATION_TIME_DESC = "审批时间";
+ String PRINT_VAR_PROCESS_LOG_SIGNATURE = "signature";
+ String PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC = "电子签名";
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentConstraintValidator.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentConstraintValidator.java
new file mode 100644
index 000000000..fb7fd0603
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentConstraintValidator.java
@@ -0,0 +1,72 @@
+package cn.axzo.workflow.common.constraint;
+
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.List;
+
+/**
+ * 附件校验器
+ *
+ * @author wangli
+ * @since 2024/4/22 15:15
+ */
+public class AttachmentConstraintValidator implements ConstraintValidator> {
+
+ private AttachmentTypeValidator[] typeConstraints;
+
+ @Override
+ public void initialize(AttachmentValidator constraintAnnotation) {
+ this.typeConstraints = constraintAnnotation.types();
+ }
+
+ @Override
+ public boolean isValid(List attachments, ConstraintValidatorContext context) {
+ if (attachments == null || attachments.isEmpty()) {
+ return true; // No attachments, so no validation needed
+ }
+ boolean isValid = true;
+
+ for (AttachmentTypeValidator typeConstraint : typeConstraints) {
+ AttachmentTypeEnum type = typeConstraint.type();
+ int minAllowed = typeConstraint.min();
+ int maxAllowed = typeConstraint.max();
+ int count = getCountOfType(attachments, type);
+
+ // Check if min or max is not limited
+ boolean minNotLimited = minAllowed == -1;
+ boolean maxNotLimited = maxAllowed == Integer.MAX_VALUE;
+
+ if (!minNotLimited && count < minAllowed) {
+ addErrorMessage(context, typeConstraint.type().getDesc() + "数量最小支持" + minAllowed + "个");
+ isValid = false; // Validation failed due to min limit
+ }
+
+ if (!maxNotLimited && count > maxAllowed) {
+ addErrorMessage(context, typeConstraint.type().getDesc() + "数量最大支持" + maxAllowed + "个");
+ isValid = false; // Validation failed due to max limit
+ }
+ }
+
+ return isValid; // Validation passed
+ }
+
+ // Helper method to count attachments of a specific type
+ private int getCountOfType(List attachments, AttachmentTypeEnum type) {
+ int count = 0;
+ for (AttachmentDTO attachment : attachments) {
+ if (attachment.getType().equals(type)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private void addErrorMessage(ConstraintValidatorContext context, String message) {
+ context.disableDefaultConstraintViolation();
+ context.buildConstraintViolationWithTemplate(message)
+ .addConstraintViolation();
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentTypeValidator.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentTypeValidator.java
new file mode 100644
index 000000000..949cbcc98
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentTypeValidator.java
@@ -0,0 +1,41 @@
+package cn.axzo.workflow.common.constraint;
+
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 工作流主要操作时, 附件的校验
+ *
+ * @author wangli
+ * @since 2024/4/22 15:17
+ */
+@Target({ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AttachmentTypeValidator {
+
+ /**
+ * 指定的附件类型
+ *
+ * @return
+ */
+ AttachmentTypeEnum type();
+
+ /**
+ * 最小个数: -1 不限制
+ *
+ * @return
+ */
+ int min() default -1;
+
+ /**
+ * 最大个数: -1 不限制
+ *
+ * @return
+ */
+ int max() default Integer.MAX_VALUE;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentValidator.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentValidator.java
new file mode 100644
index 000000000..05730791c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constraint/AttachmentValidator.java
@@ -0,0 +1,31 @@
+package cn.axzo.workflow.common.constraint;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 工作流主要操作时, 附件的校验
+ *
+ * @author wangli
+ * @since 2024/4/22 15:17
+ */
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = AttachmentConstraintValidator.class)
+@Documented
+public @interface AttachmentValidator {
+
+ String message() default "附件校验不通过";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+
+ AttachmentTypeValidator[] types();
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminDataSource.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminDataSource.java
new file mode 100644
index 000000000..71b281745
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminDataSource.java
@@ -0,0 +1,17 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AdminDataSource {
+ SYSTEM_ENTRY("systemEntry", "系统录入"),
+ USER_ENTRY("userEntry", "用户手动录入");
+
+ private final String type;
+ private final String desc;
+
+ AdminDataSource(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminRoleType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminRoleType.java
new file mode 100644
index 000000000..4fa15948f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminRoleType.java
@@ -0,0 +1,19 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AdminRoleType {
+ ORGANIZATION_ADMIN("organizationAdmin", "单位超管"),
+ ORG_WORKSPACE_ADMIN("organizationWorkspaceAdmin", "项目内单位负责人"),
+ WORKSPACE_ADMIN("workspaceAdmin", "项目超管"),
+ OTHER("other", "其他用户");
+
+ private final String type;
+ private final String desc;
+
+ AdminRoleType(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminTypeEnum.java
new file mode 100644
index 000000000..69bae7fe2
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AdminTypeEnum.java
@@ -0,0 +1,20 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 审批管理员类型
+ */
+@Getter
+public enum AdminTypeEnum {
+ SUPER_ADMIN("super_admin", "超级管理员"),
+ COMMON_ADMIN("common_admin", "普通管理员");
+
+ private final String type;
+ private final String desc;
+
+ AdminTypeEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
index 81f213001..5b8ab0b5e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
@@ -1,5 +1,8 @@
package cn.axzo.workflow.common.enums;
+import java.util.Arrays;
+import java.util.Objects;
+
/**
* 审批方式枚举
*
@@ -10,9 +13,12 @@ public enum ApprovalMethodEnum {
human("human", "人工审批", ""),
autoPassed("autoPassed", "自动通过", "[仅审批节点可能选该值]"),
+ autoPassed_empty("autoPassed", "自动通过", "该枚举仅日志处理使用"),
autoRejection("autoRejection", "自动驳回", "[仅审批节点可能选该值]"),
+ autoRejection_empty("autoRejection", "自动驳回", "该枚举仅日志处理使用"),
nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"),
bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"),
+ transferToAdmin("transferToAdmin", "转办给管理员", "该枚举仅日志处理使用"),
;
private String type;
@@ -48,4 +54,11 @@ public enum ApprovalMethodEnum {
public void setRemark(String remark) {
this.remark = remark;
}
+
+ public static ApprovalMethodEnum valueOfType(String type) {
+ return Arrays.stream(ApprovalMethodEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverScopeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverScopeEnum.java
index fb72f58ca..bde13f062 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverScopeEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverScopeEnum.java
@@ -11,6 +11,7 @@ import java.util.Objects;
*/
public enum ApproverScopeEnum {
entWorkspace("entWorkspace", "企业工作台", "entWorkspaceProcessor"),
+ govWorkspace("govWorkspace", "政务工作台", "govWorkspaceProcessor"),
projectWorkspace("projectWorkspace", "项目工作台","projectWorkspaceProcessor"),
preTaskUser("preTaskUser", "上节点审批人所在单位","preTaskUserProcessor"),
preTaskSpecified("preTaskSpecified", "上节点审批人指定","preTaskUserProcessor"),
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
index 85dbab935..8b18cd082 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
@@ -15,6 +15,9 @@ public enum ApproverSpecifyEnum {
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管"),
fixedPerson("fixedPerson", "固定人员"),
preNodeSpecified("preNodeSpecified", "上级节点指定"),
+ initiatorSpecified("initiatorSpecified", "发起时指定"),
+ // 该枚举,目前主要为了区别签署业务与审批业务的不同配法,选择该项时,意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
+ signerRelated("signerRelated", "签署人相关组织"),
;
private String type;
private String desc;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AutoApprovalTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AutoApprovalTypeEnum.java
new file mode 100644
index 000000000..91189769d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/AutoApprovalTypeEnum.java
@@ -0,0 +1,35 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+import org.springframework.util.StringUtils;
+
+/**
+ * 自动过审参数
+ */
+
+@Getter
+public enum AutoApprovalTypeEnum {
+
+ NO_AUTO_APPROVAL("noAutoApproval", "不自动过审"),
+ CONTINUOUS_NODES_AUTO_APPROVAL("continuousNodesAutoApproval", "连续节点自动过审");
+
+ private final String type;
+ private final String desc;
+
+ AutoApprovalTypeEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public static AutoApprovalTypeEnum fromType(String type) {
+ if (!StringUtils.hasText(type)) {
+ return null;
+ }
+ for (AutoApprovalTypeEnum typeEnum : AutoApprovalTypeEnum.values()) {
+ if (typeEnum.type.equals(type)) {
+ return typeEnum;
+ }
+ }
+ return null;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
index 2daf65036..b8dea2f0f 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
@@ -1,6 +1,13 @@
package cn.axzo.workflow.common.enums;
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+import static cn.axzo.workflow.common.enums.BusinessTypeEnum.APPROVAL;
+import static cn.axzo.workflow.common.enums.BusinessTypeEnum.SIGN;
+
/**
* Flowable Event Enum For RocketMQ
*
@@ -11,35 +18,56 @@ public enum BpmnButtonEnum {
/**
* 同意按钮
*/
- BPMN_APPROVE(1, "BPMN_APPROVE", "同意"),
+ BPMN_APPROVE(1, "BPMN_APPROVE", "同意", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 驳回按钮
*/
- BPMN_REJECT(2, "BPMN_REJECT", "驳回"),
+ BPMN_REJECT(2, "BPMN_REJECT", "驳回", Lists.newArrayList(APPROVAL, SIGN)),
+ /**
+ * 确认签字
+ */
+ BPMN_CONFIRM_SIGN(3, "BPMN_CONFIRM_SIGN", "确认签字", Lists.newArrayList(SIGN)),
+ /**
+ * 查看文档
+ */
+ BPMN_VIEW_DOC(4, "BPMN_VIEW_DOC", "查看文档", Lists.newArrayList(SIGN)),
/**
* 撤回按钮
*/
- BPMN_REVOCATION(3, "BPMN_REVOCATION", "撤回"),
+ BPMN_REVOCATION(5, "BPMN_REVOCATION", "撤回", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 转交按钮
*/
- BPMN_TRANSFER(4, "BPMN_TRANSFER", "转交"),
+ BPMN_TRANSFER(6, "BPMN_TRANSFER", "转交", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 加签按钮
*/
- BPMN_COUNTERSIGN(5, "BPMN_COUNTERSIGN", "加签"),
+ BPMN_COUNTERSIGN(7, "BPMN_COUNTERSIGN", "加签", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 评论按钮
*/
- BPMN_COMMENT(6, "BPMN_COMMENT", "评论"),
+ BPMN_COMMENT(8, "BPMN_COMMENT", "评论", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 回退按钮
*/
- BPMN_ROLLBACK(7, "BPMN_ROLLBACK", "回退"),
+ BPMN_ROLLBACK(9, "BPMN_ROLLBACK", "回退", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 抄送按钮
*/
- BPMN_COPY(8, "BPMN_COPY", "抄送");
+ BPMN_COPY(10, "BPMN_COPY", "抄送", Lists.newArrayList(APPROVAL, SIGN)),
+ /**
+ * 提级审批按钮
+ */
+ BPMN_UPGRADE(12, "BPMN_UPGRADE", "提级审批", Lists.newArrayList(APPROVAL, SIGN)),
+ /**
+ * 催办按钮
+ */
+ BPMN_REMIND(11, "BPMN_REMIND", "催办", Lists.newArrayList(APPROVAL, SIGN)),
+ /**
+ * 管理员转交按钮
+ */
+ BPMN_ADMIN_TRANSFER(90, "BPMN_ADMIN_TRANSFER", "管理员转交", Lists.newArrayList());
+
public int getOrder() {
return order;
@@ -53,15 +81,21 @@ public enum BpmnButtonEnum {
return btnName;
}
+ public List getSupportBizType() {
+ return supportBizType;
+ }
+
private final int order;
private final String btnKey;
private final String btnName;
+ private final List supportBizType;
- BpmnButtonEnum(int order, String btnKey, String btnName) {
+ BpmnButtonEnum(int order, String btnKey, String btnName, List supportBizType) {
this.order = order;
this.btnKey = btnKey;
this.btnName = btnName;
+ this.supportBizType = supportBizType;
}
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java
index e812d2986..00bad8570 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java
@@ -1,6 +1,9 @@
package cn.axzo.workflow.common.enums;
+import java.util.Arrays;
+import java.util.Objects;
+
public enum BpmnFlowNodeMode {
GENERAL("GENERAL", "普通节点"),
OR("OR", "或签节点"),
@@ -35,4 +38,11 @@ public enum BpmnFlowNodeMode {
public void setDesc(String desc) {
this.desc = desc;
}
+
+ public static BpmnFlowNodeMode valueOfType(String type) {
+ return Arrays.stream(BpmnFlowNodeMode.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
}
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 c03147331..dfc36e971 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
@@ -1,6 +1,8 @@
package cn.axzo.workflow.common.enums;
+import org.springframework.util.StringUtils;
+
import java.util.Arrays;
import java.util.Objects;
@@ -14,6 +16,7 @@ public enum BpmnFlowNodeType {
NODE_PARALLEL("NODE_PARALLEL", "并行节点 - 隶属于并行网关"),
NODE_TASK("NODE_TASK", "审核节点"),
NODE_BUSINESS("NODE_BUSINESS", "业务节点"),
+ NODE_SIGN("NODE_SIGN", "签署确认节点"),
NODE_CARBON_COPY("NODE_CARBON_COPY", "抄送节点"),
NODE_TRIGGER("NODE_TRIGGER", "触发器节点"),
NODE_ROBOT("NODE_ROBOT", "机器人节点"),
@@ -52,6 +55,19 @@ public enum BpmnFlowNodeType {
this.desc = desc;
}
+ public static BpmnFlowNodeType getByType(String type) {
+ if (!StringUtils.hasText(type)) {
+ return null;
+ }
+ BpmnFlowNodeType[] values = BpmnFlowNodeType.values();
+ for (BpmnFlowNodeType value : values) {
+ if (value.getType().equals(type)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
public static BpmnFlowNodeType valueOfType(String type) {
return Arrays.stream(BpmnFlowNodeType.values())
.filter(i -> Objects.equals(i.getType(), type))
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnNoticeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnNoticeEnum.java
index d21af4fbc..562ad2c49 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnNoticeEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnNoticeEnum.java
@@ -1,6 +1,6 @@
package cn.axzo.workflow.common.enums;
-import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_CONFIG;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
@@ -12,7 +12,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAG
*/
public enum BpmnNoticeEnum {
- notice("notice", TEMPLATE_NOTICE_MESSAGE_ID, "通知模板"),
+ notice("notice", TEMPLATE_NOTICE_MESSAGE_CONFIG, "通知模板"),
pending("pending", TEMPLATE_PENDING_MESSAGE_ID, "待办模板"),
sms("sms", TEMPLATE_SMS_MESSAGE_ID, "短信模板"),
;
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 aa29c667a..e0f2ce964 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
@@ -45,7 +45,7 @@ public enum BpmnProcessInstanceResultEnum {
* @param result 结果
* @return 是否
*/
- public static boolean isEndResult(Integer result) {
+ public static boolean isEndResult(String result) {
return Arrays.asList(PROCESSING.getStatus(), APPROVED.getStatus(), REJECTED.getStatus(),
CANCELLED.getStatus()).contains(result);
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java
new file mode 100644
index 000000000..456dba759
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java
@@ -0,0 +1,29 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum BpmnProcessTaskResultEnum {
+ PENDING("PENDING", "待处理"),
+ APPROVED("APPROVED", "已同意"),
+ REJECTED("REJECTED", "已驳回"),
+ DELETED("DELETED", "已删除"),
+ CANCELED("CANCELED", "已撤销"),
+ TRANSFERRED("TRANSFERRED", "已转交"),
+ NONE("NONE", "没有执行动作,例如 抄送"),
+ ;
+ /**
+ * 结果
+ */
+ private final String status;
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ BpmnProcessTaskResultEnum(String status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java
new file mode 100644
index 000000000..fe46981d7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java
@@ -0,0 +1,42 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 签署方式
+ *
+ * @author wangli
+ * @since 2025-03-25 17:00
+ */
+public enum BpmnSignType {
+
+ SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"),
+ MULTI("MULTI", "指定人群,每人签署一份文件"),
+ ;
+
+ private final String type;
+ private final String desc;
+
+ BpmnSignType(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static BpmnSignType valueOfType(String type) {
+ return Arrays.stream(BpmnSignType.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java
new file mode 100644
index 000000000..c44af52b2
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java
@@ -0,0 +1,18 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum BusinessTypeEnum {
+
+ SIGN("sign", "签署业务"),
+
+ APPROVAL("approval", "审批业务");
+
+ private String type;
+ private String desc;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java
new file mode 100644
index 000000000..3f7dbdbbd
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ButtonVisibleScopeEnum {
+
+ INITIATOR("INITIATOR", "发起人"),
+
+ EXECUTOR("EXECUTOR", "当前操作人"),
+ ;
+
+ /**
+ * 结果
+ */
+ private final String status;
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ ButtonVisibleScopeEnum(String status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/CarbonCopyObjectType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/CarbonCopyObjectType.java
index 8ac0283a4..c4e8abee4 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/CarbonCopyObjectType.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/CarbonCopyObjectType.java
@@ -15,6 +15,10 @@ public enum CarbonCopyObjectType {
ent_position("ent_position", "position", "单位内指定岗位", "entWorkspaceProcessor"),
ent_identity("ent_identity", "identity", "单位内指定身份", "entWorkspaceProcessor"),
+ //政务系统
+ government_role("government_role", "role", "监管角色", "entWorkspaceProcessor"),
+ government_specify_user("government_specify_user", "specify_user", "监管指定人员", "entWorkspaceProcessor"),
+
// 项目下
project_role("project_role", "role", "项目部内指定角色", "projectWorkspaceProcessor"),
project_position("project_position", "position", "项目部内指定岗位", "projectWorkspaceProcessor"),
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java
new file mode 100644
index 000000000..c8eab6afe
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.enums;
+
+import cn.axzo.framework.rocketmq.Event;
+
+/**
+ * 流程模型关联的文档变更 MQ 事件枚举定义
+ *
+ * @author wangli
+ * @since 2025-04-07 16:46
+ */
+public enum DocChangeEventEnum {
+ DOC_CHANGE("doc", "doc-change", "模型关联文档变更"),
+ ;
+
+ private final String module;
+ private final String tag;
+ private final String desc;
+ private Event.EventCode eventCode;
+
+ DocChangeEventEnum(String module, String tag, String desc) {
+ this.eventCode = Event.EventCode.builder()
+ .module(module)
+ .name(tag)
+ .build();
+ this.module = module;
+ this.tag = tag;
+ this.desc = desc;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public String getTag() {
+ return tag;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Event.EventCode getEventCode() {
+ return eventCode;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ElasticSearchEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ElasticSearchEventEnum.java
new file mode 100644
index 000000000..7dc50600a
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ElasticSearchEventEnum.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.enums;
+
+import cn.axzo.framework.rocketmq.Event;
+
+/**
+ * 流程实例相关的 MQ 事件枚举定义
+ *
+ * @author wangli
+ * @since 2023/9/25 11:47
+ */
+public enum ElasticSearchEventEnum {
+
+ ELASTIC_SEARCH_SYNC("elastic-search", "elastic-search-sync", "同步实例数据到ES"),
+ ;
+ private final String module;
+ private final String tag;
+ private final String desc;
+ private Event.EventCode eventCode;
+
+ ElasticSearchEventEnum(String module, String tag, String desc) {
+ this.eventCode = Event.EventCode.builder()
+ .module(module)
+ .name(tag)
+ .build();
+ this.module = module;
+ this.tag = tag;
+ this.desc = desc;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public String getTag() {
+ return tag;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Event.EventCode getEventCode() {
+ return eventCode;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java
new file mode 100644
index 000000000..f170a4a50
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java
@@ -0,0 +1,11 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 模型扩展表的状态枚举
+ *
+ * @author wangli
+ * @since 2025-01-15 09:46
+ */
+public enum ExtModelStateFieldEnum {
+ status, printStatus
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java
new file mode 100644
index 000000000..ae3c22c02
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 文档类型枚举
+ *
+ * @author wangli
+ * @since 2025-03-27 09:55
+ */
+public enum FileTypeEnum {
+ WORD("word", "文本", ".docx"),
+ EXCEL("excel", "表格", ".xlsx"),
+ HIPRINT("hiprint", "智能文档", ""),
+ PDF("pdf", "PDF", ".pdf"),
+ ;
+ private final String type;
+ private final String desc;
+ private final String suffix;
+
+ FileTypeEnum(String type, String desc, String suffix) {
+ this.type = type;
+ this.desc = desc;
+ this.suffix = suffix;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public String getSuffix() {
+ return suffix;
+ }
+
+ public static FileTypeEnum valueOfType(String type) {
+ return Arrays.stream(FileTypeEnum.values())
+ .filter(i -> Objects.equals(i.getType().toUpperCase(), type.toUpperCase()))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java
new file mode 100644
index 000000000..a4d5c1bee
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 模型业务类型枚举
+ *
+ * @author wangli
+ * @since 2025-03-26 11:49
+ */
+public enum ModelBizTypeEnum {
+
+ SIGN("SIGN", "签署业务"),
+ FLOWABLE("FLOWABLE", "审批业务"),
+ ;
+ private final String type;
+ private final String desc;
+
+ ModelBizTypeEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static ModelBizTypeEnum valueOfType(String type) {
+ return Arrays.stream(ModelBizTypeEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java
new file mode 100644
index 000000000..805b79ded
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java
@@ -0,0 +1,12 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 顺序操作枚举
+ *
+ * @author wangli
+ * @since 2025-03-31 16:35
+ */
+public enum OrderEnum {
+
+ UP, DOWN
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java
new file mode 100644
index 000000000..1a29b3e16
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java
@@ -0,0 +1,19 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 打印字段的类型枚举
+ *
+ * @author wangli
+ * @since 2025-01-16 18:19
+ */
+public enum PrintFieldCategoryEnum {
+
+ // 表单变量
+ form,
+ // 流程内系统变量
+ system,
+ // 电子签名变量
+ signature,
+ // 签署业务自定义变量
+ sign
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessActivityEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessActivityEventEnum.java
index 9017664f2..2b2595fe2 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessActivityEventEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessActivityEventEnum.java
@@ -13,6 +13,7 @@ public enum ProcessActivityEventEnum {
PROCESS_ACTIVITY_START("process-activity", "process-activity-start", "流程活动节点已开始"),
PROCESS_ACTIVITY_WAIT_ASSIGNEE("process-activity", "process-activity-wait-assignee", "流程活动节点等待指定审批人"),
PROCESS_ACTIVITY_TAKE("process-activity", "process-activity-take", "该事件类型暂时不存在"),
+ PROCESS_ACTIVITY_CALLBACK("process-activity", "process-activity-callback", "业务节点定时回调"),
PROCESS_ACTIVITY_END("process-activity", "process-activity-end", "流程活动节点已取消"),
;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
index 1b65e6ac4..6d3300170 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
@@ -13,9 +13,11 @@ public enum ProcessMessagePushEventEnum {
PROCESS_PUSH_NOTICE("process-push", "process-push-notice", "站内信推送"),
PROCESS_PUSH_PENDING("process-push", "process-push-pending", "待办推送"),
PROCESS_PUSH_PENDING_COMPLETE("process-push", "process-push-pending-complete", "完成待办"),
+ PROCESS_PUSH_PENDING_ROLLBACK("process-push", "process-push-pending-rollback", "恢复待办"),
PROCESS_CARBON_COPY("process-push", "process-carbon-copy", "抄送流程"),
PROCESS_CARBON_COPY_COMPLETE("process-push", "process-carbon-copy-complete", "完成抄送"),
PROCESS_PUSH_SMS("process-push", "process-push-sms", "短信推送"),
+ PROCESS_PUSH_IM("process-push", "process-push-im", "IM 推送"),
;
@@ -24,12 +26,12 @@ public enum ProcessMessagePushEventEnum {
private final String desc;
private Event.EventCode eventCode;
- ProcessMessagePushEventEnum(String model, String tag, String desc) {
+ ProcessMessagePushEventEnum(String module, String tag, String desc) {
this.eventCode = Event.EventCode.builder()
- .module(model)
+ .module(module)
.name(tag)
.build();
- this.module = model;
+ this.module = module;
this.tag = tag;
this.desc = desc;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
index 124af9a6e..cd205223c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
@@ -2,6 +2,9 @@ package cn.axzo.workflow.common.enums;
import cn.axzo.framework.rocketmq.Event;
+import static cn.axzo.workflow.common.constant.TaskListenerExtConstants.EVENTNAME_FALLBACK;
+import static cn.axzo.workflow.common.constant.TaskListenerExtConstants.EVENTNAME_TRANSFER;
+
/**
* 流程任务节点相关的 MQ 事件枚举定义
*
@@ -10,8 +13,10 @@ import cn.axzo.framework.rocketmq.Event;
*/
public enum ProcessTaskEventEnum {
- PROCESS_TASK_CREATED("process-task", "process-task-created", "流程任务已创建"),
PROCESS_TASK_ASSIGNED("process-task", "process-task-assigned", "流程任务已分配"),
+ PROCESS_TASK_CREATED("process-task", "process-task-created", "流程任务已创建"),
+ PROCESS_TASK_TRANSFER("process-task", EVENTNAME_TRANSFER, "流程任务已转交"),
+ PROCESS_TASK_FALLBACK("process-task", EVENTNAME_FALLBACK, "流程任务已回退"),
PROCESS_TASK_COMPLETED("process-task", "process-task-completed", "流程任务已结束"),
PROCESS_TASK_DELETED("process-task", "process-task-deleted", "流程任务已删除"),
;
@@ -45,4 +50,5 @@ public enum ProcessTaskEventEnum {
public Event.EventCode getEventCode() {
return eventCode;
}
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/RpcInvokeModeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/RpcInvokeModeEnum.java
new file mode 100644
index 000000000..4a8f4c439
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/RpcInvokeModeEnum.java
@@ -0,0 +1,12 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * PRC 调用模式枚举
+ *
+ * @author wangli
+ * @since 2024/5/29 10:27
+ */
+public enum RpcInvokeModeEnum {
+ SYNC,
+ ASYNC,
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java
new file mode 100644
index 000000000..e0f65da15
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java
@@ -0,0 +1,52 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 签署确认节点的审批人层级范围限制
+ *
+ * @author wangli
+ * @since 2025-03-26 14:30
+ */
+public enum SignApproverOrgLimitEnum {
+ LV_0("LV_0", "当前组织", 0),
+ LV_1("LV_1", "上1级组织", 1),
+ LV_2("LV_2", "上2级组织", 2),
+ LV_3("LV_3", "上3级组织", 3),
+ LV_4("LV_4", "上4级组织", 4),
+ LV_5("LV_5", "上5级组织", 5),
+ LV_ALL("LV_ALL", "所有组织", -1),
+ ;
+
+ private final String type;
+
+ private final String desc;
+
+ private final Integer code;
+
+ SignApproverOrgLimitEnum(String type, String desc, Integer code) {
+ this.type = type;
+ this.desc = desc;
+ this.code = code;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public static SignApproverOrgLimitEnum valueOfType(String type) {
+ return Arrays.stream(SignApproverOrgLimitEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java
new file mode 100644
index 000000000..2323fda54
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 签署确认节点的审批人层级范围限制
+ *
+ * @author wangli
+ * @since 2025-03-26 14:30
+ */
+public enum SignApproverRoleLimitEnum {
+ LEADER("LEADER", "负责人"),
+ ;
+
+ private final String type;
+
+ private final String desc;
+
+ SignApproverRoleLimitEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static SignApproverRoleLimitEnum valueOfType(String type) {
+ return Arrays.stream(SignApproverRoleLimitEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/TimeQueryDirection.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/TimeQueryDirection.java
new file mode 100644
index 000000000..114403b07
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/TimeQueryDirection.java
@@ -0,0 +1,16 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 时间查询方向
+ *
+ * 注意: 该枚举用在查询 flowable 引擎数据时, 都是包含自身时间点的.
+ * 例如, 使用 Before 时,也就是说在某个时间点之前,是包含"某个时间"自身的.
+ *
+ * @author wangli
+ * @since 2024-09-29 09:56
+ */
+public enum TimeQueryDirection {
+ BEFORE,
+ AFTER,
+ ;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java
new file mode 100644
index 000000000..bbfd8227f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java
@@ -0,0 +1,21 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * 模版上变量字段类型
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum VarTypeEnum {
+
+ TEXT("text", "文本"),
+
+ PICTURE("picture", "图片");
+
+ private String type;
+ private String desc;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkflowEngineEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkflowEngineEventEnum.java
new file mode 100644
index 000000000..b03fb9847
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkflowEngineEventEnum.java
@@ -0,0 +1,49 @@
+package cn.axzo.workflow.common.enums;
+
+import cn.axzo.framework.rocketmq.Event;
+
+/**
+ * 流程引擎自产自销事件枚举
+ *
+ * @author wangli
+ * @since 2024/5/20 13:57
+ */
+public enum WorkflowEngineEventEnum {
+
+ WORKFLOW_ENGINE_SERVER("workflow-engine", "workflow-engine-server", "引擎服务端事件"),
+ WORKFLOW_ENGINE_STARTER("workflow-engine", "workflow-engine-starter-%s", "引擎客户端事件"),
+ ;
+
+ private final String module;
+ private final String tag;
+ private final String desc;
+ private Event.EventCode eventCode;
+
+ WorkflowEngineEventEnum(String module, String tag, String desc) {
+ this.module = module;
+ this.tag = tag;
+ this.desc = desc;
+ this.eventCode = Event.EventCode.builder()
+ .module(module)
+ .name(tag)
+ .build();
+ }
+
+ public Event.EventCode getEventCode(String appName) {
+ eventCode.setName(String.format(eventCode.getName(), appName));
+ return eventCode;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public String getTag() {
+ return eventCode.getName();
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkspaceType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkspaceType.java
index bbb060cc5..da845ee8d 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkspaceType.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/WorkspaceType.java
@@ -19,10 +19,13 @@ public enum WorkspaceType {
*/
ENT(1, "企业"),
PROJECT(2, "项目"),
- OMS(6, "oms工作台");
+ GOVERNMENT(3, "政务监管平台"),
+ OMS(6, "oms工作台"),
+ UN_KNOW(0, "未知"),
+ ;
- private Integer code;
- private String desc;
+ private final Integer code;
+ private final String desc;
public static WorkspaceType getType(Integer code) {
return Arrays.stream(values()).filter(it -> it.getCode().equals(code))
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/exception/WorkflowEngineException.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
similarity index 78%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/exception/WorkflowEngineException.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
index 37db2bdcc..9a5e1f918 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/exception/WorkflowEngineException.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.exception;
+package cn.axzo.workflow.common.exception;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.framework.domain.web.code.IRespCode;
@@ -19,6 +19,11 @@ public class WorkflowEngineException extends ServiceException {
this.code = code.getRespCode();
}
+ public WorkflowEngineException(IRespCode code, Throwable cause, String... params) {
+ super(doFormat(code.getCode(), code.getMessage(), params), cause);
+ this.code = code.getRespCode();
+ }
+
@Override
public String getCode() {
return this.code;
@@ -41,7 +46,7 @@ public class WorkflowEngineException extends ServiceException {
for (l = 0; l < params.length; l++) {
j = messagePattern.indexOf("{}", i);
if (j == -1) {
- log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
+ log.warn("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
if (i == 0) {
return messagePattern;
} else {
@@ -55,7 +60,7 @@ public class WorkflowEngineException extends ServiceException {
}
}
if (messagePattern.indexOf("{}", i) != -1) {
- log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
+ log.warn("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
}
sbuf.append(messagePattern.substring(i));
return sbuf.toString();
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/NextNodePreCheckAlterDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/NextNodePreCheckAlterDTO.java
new file mode 100644
index 000000000..d921ac342
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/NextNodePreCheckAlterDTO.java
@@ -0,0 +1,19 @@
+package cn.axzo.workflow.common.model;
+
+import lombok.Data;
+
+/**
+ * 节点检测告警对象
+ *
+ * @author wangli
+ * @since 2024-09-13 11:37
+ */
+@Data
+public class NextNodePreCheckAlterDTO {
+
+ private String processInstanceId;
+
+ private String activityId;
+
+ private String errorMsg;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AlterDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AlterDTO.java
new file mode 100644
index 000000000..e0408a44e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AlterDTO.java
@@ -0,0 +1,25 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 告警对象
+ *
+ * @author wangli
+ * @since 2024-09-13 11:37
+ */
+@Data
+public class AlterDTO {
+ private String processInstanceId;
+
+ private String activityId;
+
+ private String taskId;
+
+ private Date startTime;
+
+ private String prettyStartTime;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java
new file mode 100644
index 000000000..d51003baf
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 金额字段值类型
+ *
+ * @author wangli
+ * @since 2025-05-16 17:21
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class AmountFieldDTO implements Serializable {
+ private static final long serialVersionUID = -3519991080707599177L;
+
+ /**
+ * 小写
+ */
+ private BigDecimal standardNumerals;
+
+ /**
+ * 大写
+ */
+ private String uppercaseNumerals;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java
new file mode 100644
index 000000000..1a110eaad
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 模型关联文档变更事件内部传输对象
+ *
+ * @author wangli
+ * @since 2025-04-07 16:53
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BizDocDTO implements Serializable {
+
+ private String archiveName;
+
+ private String archiveCode;
+
+ private Boolean enabled;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationCreateDTO.java
new file mode 100644
index 000000000..93e0cdc53
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationCreateDTO.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 模型与表单的创建模型
+ *
+ * @author wangli
+ * @since 2024-11-07 18:48
+ */
+@Data
+@Accessors(chain = true)
+public class BpmnFormRelationCreateDTO {
+
+ @ApiModelProperty(value = "业务标识")
+ private String key;
+
+ @ApiModelProperty(value = "模型定义ID")
+ private String bpmnDefinitionId;
+
+ @ApiModelProperty(value = "表单部署ID")
+ private String formDeploymentId;
+
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationSearchDTO.java
new file mode 100644
index 000000000..afcf841a9
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BpmnFormRelationSearchDTO.java
@@ -0,0 +1,43 @@
+package cn.axzo.workflow.common.model.dto;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 搜索
+ *
+ * @author wangli
+ * @date 2024/11/08
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BpmnFormRelationSearchDTO extends BpmPageParam {
+
+ /**
+ * 业务标识
+ */
+ @ApiModelProperty(value = "业务标识")
+ private String key;
+
+ /**
+ * 审批模型定义 ID
+ */
+ @ApiModelProperty(value = "审批模型定义 ID")
+ private String bpmnDefinitionId;
+
+ /**
+ * 表单定义部署 ID
+ */
+ @ApiModelProperty(value = "表单定义部署 ID")
+ private String formDeploymentId;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java
new file mode 100644
index 000000000..2ff8b1e85
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java
@@ -0,0 +1,69 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 通讯录组件返回的人员信息模型
+ *
+ * @author wangli
+ * @since 2025-05-15 14:04
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ContactsPersonDTO {
+ /**
+ * xx:xx:xx
+ */
+ private String nodeId;
+
+ /**
+ * 身份 ID
+ */
+ private Long identityId;
+
+ /**
+ * 身份类型
+ */
+ private Integer identityType;
+
+ /**
+ * 真实姓名
+ */
+ private String realName;
+
+ /**
+ * 自然人 ID
+ */
+ private Long personId;
+
+ /**
+ * 人员所在的节点 ID
+ */
+ private Long orgNodeId;
+
+ /**
+ * 人员所在的单位 ID
+ */
+ private Long ouId;
+
+ /**
+ * 人员所在的单位名称
+ */
+ private String ouName;
+
+ /**
+ * 人员所在的工作台 ID
+ */
+ private Long workspaceId;
+
+ /**
+ * 人员所在的工作台类型
+ */
+ private Integer workspaceType;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CooperationOrgDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CooperationOrgDTO.java
index d65c4d0bc..858e68eb3 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CooperationOrgDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CooperationOrgDTO.java
@@ -20,6 +20,7 @@ import java.util.List;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
+@Builder
public class CooperationOrgDTO implements Serializable {
private static final long serialVersionUID = 4739924705980062997L;
@@ -43,6 +44,7 @@ public class CooperationOrgDTO implements Serializable {
*
* 1 - 企业
* 2 - 项目
+ * 3 - 政务
* 6 - oms
*/
private Integer workspaceType;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/JobInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/JobInfo.java
new file mode 100644
index 000000000..35a2bac82
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/JobInfo.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 岗位信息
+ *
+ * @author wangli
+ * @since 2025-06-23 19:35
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = true)
+public class JobInfo implements Serializable {
+
+ private static final long serialVersionUID = -6092011348559752255L;
+ /**
+ * 岗位名称
+ */
+ private String jobName;
+
+ /**
+ * 岗位编码
+ */
+ private String jobCode;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/NodeInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/NodeInfo.java
new file mode 100644
index 000000000..6f0b430f3
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/NodeInfo.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 岗位信息
+ *
+ * @author wangli
+ * @since 2025-06-23 19:35
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = true)
+public class NodeInfo implements Serializable {
+
+ private static final long serialVersionUID = -6092011348559752255L;
+ /**
+ * 岗位名称
+ */
+ private Long nodeId;
+
+ /**
+ * 岗位编码
+ */
+ private String nodeName;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgSnapshotInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgSnapshotInfo.java
new file mode 100644
index 000000000..dae9af37b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgSnapshotInfo.java
@@ -0,0 +1,71 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 组织架构中的项目快照信息
+ *
+ * @author wangli
+ * @since 2025-06-23 18:31
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = true)
+public class OrgSnapshotInfo implements Serializable {
+ private static final long serialVersionUID = -2898438378034300663L;
+
+ /**
+ * 工作台名称
+ */
+ private String workspaceName;
+
+ /**
+ * 工作台 ID
+ */
+ private String workspaceId;
+
+ /**
+ * 工作台类型
+ */
+ private Integer workspaceType;
+
+ /**
+ * 参建单位类型
+ */
+ private Integer cooperationType;
+
+ /**
+ * 参建单位名称
+ */
+ private String ouName;
+
+ /**
+ * 参建单位 ID
+ */
+ private String ouId;
+
+ /**
+ * 顶级节点 ID
+ */
+ private String topNodeId;
+
+ /**
+ * 部门快照信息集合
+ */
+ private List nodeInfos;
+
+ /**
+ * 岗位快照信息集合
+ */
+ private List jobInfos;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgStructureSnapshotInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgStructureSnapshotInfo.java
new file mode 100644
index 000000000..6c1e826d0
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/OrgStructureSnapshotInfo.java
@@ -0,0 +1,55 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 审批人员的组织架构信息
+ *
+ * @author wangli
+ * @since 2025-06-23 18:23
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = true)
+public class OrgStructureSnapshotInfo implements Serializable {
+ private static final long serialVersionUID = 4199079714585922731L;
+
+ /**
+ * 审批人姓名
+ */
+ private String personName;
+
+ /**
+ * 头像(仅为审批任务被接受那一刻的电话,不可作为对外展示数据)
+ */
+ private String avatarUrl;
+
+ /**
+ * 手机号(仅为审批任务被接受那一刻的电话,不可作为对外展示数据)
+ */
+ private String phone;
+
+ /**
+ * 审批人顶级节点 ID
+ */
+ private Long topNodeId;
+
+ /**
+ * 工作台类型
+ */
+ private int workspaceType;
+
+ /**
+ * 组织快照信息
+ */
+ private OrgSnapshotInfo snapshotInfo;
+
+}
\ No newline at end of file
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java
new file mode 100644
index 000000000..852f91181
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java
@@ -0,0 +1,60 @@
+package cn.axzo.workflow.common.model.dto;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 签署文件记录信息
+ *
+ * @author wangli
+ * @since 2025-04-03 11:21
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SignFileDTO implements Serializable {
+
+ private static final long serialVersionUID = -8709597975507074853L;
+ /**
+ * 文件模板主键 ID
+ */
+ private Long id;
+
+ /**
+ * 文件名称,可能会包含变量
+ */
+ private String fileName;
+
+ /**
+ * 模板名称
+ */
+ private String templateName;
+
+ /**
+ * 文件的标签
+ */
+ private String fileTag;
+
+ /**
+ * 文件 code
+ */
+ private String fileCode;
+
+ /**
+ * 文件的类型
+ */
+ private FileTypeEnum fileType;
+
+ /**
+ * 替换变量后的文件 fileKey
+ */
+ private String fileKey;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java
new file mode 100644
index 000000000..183722818
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 节点的电子签名数据
+ *
+ * @author wangli
+ * @since 2025-01-15 20:11
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SignatureDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ * 节点 ID
+ */
+ private String activityId;
+ /**
+ * 节点名称
+ */
+ private String activityName;
+ /**
+ * 签名图片数据有序集合
+ */
+ private List signatures;
+
+ @Data
+ @Accessors(chain = true)
+ public static class SignDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private String signature;
+ private String advice;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java
new file mode 100644
index 000000000..0210c2a47
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 审批人在不同任务下,关联文档的阅读状态
+ *
+ * @author wangli
+ * @since 2025-04-08 13:59
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SimpleDocDTO implements Serializable {
+ /**
+ * 关联的文档 ID
+ */
+ private Long id;
+
+ /**
+ * 关联的文档业务标签
+ */
+ private String tag;
+
+ /**
+ * 阅读状态: true 已读
+ */
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java
new file mode 100644
index 000000000..0b2ea2462
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 简单的任务模型
+ *
+ * @author wangli
+ * @since 2024-12-09 14:30
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SimpleTaskDTO {
+ /**
+ * 流程实例 ID
+ */
+ private String processInstanceId;
+
+ /**
+ * 任务 ID
+ */
+ private String taskId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java
new file mode 100644
index 000000000..d075b7194
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 业务节点添加定时任务的模型
+ *
+ * @author wangli
+ * @since 2025-03-19 16:33
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TermNodeAddTimerJobDTO implements Serializable {
+ private String processInstanceId;
+ private String activityId;
+ private String timeCycle;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodePausingDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodePausingDTO.java
new file mode 100644
index 000000000..6444bf20a
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodePausingDTO.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 卡住节点的查询条件模型
+ *
+ * @author wangli
+ * @since 2024-09-11 13:57
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TermNodePausingDTO implements Serializable {
+
+ private static final long serialVersionUID = -1L;
+ private String processInstanceId;
+
+ private String activityId;
+
+ /**
+ * 重试次数
+ */
+ private Integer retries;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java
new file mode 100644
index 000000000..1eeede655
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java
@@ -0,0 +1,38 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 上传附件字段类型
+ *
+ * @author wangli
+ * @since 2024-11-22 14:48
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UploadFieldDTO implements Serializable {
+
+ private static final long serialVersionUID = -1L;
+ /**
+ * 文件名称
+ */
+ private String fileName;
+
+ /**
+ * 文件类型
+ */
+ private String fileUrl;
+
+ /**
+ * 文件 oss 的 key
+ */
+ private String fileKey;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java
new file mode 100644
index 000000000..4523937f7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 从流程实例中获取变量,携带数据类型的对象
+ *
+ * @author wangli
+ * @since 2025-04-09 11:46
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class VariableObjectDTO {
+
+ public enum Type {
+ img, text, obj, signatureAndAdvice
+ }
+
+ /**
+ * 变量 key
+ */
+ private String key;
+
+ /**
+ * 变量中文名
+ */
+ private String desc;
+
+ /**
+ * 变量值
+ */
+ private Object value;
+
+ /**
+ * 变量类型
+ */
+ @Builder.Default
+ private Type type = Type.text;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/DataSyncSummaryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/DataSyncSummaryDTO.java
new file mode 100644
index 000000000..39a18fb86
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/DataSyncSummaryDTO.java
@@ -0,0 +1,25 @@
+package cn.axzo.workflow.common.model.dto.es;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 数据同步 ES 的结果统计
+ *
+ * @author wangli
+ * @since 2024-09-30 14:42
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class DataSyncSummaryDTO {
+
+ private Long processInstanceCount;
+
+ private Long processTaskCount;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java
new file mode 100644
index 000000000..d0e0cc31d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java
@@ -0,0 +1,100 @@
+package cn.axzo.workflow.common.model.dto.es;
+
+import cn.axzo.workflow.common.enums.TimeQueryDirection;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * 历史流程实例的搜索对象
+ *
+ * @author wangli
+ * @since 2024-09-27 14:03
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class HistoricProcessInstanceSearchForEsDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ private String processInstanceId;
+
+ /**
+ * 业务传参关键
+ */
+ private String businessKey;
+
+ /**
+ * 流程定义 KEY
+ */
+ private String processDefinitionKey;
+
+ /**
+ * 流程实例名称
+ */
+ private String processInstanceName;
+
+ /**
+ * 流程实例状态
+ */
+ private String businessStatus;
+
+ /**
+ * 租户 ID
+ */
+ private String tenantId;
+
+ /**
+ * 实例是否已结束
+ *
+ */
+ private Boolean finished;
+
+ /**
+ * 开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 控制查询开始时间的方向,包含自身的时间点
+ *
+ * 默认是查询开始时间之后
+ */
+ @Builder.Default
+ private TimeQueryDirection startTimeDirection = TimeQueryDirection.AFTER;
+
+ /**
+ * 结束时间
+ */
+ private Date endTime;
+
+ /**
+ * 控制查询结束时间的方向,包含自身的时间点
+ *
+ * 默认是查询结束时间点之前
+ */
+ @Builder.Default
+ private TimeQueryDirection endTimeDirection = TimeQueryDirection.BEFORE;
+
+ /**
+ * 是否包含流程变量
+ */
+ @Builder.Default
+ private Boolean hasVariables = false;
+
+ /**
+ * 用于覆盖同步逻辑中的PageSize,一般不需要传
+ */
+ @Builder.Default
+ private Integer overPageSize = 50;
+
+}
+
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java
new file mode 100644
index 000000000..0c1052145
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java
@@ -0,0 +1,31 @@
+package cn.axzo.workflow.common.model.dto.print;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 字段属性
+ *
+ * @author wangli
+ * @since 2025-01-16 17:31
+ */
+@Data
+@ApiModel("打印时的字段的扩展属性模型")
+@NoArgsConstructor
+@Accessors(chain = true)
+public class FieldAttributeDTO {
+
+ /**
+ * 属性 code
+ */
+ private String code;
+
+ /**
+ * 属性名称
+ */
+ private String name;
+
+ private String fieldFormType;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java
new file mode 100644
index 000000000..078b9c544
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.dto.print;
+
+import cn.axzo.workflow.common.enums.PrintFieldCategoryEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 打印时的字段模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:09
+ */
+@ApiModel("打印时的字段模型")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class PrintFieldDTO {
+ /**
+ * 字段中文名称
+ */
+ private String name;
+ /**
+ * 字段类型(表单字段、系统字段)
+ */
+ private PrintFieldCategoryEnum fieldCategoryType;
+
+ /**
+ * 用于替换是变量名
+ */
+ private String code;
+
+ /**
+ * 字段的表单的类型
+ */
+ private String fieldFormType;
+
+ /**
+ * 复杂组件的扩展字段,例如“自定义组件”,“审批日志”组件等
+ */
+ private List attributes;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
index 91a566e5c..640809192 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
@@ -10,6 +10,7 @@ import java.io.Serializable;
@ApiModel("分页参数")
public class BpmPageParam implements Serializable {
+ private static final long serialVersionUID = -7002013785995706695L;
private static final Integer PAGE_NO = 1;
private static final Integer PAGE_SIZE = 10;
@ApiModelProperty(value = "页码,从 1 开始", required = true, example = "1")
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmnApproveConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmnApproveConf.java
new file mode 100644
index 000000000..ed9af9805
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmnApproveConf.java
@@ -0,0 +1,42 @@
+package cn.axzo.workflow.common.model.request;
+
+import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.Valid;
+
+@ApiModel("JSON 版本的 BPMN 协议模型中流程配置管理")
+@Data
+@AllArgsConstructor
+@Accessors(chain = true)
+public class BpmnApproveConf {
+
+ public BpmnApproveConf() {
+ this.supportBatchOperation = false;
+ this.userAgreeSignature = false;
+ }
+
+ /**
+ * 是否支持批量审批
+ */
+ @ApiModelProperty(value = "是否支持批量审批")
+ @Valid
+ private Boolean supportBatchOperation;
+
+ /**
+ * 审批同意录入手写签名
+ */
+ @ApiModelProperty(value = "审批同意录入手写签名")
+ @Valid
+ private Boolean userAgreeSignature;
+
+ /**
+ * 审批自动过审配置
+ */
+ @ApiModelProperty(value = "同一审批人自动过审类型,默认不自动过审,枚举类型为'NO_AUTO_APPROVAL'")
+ private AutoApprovalTypeEnum autoApprovalType = AutoApprovalTypeEnum.NO_AUTO_APPROVAL;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminCreateDTO.java
new file mode 100644
index 000000000..3d9816623
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminCreateDTO.java
@@ -0,0 +1,82 @@
+package cn.axzo.workflow.common.model.request.admin;
+
+import cn.axzo.workflow.common.enums.AdminDataSource;
+import cn.axzo.workflow.common.enums.AdminRoleType;
+import cn.axzo.workflow.common.enums.AdminTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 新增管理员模型
+ */
+@ApiModel("新增管理员模型")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProcessAdminCreateDTO {
+
+ /**
+ * 自然人id
+ */
+ @ApiModelProperty(value = "自然人id")
+ @NotNull(message = "人员不能为空")
+ private Long personId;
+
+ /**
+ * 单位id
+ */
+ @ApiModelProperty(value = "单位id")
+ @NotNull(message = "单位id不能为空")
+ private Long organizationalUnitId;
+
+ /**
+ * 工作台ID
+ */
+ @ApiModelProperty(value = "工作台id")
+ @NotNull(message = "工作台id不能为空")
+ private Long workspaceId;
+
+ /**
+ * 工作台类型,1-企业, 2-项目, 3-政务监管平台, 6-oms工作台,参考 WorkspaceType枚举
+ */
+ @ApiModelProperty(value = "工作台类型")
+ @NotNull(message = "工作台类型不能为空")
+ private Integer workspaceType;
+
+ /**
+ * 管理员类型, SUPER_ADMIN-超级管理员, COMMON_ADMIN-普通管理员
+ */
+ @ApiModelProperty(value = "管理员类型, super_admin-超级管理员, common_admin-普通管理员")
+ private AdminTypeEnum adminType;
+
+ /**
+ * 角色类型, ORGANIZATION_ADMIN-单位超管, ORG_WORKSPACE_ADMIN-项目内单位负责人, WORKSPACE_ADMIN-项目超管,OTHER-其他用户
+ */
+ @ApiModelProperty(value = "角色类型, organization_admin-单位超管, organization_workspace_admin-项目内单位负责人, workspace_admin-项目超管,other-其他用户")
+ private AdminRoleType roleType;
+
+ /**
+ * 数据来源, SYSTEM_ENTRY-系统录入, USER_ENTRY-用户手动录入
+ */
+ @ApiModelProperty(value = "数据来源, system-系统录入, user-用户手动录入")
+ private AdminDataSource dataSource;
+
+ /**
+ * 创建者
+ */
+ @ApiModelProperty(value = "创建者")
+ private Long createBy;
+
+ /**
+ * 更新者
+ */
+ @ApiModelProperty(value = "更新者")
+ private Long updateBy;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminDeleteDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminDeleteDTO.java
new file mode 100644
index 000000000..5479dd9a9
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminDeleteDTO.java
@@ -0,0 +1,68 @@
+package cn.axzo.workflow.common.model.request.admin;
+
+import cn.axzo.workflow.common.enums.AdminDataSource;
+import cn.axzo.workflow.common.enums.AdminTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@ApiModel("删除管理员模型")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProcessAdminDeleteDTO {
+
+ /**
+ * 流程管理员配置id列表
+ */
+ @ApiModelProperty(value = "流程管理员配置id列表")
+ private List processAdminIds;
+
+ /**
+ * 自然人id
+ */
+ @ApiModelProperty(value = "自然人id列表")
+ private List personIds;
+
+ /**
+ * 工作台ID
+ */
+ @ApiModelProperty(value = "工作台id")
+ private Long workspaceId;
+
+ /**
+ * 工作台id列表
+ */
+ @ApiModelProperty(value = "工作台id列表")
+ private List workspaceIds;
+
+ /**
+ * 单位id
+ */
+ @ApiModelProperty(value = "单位id")
+ private Long organizationalUnitId;
+
+ /**
+ * 单位id列表
+ */
+ @ApiModelProperty(value = "单位id列表")
+ private List organizationalUnitIds;
+
+ /**
+ * 数据来源, SYSTEM_ENTRY-系统录入, USER_ENTRY-用户手动录入
+ */
+ @ApiModelProperty(value = "数据来源")
+ private AdminDataSource dataSource;
+
+ /**
+ * 管理员类型
+ */
+ @ApiModelProperty(value = "管理员类型")
+ private AdminTypeEnum adminType;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminQueryDTO.java
new file mode 100644
index 000000000..85a3ebe06
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/admin/ProcessAdminQueryDTO.java
@@ -0,0 +1,59 @@
+package cn.axzo.workflow.common.model.request.admin;
+
+import cn.axzo.workflow.common.enums.AdminDataSource;
+import cn.axzo.workflow.common.enums.AdminTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 查询管理员模型
+ */
+@ApiModel("查询管理员模型")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProcessAdminQueryDTO {
+
+ /**
+ * 流程管理员配置id列表
+ */
+ @ApiModelProperty(value = "流程管理员配置id列表")
+ private List processAdminIds;
+
+ /**
+ * 自然人id
+ */
+ @ApiModelProperty(value = "自然人id列表")
+ private List personIds;
+
+ /**
+ * 工作台ID
+ */
+ @ApiModelProperty(value = "工作台id")
+ private Long workspaceId;
+
+ /**
+ * 单位id
+ */
+ @ApiModelProperty(value = "单位id")
+ private Long organizationalUnitId;
+
+ /**
+ * 数据来源, system-系统录入, user-用户手动录入
+ */
+ @ApiModelProperty(value = "数据来源")
+ private AdminDataSource dataSource;
+
+ /**
+ * 管理员类型
+ */
+ @ApiModelProperty(value = "管理员类型")
+ private AdminTypeEnum adminType;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonConf.java
index cf78a06ed..99fbe54e0 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonConf.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonConf.java
@@ -7,7 +7,11 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
+
+import static cn.axzo.workflow.common.enums.BpmnButtonEnum.BPMN_UPGRADE;
/**
* 流程定义中的按钮配置
@@ -25,25 +29,25 @@ public class BpmnButtonConf implements Serializable {
* 发起人的按钮配置信息, 需要给全量按钮的配置
*/
@ApiModelProperty(value = "发起人的按钮配置信息")
- private List initiator;
+ private List initiator = new ArrayList<>();
/**
* 当前审批人的按钮配置信息, JSON 格式
*/
@ApiModelProperty(value = "当前审批人的按钮配置信息")
- private List current;
+ private List current = new ArrayList<>();
/**
* 历史审批人的按钮配置信息, JSON 格式
*/
@ApiModelProperty(value = "历史审批人的按钮配置信息")
- private List history;
+ private List history = new ArrayList<>();
/**
* 抄送人的按钮配置信息, JSON 格式
*/
@ApiModelProperty(value = "抄送人的按钮配置信息")
- private List carbonCopy;
+ private List carbonCopy = new ArrayList<>();
public List getInitiator() {
return initiator;
@@ -77,4 +81,11 @@ public class BpmnButtonConf implements Serializable {
this.carbonCopy = carbonCopy;
}
+ public void removeUpGradeButton() {
+ // 移除升级按钮
+ this.initiator.removeIf(button -> Objects.equals(BPMN_UPGRADE.getBtnKey(), button.getType()));
+ this.current.removeIf(button -> Objects.equals(BPMN_UPGRADE.getBtnKey(), button.getType()));
+ this.history.removeIf(button -> Objects.equals(BPMN_UPGRADE.getBtnKey(), button.getType()));
+ this.carbonCopy.removeIf(button -> Objects.equals(BPMN_UPGRADE.getBtnKey(), button.getType()));
+ }
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
index b0fe32358..579f99a21 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
@@ -1,9 +1,12 @@
package cn.axzo.workflow.common.model.request.bpmn;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
/**
* 按钮元数据
@@ -15,10 +18,15 @@ import java.io.Serializable;
@Accessors(chain = true)
public class BpmnButtonMetaInfo implements Serializable {
+ public static final String BUTTON_TYPE_SYSTEM = "SYSTEM";
+ public static final String BUTTON_TYPE_CUSTOM = "CUSTOM";
+
+ private static final long serialVersionUID = -5224316166904752829L;
+
/**
* 按钮顺序
*/
- private Integer order;
+ private Integer order = 0;
/**
* 按钮唯一标识
@@ -39,10 +47,19 @@ public class BpmnButtonMetaInfo implements Serializable {
* 是否禁用勾选
*/
private Boolean disabled;
+ /**
+ * 是否隐藏按钮
+ */
+ private Boolean hidden = false;
/**
* 按钮类型 SYSTEM/CUSTOM
*/
private String type;
+ /**
+ * 按钮支持的业务类型
+ */
+ private List supportBizType = new ArrayList<>();
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
index 7ba66fe4a..0c511be70 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.bpmn;
+import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -26,6 +27,11 @@ public class BpmnJsonModel implements Serializable {
@ApiModelProperty(value = "流程的 Json 结构")
private BpmnJsonNode node;
+ /**
+ * 签署配置, 可为空,只有签署业务才有该配置
+ */
+ @ApiModelProperty(value = "签署配置")
+ private BpmnSignConf signConf;
/**
* 通知管理配置
*/
@@ -46,4 +52,11 @@ public class BpmnJsonModel implements Serializable {
@ApiModelProperty(value = "流程字段配置")
@Valid
private List fieldConf;
+
+ /**
+ * 审批相关高级配置
+ */
+ @ApiModelProperty(value = "审批相关高级配置")
+ @Valid
+ private BpmnApproveConf approveConf;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
index 47e5b1e50..28c72e325 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
@@ -5,6 +5,7 @@ import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
+import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -33,9 +34,9 @@ public class BpmnJsonNodeProperty {
//************* 审批人所在范围Start **************//
/**
- * 审批人所在范围: entWorkspace(企业工作台), projectWorkspace(项目工作台), preTaskUser(上节点审批人所在单位)
+ * 审批人所在范围: entWorkspace(企业工作台), govWorkspace(政务工作台), projectWorkspace(项目工作台), preTaskUser(上节点审批人所在单位)
*/
- @ApiModelProperty(value = "任务节点: 审批人所在范围", notes = "entWorkspace: 企业工作台, projectWorkspace: 项目工作台, preTaskUser:" +
+ @ApiModelProperty(value = "任务节点: 审批人所在范围", notes = "entWorkspace: 企业工作台, govWorkspace: 政务工作台, projectWorkspace: 项目工作台, preTaskUser:" +
" 上节点审批人所在单位")
private ApproverScopeEnum approverScope;
//************* 审批人所在范围End **************//
@@ -44,13 +45,19 @@ public class BpmnJsonNodeProperty {
//************* 审批人指定Start **************//
/**
* 审批人指定: position(指定岗位), role(指定角色), identity(指定身份), initiatorLeader(发起人主管), initiatorLeaderRecursion(发起人多级主管),
- * fixedPerson(固定人员)
+ * fixedPerson(固定人员) initiatorSpecified(发起人自选) signerRelated(签署人相关组织)
*/
@ApiModelProperty(value = "任务节点: 审批人指定", notes = "position: 指定岗位, role: 指定角色, identity: 指定身份, initiatorLeader: " +
- "发起人主管, initiatorLeaderRecursion: 发起人多级主管, fixedPerson: 固定人员")
+ "发起人主管, initiatorLeaderRecursion: 发起人多级主管, fixedPerson: 固定人员, initiatorSpecified: 发起人自选, signerRelated: 签署人相关组织")
@NotBlank(message = "审批人指定不能为空")
private ApproverSpecifyEnum approverSpecify;
+ /**
+ * 签署确认节点的审批人限定规则
+ */
+ @ApiModelProperty(value = "签署确认节点的审批人限定规则")
+ private BpmnSignApproverLimit signApproverLimit;
+
/**
* 具体的配置值
*
@@ -93,12 +100,17 @@ public class BpmnJsonNodeProperty {
private String emptyApproverSpecify;
//************* 审批人为空时的策略End **************//
+ /**
+ * 电子签名开关
+ */
+ @ApiModelProperty(value = "电子签名")
+ private Boolean signature;
/**
- * 表单字段权限, JSON 格式,按照 UI 进行自定义组装, 引擎不做任何解析, 之后的需求会让业务方前端开发来消费这里的配置
+ * 提级审批配置
*/
- @ApiModelProperty(value = "发起人节点/任务节点: 字段权限集合", notes = "后端不做任何解析, 前端给什么样,就返什么样")
- private String fieldPermission;
+ @ApiModelProperty(value = "提级审批配置")
+ private BpmnUpgradeApprovalConf upgradeApprovalConf;
/**
* 按钮权限
@@ -142,8 +154,9 @@ public class BpmnJsonNodeProperty {
//************* 抄送节点Start **************//
/**
- * 发起时使用的表单 key
+ * 表单字段权限配置
*/
- @ApiModelProperty(value = "发起时使用的表单 key")
- private String formKey;
+ @ApiModelProperty(value = "表单字段权限控制")
+ private List fieldPermission;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeConf.java
index 0cb7b2db1..6e4e7d15c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeConf.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeConf.java
@@ -26,7 +26,7 @@ public class BpmnNoticeConf implements Serializable {
*/
@Valid
// @NotNull(message = "消息模板不能为空")
- private BpmnNoticeProperty notice;
+ private BpmnNoticeProperty notice = new BpmnNoticeProperty();
/**
* 待办的配置
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeProperty.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeProperty.java
index 2e6b89ba1..1d79ad515 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeProperty.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeProperty.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.bpmn;
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -7,6 +8,8 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
/**
* 站内信
@@ -21,15 +24,49 @@ import java.io.Serializable;
public class BpmnNoticeProperty implements Serializable {
/**
- * 通知消息模板 ID
+ * 通知的消息模板,该属性目前是由后端进行配置,前端暂可不关心
*/
- @ApiModelProperty(value = "通知消息模板 ID")
- // @NotBlank(message = "通知消息模板 ID 不能为空")
+ @ApiModelProperty(value = "通知的消息模板", hidden = true)
private String noticeMessageId;
+ /**
+ * 是否发送消息通知
+ */
+ @ApiModelProperty(value = "是否发送消息通知")
+ private Boolean sendMessage;
/**
- * 用于前端回显数据, 服务端不解析
+ * 消息触发时机列表
*/
- @ApiModelProperty(value = "用于前端回显数据, 服务端不解析")
- private String viewJson;
+ @ApiModelProperty(value = "触发时机列表")
+ private List triggerEvents = new ArrayList<>();
+
+ /**
+ * 消息模版发起人配置
+ */
+ @ApiModelProperty(value = "消息模版发起人配置")
+ private BpmnNoticeReceiver initiator = new BpmnNoticeReceiver();
+
+ /**
+ * 消息历史审批配置
+ */
+ @ApiModelProperty(value = "消息模版历史审批人配置")
+ private BpmnNoticeReceiver histories = new BpmnNoticeReceiver();
+
+ /**
+ * 消息模版指定岗位配置
+ */
+ @ApiModelProperty(value = "消息模版指定岗位配置")
+ private BpmnNoticeReceiver positions = new BpmnNoticeReceiver();
+
+ /**
+ * 消息模版指定角色配置
+ */
+ @ApiModelProperty(value = "消息模版指定角色配置")
+ private BpmnNoticeReceiver roles = new BpmnNoticeReceiver();
+
+ /**
+ * 消息模板指定人员
+ */
+ @ApiModelProperty(value = "消息模板指定人员")
+ private BpmnNoticeReceiver assigners = new BpmnNoticeReceiver();
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeReceiver.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeReceiver.java
new file mode 100644
index 000000000..e15aadaaf
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnNoticeReceiver.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("JSON 版本的 BPMN 协议模型中的通知管理的站内信消息接收人配置")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnNoticeReceiver {
+
+ /**
+ * 是否选中
+ */
+ @ApiModelProperty(value = "是否选中")
+ private Boolean selected = false;
+
+ /**
+ * 接收人内容,发起人,历史审批人不设置该值
+ */
+ @ApiModelProperty(value = "接收人内容,发起人,历史审批人不设置该值")
+ private String viewJson;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnProcessVariable.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnProcessVariable.java
new file mode 100644
index 000000000..149602ce8
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnProcessVariable.java
@@ -0,0 +1,35 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 流程变量模型
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class BpmnProcessVariable {
+
+ @ApiModelProperty(value = "流程变量名称")
+ @NotBlank(message = "流程变量名称不能为空")
+ private String name;
+
+// @ApiModelProperty(value = "流程变量类型")
+// @NotBlank(message = "流程变量类型不能为空")
+// private String type;
+
+ @ApiModelProperty(value = "流程变量值")
+ @NotNull(message = "流程变量值不能为空")
+ private Object value;
+
+ private String valueUrl;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java
new file mode 100644
index 000000000..d49918167
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
+import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * JSON 版本的 BPMN 协议模型中的确认人限定规则
+ *
+ * @author wangli
+ * @since 2025-03-26 20:05
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的确认人限定规则")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignApproverLimit {
+
+ /**
+ * 签署确认节点下人的组织限定规则
+ *
+ * LV_0("LV_0", "当前组织"),
+ * LV_1("LV_1", "上1级组织"),
+ * LV_2("LV_2", "上2级组织"),
+ * LV_3("LV_3", "上3级组织"),
+ * LV_4("LV_4", "上4级组织"),
+ * LV_5("LV_5", "上5级组织"),
+ */
+ @ApiModelProperty(value = "签署确认节点下人的组织限定规则")
+ private SignApproverOrgLimitEnum orgLimit;
+
+ /**
+ * 签署确认节点下人的角色限定规则
+ *
+ * INITIATOR_SPECIFIED("INITIATOR_SPECIFIED", "发起人自选"),
+ * LEADER("LEADER", "负责人"),
+ */
+ @ApiModelProperty(value = "签署确认节点下人的角色限定规则")
+ private SignApproverRoleLimitEnum roleLimit;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java
new file mode 100644
index 000000000..f88d150ba
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import cn.axzo.workflow.common.enums.BpmnSignType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 流程定义中的签署配置
+ *
+ * @author wangli
+ * @since 2025-03-25 16:56
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的签署管理")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignConf implements Serializable {
+
+ private static final long serialVersionUID = -6015492451455020117L;
+
+ /**
+ * 签署方式
+ *
+ * SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"),
+ * MULTI("MULTI", "指定人群,每人签署一份文件"),
+ */
+ @ApiModelProperty(value = "签署方式")
+ private BpmnSignType signType;
+
+ /**
+ * 签署业务待办模板
+ */
+ @ApiModelProperty(value = "签署业务待办模板")
+ private BpmnSignPendingProperty signPendingProperty;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java
new file mode 100644
index 000000000..89da2289b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * JSON 版本的 BPMN 协议模型中的签署的待办
+ *
+ * @author wangli
+ * @since 2025-03-25 17:09
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的签署的待办")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignPendingProperty implements Serializable {
+ private static final long serialVersionUID = -6015492451455020117L;
+
+ /**
+ * 待办消息模板 ID
+ */
+ @ApiModelProperty(value = "待办消息模板 ID")
+ @NotBlank(message = "待办消息模板 ID 不能为空")
+ private String pendingMessageId;
+
+ /**
+ * 用于前端回显数据, 服务端不解析
+ */
+ @ApiModelProperty(value = "用于前端回显数据, 服务端不解析")
+ private String viewJson;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnUpgradeApprovalConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnUpgradeApprovalConf.java
new file mode 100644
index 000000000..cda97deaa
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnUpgradeApprovalConf.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
+import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * JSON 版本的 BPMN 协议模型中的提级审批配置模型
+ *
+ * @author wangli
+ * @since 2025-06-20 11:32
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的提级审批配置模型")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnUpgradeApprovalConf implements Serializable {
+ private static final long serialVersionUID = 36282987684860776L;
+
+ /**
+ * 是否已开启
+ */
+ private Boolean enabled;
+
+ /**
+ * 提级审批的审批人层级范围限制
+ */
+ private SignApproverOrgLimitEnum orgLimit;
+
+ /**
+ * 提级审批的审批人指定方式
+ */
+ private ApproverSpecifyEnum approverSpecify;
+
+ /**
+ * 提级审批的审批人指定具体值
+ */
+ private String specifyValue;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/RestBpmnProcessVariable.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/RestBpmnProcessVariable.java
new file mode 100644
index 000000000..615330700
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/RestBpmnProcessVariable.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RestBpmnProcessVariable extends BpmnProcessVariable {
+
+ public enum RestVariableScope {
+ LOCAL, GLOBAL
+ }
+
+ /**
+ * 变量作用域, 目前支持 LOCAL(局部变量) 和 GLOBAL(全局变量)
+ */
+ private RestVariableScope scope = RestVariableScope.GLOBAL;
+
+ public String getVariableScope() {
+ String scope = null;
+ if (this.scope != null) {
+ scope = this.scope.name().toLowerCase();
+ }
+ return scope;
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutCallbackDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutCallbackDTO.java
new file mode 100644
index 000000000..93643e5f7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutCallbackDTO.java
@@ -0,0 +1,41 @@
+package cn.axzo.workflow.common.model.request.bpmn.activity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Map;
+
+/**
+ * 为指定业务节点设置倒计时回调
+ *
+ * @author wangli
+ * @since 2024-08-16 15:30
+ */
+@ApiModel("为指定业务节点设置倒计时回调")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnActivityTimeoutCallbackDTO {
+
+ /**
+ * 业务节点的触发 ID
+ */
+ @NotBlank(message = "触发 ID 不能为空")
+ private String triggerId;
+
+ /**
+ * 触发往下流转的时间点, 格式:yyyy-MM-dd HH:mm:ss
+ *
+ * 应该为 Date 类型,但为了确保特殊情况需要通过 pod 内直接触发
+ */
+ @NotBlank(message = "触发时间不能为空,格式:yyyy-MM-dd HH:mm:ss")
+ private String endTime;
+
+ /**
+ * 用于追加或修改现有的变量值
+ */
+ private Map variables;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutTriggerDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutTriggerDTO.java
new file mode 100644
index 000000000..9b1e4ec62
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/activity/BpmnActivityTimeoutTriggerDTO.java
@@ -0,0 +1,41 @@
+package cn.axzo.workflow.common.model.request.bpmn.activity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Map;
+
+/**
+ * 为指定业务节点设置倒计时,在啥时候继续往下流转
+ *
+ * @author wangli
+ * @since 2024-08-16 15:30
+ */
+@ApiModel("为指定业务节点设置倒计时")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnActivityTimeoutTriggerDTO {
+ /**
+ * 业务节点的触发 ID
+ */
+ @NotBlank(message = "触发 ID 不能为空")
+ private String triggerId;
+
+ /**
+ * 触发往下流转的时间点, 格式:yyyy-MM-dd HH:mm:ss
+ *
+ * 应该为 Date 类型,但为了确保特殊情况需要通过 pod 内直接触发
+ */
+ @NotBlank(message = "触发时间不能为空,格式:yyyy-MM-dd HH:mm:ss")
+ private String endTime;
+
+ /**
+ * 用于追加或修改现有的变量值(暂不支持)
+ */
+ @Deprecated
+ private Map variables;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/definition/BpmnProcessDefinitionUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/definition/BpmnProcessDefinitionUpdateDTO.java
index 37bb0011b..63bdb547c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/definition/BpmnProcessDefinitionUpdateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/definition/BpmnProcessDefinitionUpdateDTO.java
@@ -47,6 +47,12 @@ public class BpmnProcessDefinitionUpdateDTO {
@ApiModelProperty(value = "描述")
private String description;
+ /**
+ * 表单 KEY
+ */
+ @ApiModelProperty(value = "表单 KEY")
+ private String formKey;
+
/**
* 模型定义内容
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/log/LogApproveSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/log/LogApproveSearchDTO.java
new file mode 100644
index 000000000..288946c7a
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/log/LogApproveSearchDTO.java
@@ -0,0 +1,57 @@
+package cn.axzo.workflow.common.model.request.bpmn.log;
+
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 用于查询审批日志的人的模型
+ *
+ * @author wangli
+ * @since 2025-07-07 19:40
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class LogApproveSearchDTO {
+
+ @ApiModelProperty("流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 审批任务 ID,如果有值,优先使用 taskId 查询
+ *
+ * 如果没有值,则 personId、tenantId、ouId 一定不能为 null
+ */
+ @ApiModelProperty("审批任务 ID")
+ private String taskId;
+
+ /**
+ * 如果没传 taskId,那么该属性必有值
+ */
+ @ApiModelProperty("审批人 PersonId")
+ private String personId;
+
+ /**
+ * 如果没传 taskId,那么该属性必有值
+ */
+ @ApiModelProperty("审批人 tenantId")
+ private String tenantId;
+
+ /**
+ * 如果没传 taskId,那么该属性应该有值,如果是“工人”可以没有值
+ */
+ @ApiModelProperty("审批人 ouId")
+ private String ouId;
+
+ @ApiModelProperty("指定状态,如果为空,默认指定审批中状态的数据")
+ private BpmnProcessInstanceResultEnum status;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
index b0fbf827f..e2833ef2f 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
@@ -1,6 +1,7 @@
package cn.axzo.workflow.common.model.request.bpmn.model;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
+import cn.axzo.workflow.common.model.request.form.FormJsonModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -19,6 +20,8 @@ import java.io.Serializable;
@Accessors(chain = true)
public class BpmnModelCreateDTO implements Serializable {
+ private static final long serialVersionUID = 1383240088010310865L;
+
@ApiModelProperty(value = "流程模型标识", example = "process_key", hidden = true)
@Length(max = 255, message = "流程标识最长只支持255个字符")
private String key;
@@ -31,19 +34,16 @@ public class BpmnModelCreateDTO implements Serializable {
@Length(max = 32, message = "流程名称最长只支持32个字符")
private String name;
- /**
- * 自定义分类
- */
- @ApiModelProperty(value = "自定义分类", notes = "由业务自定义")
- @NotBlank(message = "自定义分类不能为空")
- private String category;
-
/**
* 描述
*/
@ApiModelProperty(value = "描述", notes = "存放与底层模型中 meta_info 中")
private String description;
+ @ApiModelProperty(value = "表单模型的 Json 结构")
+ @Valid
+ private FormJsonModel formJsonModel;
+
@ApiModelProperty(value = "流程模型的 Json 结构")
@Valid
private BpmnJsonModel jsonModel;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelSearchDTO.java
index 6e6cf3264..4f5bef53a 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelSearchDTO.java
@@ -20,7 +20,7 @@ public class BpmnModelSearchDTO extends BpmPageParam {
* 标识
*/
@ApiModelProperty(value = "流程模型标识", example = "process1641042089407", notes = "精准匹配")
- private String key;
+ private List keys;
/**
* 名称
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
index f7826dd46..7e5e7d735 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
@@ -16,6 +16,8 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
public class BpmnModelUpdateDTO extends BpmnModelCreateDTO {
+ private static final long serialVersionUID = 3661214238064751897L;
+
@ApiModelProperty(value = "流程模型 ID", required = true)
private String processModelId;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java
new file mode 100644
index 000000000..c1603a14c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 获取文档
+ *
+ * @author wangli
+ * @since 2025-04-16 20:18
+ */
+@ApiModel("获取文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocByIdDTO {
+
+ private List ids;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java
new file mode 100644
index 000000000..0ba48428d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 克隆文档
+ *
+ * @author wangli
+ * @since 2025-04-18 11:30
+ */
+@ApiModel("克隆文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocCloneDTO {
+ /**
+ * 文档 ID
+ */
+ private Long docId;
+ /**
+ * 克隆好的文档归属模型 ID
+ */
+ private String targetModelId;
+ /**
+ * 克隆好的文档归属租户
+ */
+ private String targetTenantId;
+
+ /**
+ * 克隆好的文档的 tag
+ */
+ private String targetFileTag;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java
new file mode 100644
index 000000000..ad264818b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java
@@ -0,0 +1,121 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 创建模型关联的文档
+ *
+ * @author wangli
+ * @since 2025-03-27 14:50
+ */
+@ApiModel("创建模型关联的文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocCreateDTO implements Serializable {
+
+ /**
+ * 关联到的模型 ID
+ */
+ @ApiModelProperty(value = "文档被关联到的模型 ID")
+ @NotBlank(message = "模型 ID 不能为空")
+ private String modelId;
+
+ /**
+ * 模型对应业务 KEY
+ */
+ @ApiModelProperty(value = "模型对应的业务 ID")
+ @NotBlank(message = "模型 KEY 不能为空")
+ private String modelKey;
+ /**
+ * 文档关联ID
+ *
+ * word/excel 对应 wps 的 Id,
+ * hp 对应是content 表的主键(前端新建时不回传)
+ * pdf 对应 oss 中的 fileKey
+ */
+ @ApiModelProperty(value = "底层文件关联标识")
+ private String fileRelationId;
+
+ /**
+ * 文件名称
+ */
+ @ApiModelProperty(value = "文件名称")
+ private String fileName;
+
+ /**
+ * 模板名称
+ */
+ @ApiModelProperty(value = "模板名称")
+ private String templateName;
+
+ /**
+ * 自动归档位置(本期不实现)
+ */
+ private String location;
+
+ /**
+ * 文档类型
+ *
+ * WORD("word", "文本"),
+ * EXCEL("excel", "表格"),
+ * HIPRINT("hiprint", "智能文档"),
+ * PDF("pdf", "PDF"),
+ */
+ @ApiModelProperty(value = "文件类型")
+ private FileTypeEnum fileType;
+
+ /**
+ * 业务标签
+ */
+ @ApiModelProperty(value = "业务标签")
+ private String tag;
+
+ /**
+ * 启用状态
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "启用状态")
+ private Boolean status = true;
+
+ /**
+ * 是否是临时文件
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "是否是临时文件,默认 false")
+ private Boolean tempFile = false;
+ /**
+ * 是否必选
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "是否必选")
+ private Boolean require = false;
+
+ /**
+ * HiPrint文件类型,需要回传
+ */
+ @ApiModelProperty(value = "HiPrint文件类型,需要回传,其他类型无视该字段")
+ private String content;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ @Builder.Default
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java
new file mode 100644
index 000000000..ae24e1c55
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java
@@ -0,0 +1,36 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.OrderEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 模型关联的文档排序
+ *
+ * @author wangli
+ * @since 2025-03-31 16:32
+ */
+@ApiModel("模型关联的文档排序")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocOrderDTO implements Serializable {
+ private static final long serialVersionUID = -4783444148609103421L;
+ /**
+ * 文档主键 ID
+ */
+ private Long id;
+
+ /**
+ * 操作顺序
+ */
+ private OrderEnum order;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java
new file mode 100644
index 000000000..a709c868a
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 流程关联文档搜索入参模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:46
+ */
+@ApiModel("流程关联文档搜索入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocQueryDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ private String processInstanceId;
+
+ /**
+ * 流程定义 KEY(业务 ID)
+ */
+ @ApiModelProperty(value = "流程定义 KEY(业务 ID)")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID,对应工作台 ID
+ */
+ @ApiModelProperty(value = "租户 ID,对应工作台 ID")
+ private String tenantId;
+
+ @ApiModelProperty(value = "是否包含临时文档")
+ @Builder.Default
+ private Boolean tempFile = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java
new file mode 100644
index 000000000..08b571111
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java
@@ -0,0 +1,29 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@ApiModel("流程关联文档重置入参模型")
+@Data
+public class DocResetDTO {
+
+ /**
+ * 业务 ID
+ */
+ @NotBlank(message = "业务 ID 不能为空")
+ private String category;
+
+ /**
+ * 代运营模型 ID
+ */
+ @NotBlank(message = "模型 ID 不能为空")
+ private String modelId;
+
+ /**
+ * 代运营的单位或租户ID
+ */
+ @NotBlank(message = "工作台 ID 不能为空")
+ private String workspaceId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java
new file mode 100644
index 000000000..8eece5314
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 流程关联文档搜索入参模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:46
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("流程关联文档搜索入参模型")
+@Data
+public class DocSearchDTO extends BpmPageParam {
+
+ private static final long serialVersionUID = -308388315001754954L;
+ /**
+ * 流程模型 ID
+ */
+ @ApiModelProperty(value = "模型 ID")
+ private String modelId;
+
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+
+ @ApiModelProperty(value = "是否包含临时文档")
+ private Boolean tempFile = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java
new file mode 100644
index 000000000..ba091cf13
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java
@@ -0,0 +1,32 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 流程关联文档状态变更入参模型
+ *
+ * @author wangli
+ * @since 2025-04-07 11:44
+ */
+@ApiModel("流程关联文档状态变更入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocStatusDTO {
+ /**
+ * 文档 ID
+ */
+ @ApiModelProperty(value = "文档 ID")
+ private Long id;
+
+ /**
+ * 状态 true 启用, false 停用
+ */
+ private Boolean status;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java
new file mode 100644
index 000000000..3a3cb16b7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java
@@ -0,0 +1,30 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 查询指定业务下设置过关联文档的代运营项目集合入参
+ *
+ * @author wangli
+ * @since 2025-04-10 17:57
+ */
+@ApiModel("查询指定业务下设置过关联文档的代运营项目集合入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocTenantQueryDTO {
+
+ /**
+ * 业务ID
+ */
+ @NotBlank(message = "业务 ID 不能为空")
+ private String processDefinitionKey;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java
new file mode 100644
index 000000000..ef270fa99
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java
@@ -0,0 +1,30 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 创建模型关联的文档
+ *
+ * @author wangli
+ * @since 2025-03-27 14:50
+ */
+@ApiModel("创建模型关联的文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocUpdateDTO extends DocCreateDTO implements Serializable {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java
new file mode 100644
index 000000000..3775f63e5
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 获取指定打印模板可打印的字段集合的查询入参模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:42
+ */
+@ApiModel("获取指定打印模板可打印的字段集合的查询入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintFieldQueryDTO {
+
+ /**
+ * 模板定义 KEY
+ */
+ @ApiModelProperty(value = "流程模板 KEY")
+ @NotBlank(message = "流程模板 KEY 不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+
+ /**
+ * 是否抛出内部异常
+ */
+ @ApiModelProperty(value = "是否报错内部异常")
+ @Builder.Default
+ private Boolean throwException = true;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java
new file mode 100644
index 000000000..c5e4503b6
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java
@@ -0,0 +1,48 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 获取打印模板配置内容入参模型
+ *
+ * @author wangli
+ * @since 2025-01-20 16:53
+ */
+@ApiModel("获取打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintTemplateConfigQueryDTO {
+
+ /**
+ * 审批模型 ID
+ */
+ @ApiModelProperty(value = "审批模型 ID")
+ private String modelId;
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ private String processInstanceId;
+
+ /**
+ * 业务 ID
+ */
+ @ApiModelProperty(value = "业务 ID")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID,配置 processDefinitionKey 使用
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java
new file mode 100644
index 000000000..432d33d31
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 打印模板配置内容入参模型
+ *
+ * @author wangli
+ * @since 2025-01-20 16:44
+ */
+@ApiModel("打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintTemplateConfigUpsertDTO {
+
+ /**
+ * 审批模型 ID
+ */
+ @ApiModelProperty("审批模型 ID")
+ private String modelId;
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板配置内容
+ */
+ @ApiModelProperty(value = "打印模板配置内容")
+ private String printTemplateConfig;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java
new file mode 100644
index 000000000..d05f50c1e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 重置打印模型(代运营专用)
+ *
+ * @author wangli
+ * @since 2025-01-20 19:55
+ */
+@ApiModel("打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RestPrintTemplateConfigDTO {
+
+ /**
+ * 模板的定义 ID
+ */
+ @ApiModelProperty(value = "模板的定义 ID")
+ @NotBlank(message = "模型定义 ID 不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 代运营模型 ID
+ */
+ @ApiModelProperty(value = "代运营模型 ID")
+ @NotBlank(message = "代运营模板 ID不能为空")
+ private String modelId;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java
new file mode 100644
index 000000000..f5e5a90f8
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java
@@ -0,0 +1,68 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 创建审批流程前的入参模型
+ *
+ * @author wangli
+ * @since 2025-01-15 10:21
+ */
+@ApiModel("创建流程实例前的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BeforeProcessInstanceCreateDTO {
+ /**
+ * 流程定义的标识
+ *
+ * [对应 OMS 系统中审批业务的业务 ID]
+ */
+ @ApiModelProperty(value = "业务 ID")
+ @NotEmpty(message = "流程定义的标识不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 发起流程实例归属租户 ID
+ *
+ * 为空时,默认是编辑公共流程模型, 如果是代运营创建,则必填
+ *
建议都传值,在安心筑中对应工作台 ID
+ */
+ @ApiModelProperty(value = "发起的审批是属于哪个租户")
+ @NotBlank(message = "工作台 ID 不能为空")
+ private String tenantId;
+
+ /**
+ * 组织关系
+ *
+ * 用于流程引擎计算对应节点的审批人, 例如第一个审批节点配置的是劳务分包的岗位,第二个审批节点配置的专业分包的角色,
+ * 那么, 组织关系就需要传入劳务分包的信息以及专业分包的信息,如果还有更多的审批节点配置,以此类推.
+ * 同时,该属性还会用于计算抄送人,以及消息通知的目标接收人
+ */
+ @ApiModelProperty(value = "组织关系")
+ private CooperationOrgDTO cooperationOrg;
+
+ @ApiModelProperty(value = "发起人信息")
+ @Valid
+ private BpmnTaskDelegateAssigner initiator;
+
+ /**
+ * 最后响应的结果中,过滤出需要的类型
+ */
+ @ApiModelProperty(value = "流程节点过滤类型")
+ private List filter;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnBasicProcessInstanceQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnBasicProcessInstanceQueryDTO.java
index 4abf1f7f8..8b770bb76 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnBasicProcessInstanceQueryDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnBasicProcessInstanceQueryDTO.java
@@ -2,7 +2,10 @@ package cn.axzo.workflow.common.model.request.bpmn.process;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.annotation.Nullable;
@@ -17,6 +20,9 @@ import javax.validation.constraints.NotBlank;
@ApiModel("最基础的流程实例查询入参模型")
@Data
@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnBasicProcessInstanceQueryDTO {
/**
* 流程实例 ID
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
index c1af47000..474fdf003 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
@@ -1,11 +1,21 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
/**
* 中止流程实例的入参模型
@@ -15,6 +25,9 @@ import javax.validation.constraints.NotBlank;
*/
@ApiModel("中止流程实例的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnProcessInstanceAbortDTO {
/**
@@ -36,6 +49,55 @@ public class BpmnProcessInstanceAbortDTO {
*/
@ApiModelProperty(value = "中止原因")
@NotBlank(message = "中止原因不能为空")
- @Length(max = 15, message = "中止原因长度不能超过 15 个字符")
+ @Length(max = 100, message = "中止原因长度不能超过 100 个字符")
private String reason;
+
+ /**
+ * 评论信息
+ * advice 统一均为审批节点的审批意见,一般为用户在同意、驳回时填写的内容
+ * 有值时,在日志中一般出现在 operationDesc 的下方
+ */
+ @ApiModelProperty(value = "中止意见")
+ private String advice;
+
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
+ private List attachmentList;
+
+ /**
+ * 中止节点的名称
+ * 为空时,则默认展示为“系统中止”
+ */
+ @ApiModelProperty(value = "中止节点名称")
+ private String nodeName;
+
+ /**
+ * 指定中止的操作人信息
+ *
+ * 只能是 axzo 平台存在的人
+ */
+ @ApiModelProperty(value = "指定该动作的操作人")
+ private BpmnTaskDelegateAssigner assigner;
+
+ /**
+ * 暂不生效
+ * 手写签名图片地址
+ */
+ @ApiModelProperty(value = "手写签名url")
+ @Deprecated
+ private String signatureUrl;
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
index 209f1898a..09f65b23c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
@@ -4,6 +4,7 @@ import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@@ -15,11 +16,13 @@ import java.util.List;
* @author wangli
* @since 06/03/2024 2:35 pm
*/
+@EqualsAndHashCode(callSuper = true)
@ApiModel("用于超管查询所有的流程实例入参模型")
@Data
@ToString(callSuper = true)
public class BpmnProcessInstanceAdminPageReqVO extends BpmPageParam {
+ private static final long serialVersionUID = 5051264217867881829L;
/**
* 流程实例 ID
*/
@@ -34,9 +37,11 @@ public class BpmnProcessInstanceAdminPageReqVO extends BpmPageParam {
/**
* 审批业务分类
+ *
+ * 底层实现统一使用 KEY 进行交互
*/
@ApiModelProperty(value = "审批业务分类")
- private String category;
+ private String key;
/**
* 流程状态
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
index 3b8338265..0296fc6b8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
@@ -1,13 +1,23 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import cn.axzo.workflow.common.valid.group.ValidGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
/**
* 取消流程实例的入参模型
@@ -17,19 +27,23 @@ import javax.validation.constraints.NotNull;
*/
@ApiModel("取消流程实例的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
public class BpmnProcessInstanceCancelDTO {
/**
* 流程实例的编号
*/
@ApiModelProperty(value = "流程实例编号", example = "11")
- @NotBlank(message = "流程实例编号不能为空")
+ @NotBlank(message = "流程实例编号不能为空", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
private String processInstanceId;
/**
* 工作台 ID
*/
@ApiModelProperty(value = "工作台 ID")
+ @NotBlank(message = "工作台不能为空", groups = ValidGroup.Insert.class)
private String tenantId;
/**
@@ -38,12 +52,38 @@ public class BpmnProcessInstanceCancelDTO {
@ApiModelProperty(value = "撤回的原因", example = "主动撤回")
private String reason;
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ , groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
+ private List attachmentList;
+
+ /**
+ * 撤回节点的名称
+ * 为空时,则默认展示为“发起人撤回”
+ */
+ @ApiModelProperty(value = "撤回节点名称")
+ private String nodeName;
+
/**
* 发起人的信息
*/
@ApiModelProperty(value = "审批流程发起人信息")
@Valid
- @NotNull(message = "审批流程的发起人不能为空")
+ @NotNull(message = "审批流程的发起人不能为空", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
private BpmnTaskDelegateAssigner initiator;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ private Boolean async = false;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCarbonCopyDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCarbonCopyDTO.java
index 963fb2a3f..897143a40 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCarbonCopyDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCarbonCopyDTO.java
@@ -1,13 +1,20 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
import java.util.List;
/**
@@ -18,6 +25,9 @@ import java.util.List;
*/
@ApiModel("抄送流程实例的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnProcessInstanceCarbonCopyDTO {
/**
@@ -37,6 +47,12 @@ public class BpmnProcessInstanceCarbonCopyDTO {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
private List attachmentList;
/**
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCheckApproverDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCheckApproverDTO.java
new file mode 100644
index 000000000..ae496e39f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCheckApproverDTO.java
@@ -0,0 +1,42 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 校验指定的人员信息,是否存在指定流程实例中的当前审批人中
+ *
+ * @author wangli
+ * @since 2024/4/29 15:37
+ */
+@ApiModel("校验指定的人员信息,是否存在指定流程实例中的当前审批人中")
+@Data
+public class BpmnProcessInstanceCheckApproverDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "审批实例 ID")
+ @NotBlank(message = "审批实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 参与校验的审批人
+ */
+ @ApiModelProperty(value = "参与校验的审批人")
+ @Valid
+ @NotNull(message = "参与校验的审批人")
+ private BpmnTaskDelegateAssigner approver;
+
+ /**
+ * 是否只用 personId 判断
+ */
+ @ApiModelProperty(value = "是否只用 personId 判断")
+ private Boolean onlyPersonId = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
index 80ae71ff2..1b57e3a1a 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
@@ -1,15 +1,22 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.constant.BpmnConstants;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.math.NumberUtils;
import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -17,7 +24,10 @@ import java.util.Map;
*/
@ApiModel("创建流程实例的入参模型")
@Data
-public class BpmnProcessInstanceCreateDTO {
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnProcessInstanceCreateDTO extends BpmnProcessInstanceCreateWithFormDTO {
/**
* 废弃
@@ -28,27 +38,43 @@ public class BpmnProcessInstanceCreateDTO {
/**
* 流程定义的标识
*
- * [对应业务分类的 businessId]
+ * [对应 OMS 系统中审批业务的业务 ID]
*/
@NotEmpty(message = "流程定义的标识不能为空")
private String processDefinitionKey;
/**
- * 模型归属租户 ID
+ * 发起流程实例归属租户 ID
*
* 为空时,默认是编辑公共流程模型, 如果是代运营创建,则必填
+ *
建议都传值,在安心筑中对应工作台 ID
*/
- @ApiModelProperty(value = "发起的模型是属于哪个租户")
- private String tenantId = "";
+ @ApiModelProperty(value = "发起的审批是属于哪个租户")
+ @NotBlank(message = "工作台 ID 不能为空")
+ private String tenantId;
+
+ /**
+ * 流程在发起时指定审批人
+ */
+ @ApiModelProperty(value = "发起时指定节点的审批人")
+ private Map*节点标识*/String, List> specifyAssignerMap;
/**
* 流程实例关联的变量
*/
+ @Builder.Default
private Map variables = new HashMap<>();
+ /**
+ * 业务管理中定义变量的入参
+ */
+ @Builder.Default
+ private Map bizCustomVariables = new HashMap<>();
+
/**
* 待办相关的变量,如路由参数, 模板参数等等
*/
+ @Builder.Default
private Map pendingVariables = new HashMap<>();
/**
@@ -56,6 +82,7 @@ public class BpmnProcessInstanceCreateDTO {
*
* 用于流程引擎计算对应节点的审批人, 例如第一个审批节点配置的是劳务分包的岗位,第二个审批节点配置的专业分包的角色,
* 那么, 组织关系就需要传入劳务分包的信息以及专业分包的信息,如果还有更多的审批节点配置,以此类推.
+ * 同时,该属性还会用于计算抄送人,以及消息通知的目标接收人
*/
@ApiModelProperty(value = "组织关系")
@NotNull(message = "组织关系不能为空")
@@ -81,11 +108,28 @@ public class BpmnProcessInstanceCreateDTO {
private String customProcessInstanceName;
/**
- * 废弃
- * 下级审批人
+ * 是否异步执行,该异步是引擎的一种运行模式
*/
- // @ApiModelProperty(value = "下级审批人", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人")
- // @Deprecated
- // private BpmnTaskDelegateAssigner nextApprover;
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
-}
+ /**
+ * 签署业务,发起时,可基于模型启用的模板,再勾选使用本次发起时选择的文档标签
+ */
+ @ApiModelProperty(value = "签署业务发起时,选择的文档")
+ private List docIds;
+
+ /**
+ * 仅针对签署业务,设置审批完成后的最终签署人列表,该属性仅为透传,业务消费时,请从 MQ 广播事件中的 variables 中通过 key= {@link BpmnConstants#SIGNATORIES } 获取
+ */
+ @ApiModelProperty(value = "签署业务,最终签署人")
+ private List signatories;
+
+ public String getTenantId() {
+ if (NumberUtils.isDigits(tenantId)) {
+ return tenantId;
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
index 82d47e623..c983e8d45 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
@@ -1,11 +1,11 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import lombok.EqualsAndHashCode;
-import javax.validation.constraints.NotBlank;
+import java.util.Map;
/**
* 创建工作流实例同时携带表单的入参模型
@@ -14,25 +14,30 @@ import javax.validation.constraints.NotBlank;
* @since 2023/7/20 15:49
*/
@ApiModel("创建工作流实例同时携带表单的入参模型")
-@EqualsAndHashCode(callSuper = true)
@Data
-public class BpmnProcessInstanceCreateWithFormDTO extends BpmnProcessInstanceCreateDTO {
+public class BpmnProcessInstanceCreateWithFormDTO {
/**
- * 表单的定义 ID
+ * 审批使用了表单,请一定注意传参
*
- * 参考:ACT_FO_FORM_DEFINITION 表的主键
+ * 图片类型和附件类型组件:请用 @see {@link UploadFieldDTO} 对象集合传入
+ *
+ * // form_image 为表单项的 key, value 为 UploadFileDTO 对象集合,如果前端使用了组件,一般建议回传所有属性;特殊情况下可以只传 fileUrl
+ * "form_image": [{
+ * "fileName": "",
+ * "fileUrl": "http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960",
+ * "fileKey": 123
+ * }]
+ *
*/
- @ApiModelProperty(value = "表单定义 ID", example = "ssss")
- @NotBlank(message = "表单不能为空")
- private String formDefinitionId;
-
+ @ApiModelProperty(value = "通过表单创建流程时传入的初始表单数据")
+ private Map startFormVariables;
/**
* 工作流实例集成表单后,可以通过表单 key 组装成的变量存入该变量的值,可用于后续流程的流转
*
* 一般不用设置
*/
- @ApiModelProperty(value = "用于接入外部传入的信息", hidden = true)
+ @ApiModelProperty(value = "用于接入外部传入的信息, 类似于 Bpmn 的 BusinessKey", hidden = true)
private String outcome;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java
new file mode 100644
index 000000000..e0a4841d7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java
@@ -0,0 +1,55 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 查询流程实例日志
+ *
+ * @author wangli
+ * @since 2024-09-07 17:32
+ */
+@ApiModel("查询流程实例日志")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnProcessInstanceLogQueryDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 谁来访问该实例日志,如果为空,则始终不就返回按钮信息
+ *
+ * 注意,为了确保历史审批数据的查询,需要将除 avatar 外的其他所有属性补全
+ */
+ @ApiModelProperty(value = "访问者信息", notes = "如果为空,则始终不就返回按钮信息")
+ private BpmnTaskDelegateAssigner visitor;
+
+ /**
+ * 返回结果中是否包含按钮
+ */
+ @ApiModelProperty(value = "返回结果中是否包含按钮", notes = "如果访问者为空,该属性为 true 时,同样也不会返回按钮")
+ @Builder.Default
+ private Boolean hasButton = false;
+
+ /**
+ * 是否需要加密(同一个实例的日志,在不同端[cms/oms]下,审批人的信息需要按一定规则进行隐藏控制)
+ */
+ @ApiModelProperty(value = "是否需要加密", notes = "同一个实例的日志,在不同端[cms/oms]下,审批人的信息需要按一定规则进行隐藏控制")
+ private Boolean encrypt;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java
index dbfc7cd97..870c06726 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java
@@ -49,7 +49,7 @@ public class BpmnProcessInstanceMyPageReqVO extends BpmPageParam {
* 业务分类
*/
@ApiModelProperty(value = "自定义分类")
- private String category;
+ private String key;
/**
* 发起时间
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceQueryDTO.java
index 8a445e11b..013ec1689 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceQueryDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceQueryDTO.java
@@ -2,8 +2,11 @@ package cn.axzo.workflow.common.model.request.bpmn.process;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java
new file mode 100644
index 000000000..80ba346d2
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java
@@ -0,0 +1,24 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 获取流程实例中变量集合的入参模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:05
+ */
+@ApiModel("获取流程实例中变量集合的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnProcessInstanceVariablesDTO {
+
+ private String processInstanceId;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/HistoricProcessInstanceSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/HistoricProcessInstanceSearchDTO.java
index a2c0a504d..5057ae3ea 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/HistoricProcessInstanceSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/HistoricProcessInstanceSearchDTO.java
@@ -23,7 +23,7 @@ public class HistoricProcessInstanceSearchDTO extends BpmPageParam {
@ApiModelProperty(value = "businessKey OR Name")
private String searchKey;
- private String category;
+ private String key;
private String result;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java
new file mode 100644
index 000000000..7773be65e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 取消流程实例的入参模型
+ *
+ * @author wangli
+ * @since 2023/7/17 09:34
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("取消流程实例的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class SuperBpmnProcessInstanceCancelDTO extends BpmnProcessInstanceCancelDTO {
+
+ private Boolean superAdmin;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java
new file mode 100644
index 000000000..3c7d1b9f5
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 签署业务流程实例,查询审批的关联文档阅读状态入参
+ *
+ * @author wangli
+ * @since 2025-04-08 11:27
+ */
+@ApiModel("签署业务流程实例,查询审批的关联文档阅读状态入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class ApproverReadStatusDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 访问人
+ */
+ @ApiModelProperty(value = "访问人")
+ @NotNull(message = "访问人信息不能为空")
+ private BpmnTaskDelegateAssigner assigner;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java
new file mode 100644
index 000000000..3d04bbbde
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java
@@ -0,0 +1,36 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 签署业务流程实例,更新审批的关联文档阅读状态入参
+ *
+ * @author wangli
+ * @since 2025-04-08 14:50
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("签署业务流程实例,更新审批的关联文档阅读状态入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class ChangeApproverReadStatusDTO extends ApproverReadStatusDTO {
+ /**
+ * 文档ID
+ */
+ @ApiModelProperty(value = "文档 ID")
+ @NotNull(message = "文档 ID 不能为空")
+ private Long docId;
+
+ @ApiModelProperty(value = "阅读状态")
+ @NotNull(message = "阅读状态不能为空")
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java
new file mode 100644
index 000000000..6d6a21d06
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 签署业务流程实例,在审批待办中查询文档列表的入参
+ *
+ * @author wangli
+ * @since 2025-04-03 16:30
+ */
+@ApiModel("签署业务流程实例,在审批待办中查询文档列表的入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ProcessDocQueryDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 只有当该属性传值后,响应模型中才会返回阅读状态信息
+ */
+ @ApiModelProperty(value = "访问者")
+ private BpmnTaskDelegateAssigner assigner;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
index 0ce3b76f0..e0995aed8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
@@ -3,10 +3,16 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.easyes.annotation.IndexField;
+import org.dromara.easyes.annotation.rely.FieldType;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
+import java.io.Serializable;
/**
* 附件模型
@@ -16,11 +22,16 @@ import javax.validation.constraints.NotNull;
*/
@ApiModel("附件模型")
@Data
-public class AttachmentDTO {
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class AttachmentDTO implements Serializable {
+ private static final long serialVersionUID = 6954179791395744269L;
/**
* 附件 ID
*/
+ @IndexField(fieldType = FieldType.KEYWORD)
private String id;
/**
@@ -28,6 +39,7 @@ public class AttachmentDTO {
*/
@ApiModelProperty(value = "附件类型")
@NotNull(message = "附件类型不能为空")
+ @IndexField(fieldType = FieldType.KEYWORD)
private AttachmentTypeEnum type;
/**
@@ -35,12 +47,14 @@ public class AttachmentDTO {
*/
@ApiModelProperty(value = "文件名称不能为空")
@NotBlank(message = "文件名称不能为空")
+ @IndexField(fieldType = FieldType.KEYWORD)
private String name;
/**
* 文件描述
*/
@ApiModelProperty(value = "文件描述")
+ @IndexField(exist = false)
private String description;
/**
@@ -48,6 +62,13 @@ public class AttachmentDTO {
*/
@ApiModelProperty(value = "附件地址")
@NotBlank(message = "附件地址不能为空")
+ @IndexField(fieldType = FieldType.KEYWORD)
private String url;
+ /**
+ * 文件 OSS 的 fileKey
+ */
+ @ApiModelProperty(value = "附件 oss 的 fileKey")
+ private String fileKey;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BaseBpmnTaskDelegateAssigner.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BaseBpmnTaskDelegateAssigner.java
new file mode 100644
index 000000000..a50fff4aa
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BaseBpmnTaskDelegateAssigner.java
@@ -0,0 +1,30 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 一些审批人模型的扩展信息
+ *
+ * @author wangli
+ * @since 2025-06-28 13:17
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public abstract class BaseBpmnTaskDelegateAssigner {
+
+ /**
+ * 人员标签
+ * 0: 注销 1:离场 2: 离职
+ */
+ private Integer tag;
+
+ /**
+ * 是否能提级审批
+ */
+ private Boolean supportUpgradeApproval;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
index 8095efa78..baa69fe44 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
@@ -2,11 +2,13 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
-import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
import java.util.List;
/**
@@ -17,6 +19,9 @@ import java.util.List;
*/
@ApiModel("业务节点设置审批人")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnActivitySetAssigneeDTO {
/**
* PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件中的触发 ID
@@ -42,11 +47,12 @@ public class BpmnActivitySetAssigneeDTO {
private String processInstanceId;
/**
- * 需要设置的审批人, 业务侧自行去重, 请根据 personId 进行去重, 如果发现有重复, 并抛出异常
+ * 需要设置的审批人, 业务侧自行去重, 请根据 personId 进行去重, 如果发现有重复, 并抛出异常.
+ *
+ * 业务如果传入的 assigners 集合为空, 引擎则会对该流程进行自动中止处理,且驳回意见为“业务未指定审批人”
*/
@ApiModelProperty(value = "审批人集合信息", notes = "业务传参时,需要注意去重")
- @Valid
- @NotEmpty(message = "审批人不能为空")
+ @Size(max = 60, message = "指定审批人数量限制为60")
private List assigners;
/**
@@ -55,6 +61,14 @@ public class BpmnActivitySetAssigneeDTO {
*
* 如果业务不能接受,请自己主动去重后提交.
*/
+ @Builder.Default
private Boolean serverSideDeduplication = false;
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = false;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java
new file mode 100644
index 000000000..be10451a9
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 推动业务节点继续执行
+ *
+ * @author wangli
+ * @since 2024-09-09 13:46
+ */
+@ApiModel("业务节点设置审批人")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnActivityTriggerDTO implements Serializable {
+
+ private static final long serialVersionUID = 1759998765977414031L;
+
+ /**
+ * 业务节点的触发 ID
+ */
+ @NotBlank(message = "触发 ID 不能为空")
+ @ApiModelProperty(value = "触发 ID", notes = "数据来源于事件")
+ private String triggerId;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
+
+ /**
+ * 流程定义节点id
+ */
+ private String activityId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java
new file mode 100644
index 000000000..c01572e98
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java
@@ -0,0 +1,67 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 审批节点退回模型
+ *
+ */
+@ApiModel("审批节点退回模型")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnNodeBackSystemOperateDTO implements Serializable {
+
+ private static final long serialVersionUID = -4160538355403179298L;
+
+ @ApiModelProperty(value = "流程实例id", required = true)
+ @NotBlank(message = "流程实例id不能为空")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "当前流程节点id", required = true)
+ @NotBlank(message = "当前节点id不能为空")
+ private String currentActivityId;
+
+ @ApiModelProperty(value = "目标流程节点id", required = true)
+ @NotBlank(message = "目标流程节点id不能为空")
+ private String toActivityId;
+
+ @ApiModelProperty(value = "可以指定任务处理", required = true)
+ private List targetTaskIds;
+
+ @ApiModelProperty(value = "意见")
+ private String advice;
+
+ @ApiModelProperty(value = "操作描述")
+ private String operationDesc;
+
+ @ApiModelProperty(value = "操作人")
+ private BpmnTaskDelegateAssigner operator;
+
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
+ private List attachmentList;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnOptionalNodeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnOptionalNodeDTO.java
new file mode 100644
index 000000000..935f5d201
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnOptionalNodeDTO.java
@@ -0,0 +1,52 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 回退到指定节点,可选节点模型
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class BpmnOptionalNodeDTO {
+
+ /**
+ * 对应流程实例id
+ */
+ private String processInstanceId;
+
+ /**
+ * 对应流程定义id
+ */
+ private String processDefinitionId;
+
+ /**
+ * 节点id
+ */
+ private String processActivityId;
+
+ /**
+ * 节点名称
+ */
+ private String processActivityName;
+
+ /**
+ * 节点描述,用于页面展示
+ */
+ private String processNodeDesc;
+
+ /**
+ * 节点类型
+ */
+ private BpmnFlowNodeType nodeType;
+
+ /**
+ * 序号,越小越靠近发起节点
+ */
+ private Integer ordinal;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
index 2ed96b9df..905c68fe4 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
@@ -1,11 +1,19 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
/**
* 完成机器人节点的入参模型
@@ -15,6 +23,9 @@ import javax.validation.constraints.NotBlank;
*/
@ApiModel("完成机器人节点的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnRobotTaskCompleteDTO {
/**
@@ -34,14 +45,32 @@ public class BpmnRobotTaskCompleteDTO {
/**
* 完成机器人节点的人信息
*
- * @since 1.3.0 版本不支持传人员信息
+ * @since 暂不支持传人员信息
*/
@ApiModelProperty(value = "当前审核人信息", notes = "可为空,则该任务不验证用户归属")
- // @Valid
- // @NotNull(message = "审批人不能为空")
+ @Deprecated
private BpmnTaskDelegateAssigner approver;
@ApiModelProperty(value = "机器人节点信息")
@Valid
private BpmnFlowNodeDTO robotNode;
+
+ /**
+ * 图片附件
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
+ private List attachmentList;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
index e7281fafa..f84e15c7c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
@@ -2,7 +2,10 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
@@ -16,6 +19,9 @@ import javax.validation.constraints.NotNull;
*/
@ApiModel("创建机器人节点的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnRobotTaskCreateDTO {
/**
* 流程实例 ID
@@ -27,11 +33,10 @@ public class BpmnRobotTaskCreateDTO {
/**
* 当前审核人信息
*
- * @since 1.3.0 版本不支持传人员信息
+ * @since 暂不支持传人员信息
*/
@ApiModelProperty(value = "当前审核人信息", notes = "可为空,则该任务不验证用户归属", hidden = true)
- // @Valid
- // @NotNull(message = "审批人不能为空")
+ @Deprecated
private BpmnTaskDelegateAssigner approver;
/**
@@ -41,4 +46,11 @@ public class BpmnRobotTaskCreateDTO {
@Valid
@NotNull(message = "机器人节点信息不能为空")
private BpmnFlowNodeDTO robotNode;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
index 81c5d947b..64f01c435 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
@@ -1,22 +1,34 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
import java.util.List;
/**
* 审批任务节点的入参模型
+ *
* @author wangli
*/
@ApiModel("审批任务节点的入参模型")
@Data
@Validated
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnTaskAuditDTO {
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
@@ -33,6 +45,12 @@ public class BpmnTaskAuditDTO {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
private List attachmentList;
/**
@@ -55,4 +73,24 @@ public class BpmnTaskAuditDTO {
@ApiModelProperty(value = "下级审批人信息", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人")
// @Valid
private BpmnTaskDelegateAssigner nextApprover;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
+
+ /**
+ * 指定节点类型
+ */
+ @ApiModelProperty(value = "指定节点类型", notes = "指定节点类型,类型不匹配抛出异常")
+ @Deprecated
+ private List nodeTypes;
+
+ /**
+ * 操作描述,该属性为流程服务内部使用
+ */
+ @Deprecated
+ private String operationDesc;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java
new file mode 100644
index 000000000..89c35023c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Map;
+
+/**
+ * 审批同意时携带表单
+ *
+ * @author wangli
+ * @since 2024-11-08 11:36
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(value = "审批任务携带表单数据的入参模型")
+public class BpmnTaskAuditWithFormDTO extends BpmnTaskAuditDTO {
+
+ /**
+ * 表单数据
+ *
+ * 必须为全量表单数据,不能只提交部分表单数据
+ */
+ @ApiModelProperty(value = "表单数据")
+ private Map formVariables;
+
+ /**
+ * 暂对不用
+ */
+ private String outcome;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskBackAuditDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskBackAuditDTO.java
new file mode 100644
index 000000000..b4a2aed67
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskBackAuditDTO.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("回退到指定节点入参模型")
+@Data
+@Validated
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnTaskBackAuditDTO extends BpmnTaskAuditDTO implements Serializable {
+
+ private static final long serialVersionUID = -4160538355403179298L;
+
+ @ApiModelProperty(value = "目标流程节点id", required = true)
+ @NotBlank(message = "目标流程节点id不能为空")
+ private String toActivityId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java
new file mode 100644
index 000000000..dc32d16c7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+@ApiModel("获取审批任务按钮,状态入参模型")
+public class BpmnTaskButtonSearchDTO implements Serializable {
+
+ private static final long serialVersionUID = -3220083731019329293L;
+
+ @ApiModelProperty(value = "流程实例id", required = true)
+ @NotBlank(message = "流程实例id不能为空")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "审批任务id", required = true)
+ @NotBlank(message = "审批任务id不能为空")
+ private String taskId;
+
+ private Long initiatorPersonId;
+
+ private Long executorPersonId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
index 1d8b3f843..4d5be875d 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
@@ -1,13 +1,20 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@@ -19,6 +26,9 @@ import java.util.List;
*/
@ApiModel("评论的入参模型")
@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnTaskCommentDTO implements Serializable {
/**
@@ -54,7 +64,20 @@ public class BpmnTaskCommentDTO implements Serializable {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
@Valid
private List attachmentList;
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = false;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
index 00d21bbb4..9bdc7c69b 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
@@ -1,13 +1,20 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@@ -21,6 +28,9 @@ import java.util.List;
*/
@Data
@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnTaskCountersignDTO implements Serializable {
private static final long serialVersionUID = -8106887960942113552L;
@@ -52,6 +62,12 @@ public class BpmnTaskCountersignDTO implements Serializable {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
private List attachmentList;
/**
@@ -69,4 +85,11 @@ public class BpmnTaskCountersignDTO implements Serializable {
@NotNull(message = "加签任务发起人不能为空")
private BpmnTaskDelegateAssigner originAssigner;
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
index 8a03f6428..7607bf78a 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
@@ -5,9 +5,13 @@ import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.dromara.easyes.annotation.IndexField;
+import org.dromara.easyes.annotation.rely.FieldType;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
@@ -32,6 +36,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ROBOT_ASSIGNEE_ID;
*
* @author wangli
*/
+@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@NoArgsConstructor
@@ -39,24 +44,28 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ROBOT_ASSIGNEE_ID;
@Accessors(chain = true)
@Validated
@Slf4j
-public class BpmnTaskDelegateAssigner implements Serializable {
+public class BpmnTaskDelegateAssigner extends BaseBpmnTaskDelegateAssigner implements Serializable {
private static final long serialVersionUID = -8106887960942113552L;
/**
- * 审核人标识, 应该必传
+ * 【废弃】审核人标识, 应该必传
*
* 枢智:用户 ID
* 安心筑:身份 ID
*/
+ @Deprecated
+ @IndexField(fieldType = FieldType.KEYWORD)
private String assignee;
/**
- * 审核人标识扩展信息
+ * 【废弃】审核人标识扩展信息
*
* 枢智:可不传
* 安心筑:身份 Type 应该必传
*/
+ @Deprecated
+ @IndexField(fieldType = FieldType.KEYWORD)
private String assigneeType;
/**
@@ -65,13 +74,17 @@ public class BpmnTaskDelegateAssigner implements Serializable {
* 枢智:用户姓名
* 安心筑:用户姓名
*/
+ @IndexField(fieldType = FieldType.KEYWORD)
private String assignerName;
/**
* 对应安心筑特殊的PersonId
*
* 仅安心筑使用, 应该必传
+ *
+ *
注意:该属性在部分场景下会是非 Long 类型的值,建议业务消费时,调用{@link BpmnTaskDelegateAssigner#parsePersonId()}函数进行转换
*/
+ @IndexField(fieldType = FieldType.KEYWORD)
private String personId;
/**
@@ -80,20 +93,28 @@ public class BpmnTaskDelegateAssigner implements Serializable {
* 枢智: 企业 ID
* 安心筑: 工作台 ID
*/
+ @IndexField(fieldType = FieldType.KEYWORD)
private String tenantId;
/**
* 人所在的单位 ID
* 仅安心筑使用, 工人可以没有, 其他身份一定需要
*/
+ @IndexField(fieldType = FieldType.KEYWORD)
private String ouId;
/**
- * 该属性业务接入时无需关系. 尽量保证其他属性都设值.
+ * 该属性业务接入时无需关心. 尽量保证其他属性都设值.
* 头像
*/
+ @IndexField(exist = false)
private String avatar;
+ /**
+ * 人员对应的 nodeId,如果在审批模板中对应节点未使用流程自主查询审批人的功能(如指定岗位/身份/角色之类),则需要业务方主动传入
+ */
+ private String nodeId;
+
public final String buildAssigneeId_1_2_1() {
if (StringUtils.hasLength(assigneeType)) {
return tenantId + "|" + assignee + "|" + assigneeType;
@@ -105,6 +126,10 @@ public class BpmnTaskDelegateAssigner implements Serializable {
* @since 1.3.0 版本起, 使用 ouId + personId 作为审批人唯一标识
*/
public final String buildAssigneeId() {
+ if (Objects.equals(personId, "system")) {
+ // 特殊逻辑,用于服务内部系统驳回、拒绝时的特殊处理
+ return personId;
+ }
if (StringUtils.hasLength(ouId)) {
return ouId + "|" + personId;
} else {
@@ -112,6 +137,18 @@ public class BpmnTaskDelegateAssigner implements Serializable {
}
}
+ public BpmnTaskDelegateAssigner(String assignerName, String personId, String tenantId) {
+ this.assignerName = assignerName;
+ this.personId = personId;
+ this.tenantId = tenantId;
+ }
+
+ public BpmnTaskDelegateAssigner(String assignee, String assigneeType, String assignerName, String personId, String tenantId) {
+ this.assignerName = assignerName;
+ this.personId = personId;
+ this.tenantId = tenantId;
+ }
+
public final boolean comparePersonIdToOther(BpmnTaskDelegateAssigner other) {
return Objects.equals(personId, other.getPersonId());
}
@@ -143,7 +180,7 @@ public class BpmnTaskDelegateAssigner implements Serializable {
}
}
} catch (Exception e) {
- log.error("审批人模型数据比对发现意外数据, assignee: " + assignee);
+ log.warn("审批人模型数据比对发现意外数据, assignee: {}", assignee);
}
return false;
}
@@ -169,8 +206,54 @@ public class BpmnTaskDelegateAssigner implements Serializable {
.setTenantId(tenantId);
}
- @Override
- public String toString() {
+ public String toJson() {
return JSON.toJSONString(this);
}
+
+
+ /**
+ * 兼容版本间的不同类型转换成审批人模型
+ *
+ * @param request 目前存在两种类型,一种为 BpmnTaskDelegateAssigner 实例对象, 另一种为 String 类型的 JSON 数据
+ * @return
+ */
+ public static BpmnTaskDelegateAssigner toObjectCompatible(Object request) {
+ if (Objects.isNull(request)) {
+ return null;
+ }
+ if (request instanceof BpmnTaskDelegateAssigner) {
+ return (BpmnTaskDelegateAssigner) request;
+ } else if (request instanceof String) {
+ return toObject((String) request);
+ } else {
+ return null;
+ }
+ }
+
+ public static BpmnTaskDelegateAssigner toObject(String jsonStr) {
+ return JSON.parseObject(jsonStr, BpmnTaskDelegateAssigner.class);
+ }
+
+ /**
+ * @return
+ */
+ public Long parsePersonId() {
+ if (NumberUtils.isDigits(personId)) {
+ return Long.parseLong(personId);
+ } else {
+ return 0L;
+ }
+ }
+
+ public static void main(String[] args) {
+ BpmnTaskDelegateAssigner assigner = new BpmnTaskDelegateAssigner();
+ assigner.setPersonId("system");
+ System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId());
+
+ assigner.setPersonId("");
+ System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId());
+
+ assigner.setPersonId("123");
+ System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId());
+ }
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
index 7f51ba85b..806bd51b1 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
@@ -2,10 +2,13 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
@@ -16,8 +19,16 @@ import java.util.List;
*/
@ApiModel("催办功能入参模型")
@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnTaskRemindDTO {
-
+ /**
+ * 操作催办时的终端类型,管理端cmp、工人端cm
+ */
+ @NotBlank(message = "终端类型不能为空")
+ private String terminalType;
/**
* 审批节点唯一标识
*/
@@ -27,9 +38,9 @@ public class BpmnTaskRemindDTO {
/**
* 催办方式
*
- * 站内信:notice 短信:sms
+ * IM, 如果为空,默认是 IM
*/
- @NotEmpty(message = "催办方式不能为空")
+ @ApiModelProperty(value = "催办方式", example = "im")
private List remindTypes;
/**
@@ -40,8 +51,9 @@ public class BpmnTaskRemindDTO {
private String processInstanceId;
/**
- * 租户 ID
+ * 是否异步执行
*/
- @ApiModelProperty("租户 ID")
- private String tenantId;
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskResetApproversDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskResetApproversDTO.java
new file mode 100644
index 000000000..c8f2e9305
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskResetApproversDTO.java
@@ -0,0 +1,80 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 重置指定节点下的所有审批人
+ *
+ * @author wangli
+ * @since 2025-06-24 17:07
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnTaskResetApproversDTO implements Serializable {
+ private static final long serialVersionUID = 4570922472032531513L;
+
+ /**
+ * 审批任务ID
+ */
+ @ApiModelProperty(value = "审批任务ID")
+ @NotEmpty(message = "任务ID不能为空")
+ private String taskId;
+
+ /**
+ * 加签意见
+ */
+ @ApiModelProperty(value = "提级意见")
+ private String advice;
+
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
+ private List attachmentList;
+
+ /**
+ * 任务提级给谁审批
+ */
+ @ApiModelProperty(value = "任务提级给谁审批")
+ @NotEmpty(message = "任务接收人不能为空")
+ private List targetAssignerList;
+
+ /**
+ * 任务操作人
+ */
+ @ApiModelProperty(value = "任务原发起人")
+ @Valid
+ @NotNull(message = "任务发起人不能为空")
+ private BpmnTaskDelegateAssigner originAssigner;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
index 122dab987..dc4c0f7c8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
@@ -1,11 +1,19 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
import java.util.List;
/**
@@ -16,7 +24,12 @@ import java.util.List;
*/
@ApiModel("转交审批任务的入参模型")
@Data
-public class BpmnTaskTransferDTO {
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnTaskTransferDTO implements Serializable {
+
+ private static final long serialVersionUID = 8142105892475867826L;
/**
* 审批任务 ID
@@ -35,13 +48,38 @@ public class BpmnTaskTransferDTO {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
private List attachmentList;
+ /**
+ * 审批任务原审批人
+ */
@ApiModelProperty(value = "审批任务原审批人", notes = "可以为空,意义在于可以将没有指派给任何人的任务转交给其他人")
@Valid
private BpmnTaskDelegateAssigner originAssigner;
- @ApiModelProperty(value = "审批任务转发给谁", notes = "可以为空,意义在于如果分配给某离职的人,可能需要置为空")
+ /**
+ * 审批任务转交给谁
+ */
+ @ApiModelProperty(value = "审批任务转交给谁", notes = "可以为空,意义在于如果分配给某离职的人,可能需要置为空")
private BpmnTaskDelegateAssigner targetAssigner;
+ /**
+ * 转交描述
+ */
+ @ApiModelProperty(value = "转交描述", notes = "正常是'xx转交给xx',该字段值追加在后面")
+ private String additionalOpeDesc;
+
+ /**
+ * 是否异步执行
+ */
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
index e88d62a65..a16d170dc 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
@@ -3,7 +3,12 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
/**
* 扩展的历史任务表搜索入参模型
@@ -13,6 +18,9 @@ import lombok.Data;
*/
@ApiModel("扩展的历史任务表搜索入参模型")
@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class ExtHiTaskSearchDTO {
@ApiModelProperty("流程实例 ID")
@@ -29,4 +37,7 @@ public class ExtHiTaskSearchDTO {
@ApiModelProperty("任务状态")
private BpmnProcessInstanceResultEnum status;
+
+ @ApiModelProperty("需要排除的id列表")
+ private List excludeIds;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryConfigSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryConfigSearchDTO.java
index e3d32a85f..7f6218892 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryConfigSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryConfigSearchDTO.java
@@ -2,6 +2,7 @@ package cn.axzo.workflow.common.model.request.category;
import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -21,25 +22,30 @@ public class CategoryConfigSearchDTO extends BpmPageParam {
/**
* 分类ID
*/
+ @ApiModelProperty(value = "字典 ID")
private Long dictId;
/**
* 配置类型
*/
+ @ApiModelProperty(value = "配置类型")
private String configType;
/**
* 工作台 ID
*/
+ @ApiModelProperty(value = "工作台 ID")
private Long workspaceId;
/**
* 工作台 ID 集合
*/
+ @ApiModelProperty(value = "工作台 ID 集合")
private List workspaceIds;
/**
* 操作人姓名
*/
+ @ApiModelProperty(value = "操作人姓名")
private String operationName;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
index 038ff3840..d80e8f178 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
@@ -9,36 +10,81 @@ import javax.validation.constraints.NotBlank;
@Data
public class CategoryCreateDTO {
+ /**
+ * 字典标签
+ */
@ApiModelProperty(value = "字典标签", example = "新业务")
@Length(max = 50, message = "字典标签最长只支持255个字符")
@NotBlank(message = "字典标签表示不能为空")
private String label;
+ /**
+ * 字典值
+ */
@ApiModelProperty(value = "字典值", example = "new_business")
@Length(max = 50, message = "字典值最长只支持50个字符")
@NotBlank(message = "字典值表示不能为空")
private String value;
+ /**
+ * 字典类型
+ */
@ApiModelProperty(value = "字典类型", example = "字典类型(用于字典分组)")
private String type;
+ /**
+ * 备注
+ */
@ApiModelProperty(value = "备注", example = "remark")
@Length(max = 250, message = "备注最长只支持250个字符")
private String remark;
+ /**
+ * 字典排序
+ */
@ApiModelProperty(value = "字典排序", example = "1")
private Long sort;
+ /**
+ * 状态
+ */
@ApiModelProperty(value = "状态", example = "true or false")
private Boolean status;
+ /**
+ * 创建人姓名
+ */
@ApiModelProperty(value = "创建人姓名", example = "张三")
private String operatorName;
- @ApiModelProperty(value = "工作台类型值")
+ /**
+ * 工作台类型: 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台
+ */
+ @ApiModelProperty(value = "工作台类型值, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台")
private String workspaceCodeType;
+ /**
+ * 租户
+ */
@ApiModelProperty(value = "租户", example = "1")
private String tenantId = "";
+ /**
+ * 业务类型
+ */
+ @ApiModelProperty(value = "业务类型,SIGN-签署业务,APPROVAL-审批业务")
+ private BusinessTypeEnum businessType;
+
+ /**
+ * 图标
+ */
+ @ApiModelProperty(value = "图标")
+ private String icon;
+
+ /**
+ * 是否展示在发起工作台
+ */
+ @ApiModelProperty(value = "是否展示在发起工作台,默认为false")
+ private Boolean displayInitiateMenu = false;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java
new file mode 100644
index 000000000..e0862cc54
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.model.request.category;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Min;
+
+@ApiModel("业务分类分组和变量搜索入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarSearchDto {
+
+ @Min(value = 1, message = "字典ID必须大于0")
+ @ApiModelProperty(value = "字典 ID")
+ private Long dictId;
+
+ /**
+ * 所属业务code
+ */
+ @ApiModelProperty(value = "所属业务")
+ private String category;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java
new file mode 100644
index 000000000..24fde2c59
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java
@@ -0,0 +1,104 @@
+package cn.axzo.workflow.common.model.request.category;
+
+import cn.axzo.workflow.common.enums.VarTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarUpsertDto {
+
+ @ApiModelProperty(value = "字典id")
+ @Min(value = 1, message = "字典id值必须大于等1")
+ @NotNull(message = "字典id不能为空")
+ private Long dictId;
+
+ @Valid
+ private List groupVos;
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryGroupUpsertVo implements Serializable {
+ private static final long serialVersionUID = 5406711143425155649L;
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 上级分组id
+ */
+ private Long parentGroupId;
+
+ /**
+ * 分组名
+ */
+ @NotBlank(message = "分组名称不能为空")
+ @Length(max = 50, message = "字典标签最长只支持50个字符")
+ private String groupName;
+
+ @NotNull(message = "序号不能为空")
+ private Integer ordinal;
+
+ @Valid
+ private List vars;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryVarUpsertVo implements Serializable {
+
+ private static final long serialVersionUID = -1918203166603971593L;
+
+ private Long id;
+
+ /**
+ * 分组id
+ */
+ private Long groupId;
+
+ /**
+ * 变量类型,文本/图片
+ */
+ @NotNull(message = "变量类型不能为空")
+ private VarTypeEnum type;
+
+ /**
+ * 变量code
+ */
+ @NotBlank(message = "变量编码不能为空")
+ @Length(max = 50, message = "变量编码最长只支持50个字符")
+ @Pattern(regexp = "^[a-zA-Z]+$", message = "变量编码仅限英文字符")
+ private String code;
+
+ /**
+ * 变量名称
+ */
+ @NotBlank(message = "变量名称不能为空")
+ @Length(max = 50, message = "变量名称最长只支持50个字符")
+ private String name;
+
+ @NotNull(message = "序号不能为空")
+ private Integer ordinal;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
index 5a8fab133..2e2738eae 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -13,21 +14,48 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class CategorySearchDTO extends BpmPageParam {
+ /**
+ * 字典类型, bpm_model_category
+ */
@ApiModelProperty(value = "字典类型", example = "dict_group", notes = "精准匹配")
private String dictType;
+ /**
+ * 字典标签, 对应业务名称
+ */
@ApiModelProperty(value = "字典标签", example = "新业务")
private String label;
+ /**
+ * 字典值, 对应业务 ID
+ */
@ApiModelProperty(value = "字典值", example = "new_business")
private String value;
+ /**
+ * 字典状态, 0 停用, 1 启用
+ */
@ApiModelProperty(value = "状态", example = "0 or 1")
private Integer status;
- @ApiModelProperty(value = "工作台类型值")
+ /**
+ * 工作台类型: 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台
+ */
+ @ApiModelProperty(value = "工作台类型值, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台")
private String workspaceTypeCode;
+ /**
+ * 租户 ID
+ */
@ApiModelProperty(value = "租户 ID", example = "1")
private String tenantId = "";
+
+ /**
+ * 业务类型
+ */
+ @ApiModelProperty(value = "业务类型")
+ private BusinessTypeEnum businessType;
+
+ @ApiModelProperty(value = "根据创建时间排序")
+ private String orderCreateAt;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/InstanceSearchReqDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/InstanceSearchReqDTO.java
new file mode 100644
index 000000000..5ada6095f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/InstanceSearchReqDTO.java
@@ -0,0 +1,53 @@
+package cn.axzo.workflow.common.model.request.es;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 搜索 Es 中实例纬度的数据
+ *
+ * @author wangli
+ * @since 2024-10-08 14:03
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("搜索 Es 中实例纬度的数据")
+@Data
+public class InstanceSearchReqDTO extends BpmPageParam {
+
+ @ApiModelProperty(value = "审批人所属租户 ID")
+ private String tenantId;
+
+ @ApiModelProperty(value = "审批人所属单位 ID")
+ private String ouId;
+
+ @ApiModelProperty(value = "审批人自然人 ID")
+ private String personId;
+
+ @ApiModelProperty(value = "审批人姓名")
+ private String assigneeName;
+
+ @ApiModelProperty(value = "流程实例状态", notes = "参考 BpmnProcessInstanceResultEnum 枚举")
+ private String businessStatus;
+
+ @ApiModelProperty(value = "流程实例名称")
+ private String processInstanceName;
+
+ private Date beginStartTime;
+ private Date overStartTime;
+
+ private Date beginEndTime;
+ private Date overEndTime;
+
+ /**
+ * 流程实例 ID, 与其它所有的属性互斥
+ */
+ @ApiModelProperty(value = "流程实例 ID 集合")
+ private List processInstanceIds;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/TaskSearchReqDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/TaskSearchReqDTO.java
new file mode 100644
index 000000000..48bd511e3
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/es/TaskSearchReqDTO.java
@@ -0,0 +1,57 @@
+package cn.axzo.workflow.common.model.request.es;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 搜索 Es 中任务纬度的数据
+ *
+ * @author wangli
+ * @since 2024-10-08 09:49
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("搜索 Es 中任务纬度的数据")
+@Data
+public class TaskSearchReqDTO extends BpmPageParam {
+ private static final long serialVersionUID = -1L;
+
+ @ApiModelProperty(value = "流程实例 ID")
+ private String processInstanceId;
+ /**
+ * 搜索含有指定该租户的任务
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String assigneeTenantId;
+
+ /**
+ * 搜索含有指定单位的任务
+ */
+ @ApiModelProperty(value = "单位 ID")
+ private String assigneeOuId;
+
+ /**
+ * 搜索含有指定自然人的任务
+ */
+ @ApiModelProperty(value = "自然人 ID")
+ private String assigneePersonId;
+
+ /**
+ * 搜索含有指定自然人名称的任务
+ */
+ @ApiModelProperty(value = "自然人姓名")
+ private String assigneeName;
+
+ /**
+ * 与上面三个属性互斥
+ *
+ * 成对是数据项
+ */
+ @ApiModelProperty(value = "审批人信息集合")
+ private List assigners;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormFieldPermissionConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormFieldPermissionConf.java
new file mode 100644
index 000000000..a9881048c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormFieldPermissionConf.java
@@ -0,0 +1,60 @@
+//package cn.axzo.workflow.common.model.request.form;
+//
+//import io.swagger.annotations.ApiModel;
+//import io.swagger.annotations.ApiModelProperty;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+//import lombok.experimental.Accessors;
+//
+//import java.io.Serializable;
+//import java.util.List;
+//
+///**
+// * 表单字段权限配置
+// *
+// * 发起人
+// * 只读 可编辑必填 可编辑非必填 隐藏
+// * 1 1 1 1 字段 1
+// * 1 0 0 1 字段 2
+// *
+// * @author wangli
+// * @since 2024-11-06 18:19
+// */
+//@ApiModel("JSON 版本的 BPMN 协议模型中的表单字段权限")
+//@Data
+//@NoArgsConstructor
+//@Accessors(chain = true)
+//public class FormFieldPermissionConf implements Serializable {
+// private static final long serialVersionUID = 1L;
+//
+// /**
+// * 发起人的表单字段权限
+// */
+// @ApiModelProperty(value = "发起人的表单字段权限")
+// private List initiator;
+//
+// /**
+// * 审批人的表单字段权限
+// */
+// @ApiModelProperty(value = "审批人的表单字段权限")
+// private List current;
+//
+// /**
+// * 历史审批人的表单字段权限
+// */
+// @ApiModelProperty(value = "历史审批人的表单字段权限")
+// private List history;
+//
+// /**
+// * 抄送人的表单字段权限
+// */
+// @ApiModelProperty(value = "抄送人的表单字段权限")
+// private List carbonCopy;
+//
+// /**
+// * 管理员的字段权限
+// */
+// @ApiModelProperty(value = "管理员的字段权限")
+// private List admin;
+//
+//}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormJsonModel.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormJsonModel.java
new file mode 100644
index 000000000..39f13b88e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormJsonModel.java
@@ -0,0 +1,36 @@
+package cn.axzo.workflow.common.model.request.form;
+
+import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.Valid;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 新版本的表单定义模型 JSON 结构
+ *
+ * @author wangli
+ * @since 2024-11-06 17:24
+ */
+@ApiModel("新版本的表单定义模型 JSON 结构")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class FormJsonModel implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "表单名称")
+ private String name;
+
+ @ApiModelProperty(value = "表单模型")
+ @Valid
+ private List formFields;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java
new file mode 100644
index 000000000..0a8cd715e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java
@@ -0,0 +1,93 @@
+package cn.axzo.workflow.common.model.request.form;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 表单字段权限信息
+ *
+ * @author wangli
+ * @since 2024-11-07 11:09
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FormPermissionMetaInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 字段标识
+ */
+ private String fieldId;
+
+ /**
+ * 字段名称
+ */
+ private String fieldName;
+
+ /**
+ * 可编辑必填
+ */
+ @Builder.Default
+ private Boolean required = false;
+
+ /**
+ * 可编辑非必填
+ */
+ @Builder.Default
+ private Boolean editable = false;
+
+ /**
+ * 只读
+ */
+ @Builder.Default
+ private Boolean readonly = true;
+
+ /**
+ * 隐藏
+ */
+ @Builder.Default
+ private Boolean hidden = false;
+ /**
+ * 前端回显字段,后端不做任何消费逻辑
+ */
+ private String value;
+
+ // 将对象的属性转换为对应的整数表示
+ public int toBinary() {
+ int binaryValue = 0;
+ binaryValue |= (required ? 1 : 0) << 3;
+ binaryValue |= (editable ? 1 : 0) << 2;
+ binaryValue |= (readonly ? 1 : 0) << 1;
+ binaryValue |= (hidden ? 1 : 0);
+ return binaryValue;
+ }
+
+ // 从整数表示还原出对象
+ public static FormPermissionMetaInfo fromBinary(String fieldId, String fieldName, int binaryValue) {
+ boolean required = ((binaryValue >> 3) & 1) == 1;
+ boolean editable = ((binaryValue >> 2) & 1) == 1;
+ boolean readonly = ((binaryValue >> 1) & 1) == 1;
+ boolean hidden = (binaryValue & 1) == 1;
+ return new FormPermissionMetaInfo(fieldId, fieldName, required, editable, readonly, hidden, null);
+ }
+
+ public FormPermissionMetaInfo toReadonly() {
+ if (required || editable || readonly) {
+ setRequired(false);
+ setEditable(false);
+ setReadonly(true);
+ setHidden(false);
+ }
+ return this;
+ }
+
+ public String toBinaryString() {
+ return String.format("%04d", Integer.parseInt(Integer.toBinaryString(toBinary()), 10));
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormContentSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormContentSearchDTO.java
new file mode 100644
index 000000000..cac8b9336
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormContentSearchDTO.java
@@ -0,0 +1,50 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 表单定义内容的响应模型
+ *
+ * @author wangli
+ * @since 2024-11-11 14:23
+ */
+@ApiModel("表单定义于内容的响应模型")
+@Data
+public class FormContentSearchDTO {
+
+ /**
+ * 表单 KEY
+ */
+ @ApiModelProperty(value = "表单唯一标识")
+ private String key;
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID", example = "we", notes = "当 key 不知道时,可以用实例 ID 代替key")
+ private String processInstanceId;
+
+ /**
+ * 流程任务 ID
+ */
+ @ApiModelProperty(value = "流程任务 ID")
+ private String taskId;
+
+ /**
+ * 变量集合
+ */
+ @ApiModelProperty(value = "额外变量")
+ private Map variables;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionCreateDTO.java
new file mode 100644
index 000000000..1276892df
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionCreateDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import java.util.List;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 表单定义的更新入参模型
+ *
+ * @author wangli
+ * @since 2023/7/25 14:21
+ */
+@ApiModel("表单定义的更新入参模型")
+@Data
+public class FormDefinitionCreateDTO {
+
+ @ApiModelProperty(value = "表单名称")
+ @NotBlank(message = "表单名称不能为空")
+ public String name;
+
+ @ApiModelProperty(value = "版本号")
+ public Integer version;
+
+ @ApiModelProperty(value = "表单标识")
+ @NotBlank(message = "表单标识不能为空")
+ private String key;
+
+ @ApiModelProperty(value = "表单分类")
+ private String category;
+
+ private FormDefinitionDTO formDefinition;
+
+ @ApiModelProperty(value = "描述")
+ private String description;
+
+ private String tenantId = NO_TENANT_ID;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionDTO.java
index 35f18c66e..2ec301d7f 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionDTO.java
@@ -3,6 +3,8 @@ package cn.axzo.workflow.common.model.request.form.definition;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
import java.util.List;
/**
@@ -13,16 +15,26 @@ import java.util.List;
*/
@Data
public class FormDefinitionDTO {
- @ApiModelProperty(value = "表单定义的key", hidden = true)
- private String key;
- @ApiModelProperty(value = "表单定义的名称", hidden = true)
+ /**
+ * 表单名称
+ */
+ @ApiModelProperty(value = "表单定义的名称")
+ @NotBlank(message = "表单定义名称不能为空")
private String name;
- @ApiModelProperty(value = "表单定义的版本", hidden = true)
- private Integer version;
+ @ApiModelProperty(value = "表单定义的标识")
+ @NotBlank(message = "表单定义标识不能为空")
+ private String key;
+
+ @ApiModelProperty(value = "表单的版本")
+ private int version;
@ApiModelProperty(value = "表单定义的具体字段项", example = "[{'': '''}]")
- private List fields;
+ @Valid
+ private List fields;
+
+ @ApiModelProperty(value = "描述")
+ private String description;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionSearchDTO.java
new file mode 100644
index 000000000..282e83c12
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionSearchDTO.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 查询表单定义入参模型
+ *
+ * @author wangli
+ * @since 2024-11-07 18:29
+ */
+@ApiModel("表单定义的搜索入参模型")
+@Data
+public class FormDefinitionSearchDTO {
+
+ @ApiModelProperty(value = "表单部署 ID")
+ private String deploymentId;
+
+ @ApiModelProperty(value = "表单定义 KEY")
+ private String key;
+
+ @ApiModelProperty(value = "表单定义版本")
+ private Integer version;
+
+ @ApiModelProperty(value = "表单归属租户")
+ private String tenantId = NO_TENANT_ID;
+
+ @ApiModelProperty(value = "表单关联的流程定义部署 ID")
+ private String parentDeploymentId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionUpdateDTO.java
index c632a8b3f..1f067cc4c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionUpdateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormDefinitionUpdateDTO.java
@@ -3,27 +3,24 @@ package cn.axzo.workflow.common.model.request.form.definition;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
/**
* 表单定义的更新入参模型
*
* @author wangli
* @since 2023/7/25 14:21
*/
+@EqualsAndHashCode(callSuper = true)
@ApiModel("表单定义的更新入参模型")
@Data
-public class FormDefinitionUpdateDTO {
+public class FormDefinitionUpdateDTO extends FormDefinitionCreateDTO{
- @ApiModelProperty("表单模型ID")
- @NotBlank(message = "表单模型 ID 不能为空")
- public String formModelId;
-
- @ApiModelProperty(value = "表单定义内容")
- private FormDefinitionDTO formDefinition;
-
- @NotBlank(message = "租户不能为空")
- private String tenantId;
+ @ApiModelProperty(value = "表单定义 ID")
+ private String formModelId;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java
new file mode 100644
index 000000000..4a07d8a8c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java
@@ -0,0 +1,86 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 表单定义中的字段相关属性入参模型
+ *
+ * 本模型不支持变更增加属性,只能放入 params 中
+ *
+ * @author wangli
+ * @since 2023/7/20 10:39
+ */
+@ApiModel("表单定义中的字段相关属性入参模型")
+@Data
+public class FormFieldDTO {
+
+ /**
+ * 字段类型, 如果是分组:FormContainer,其他表单组件:FormField
+ */
+ @ApiModelProperty(value = "表单字段类型")
+ @NotBlank(message = "字段类型不能为空")
+ private String fieldType = "FormField";
+
+ /**
+ * 前端组件类型
+ *
+ * { label: "文本", value: "input" },
+ * { label: "多行文本", value: "textarea" },
+ * { label: "附件", value: "upload" },
+ * { label: "图片", value: "image" },
+ * { label: "自定义组件", value: "customComponent" },
+ * { label: "任务单", value: "taskOrder" },
+ * { label: "整改单", value: "rectifyOrder" },
+ * { label: "变洽签单", value: "changeSignatureOrder" },
+ * { label: "通讯录", value: "contacts" },
+ * { label: "金额", value: "amount" },
+ */
+ @ApiModelProperty(value = "前端的组件类型")
+ private String type;
+
+ /**
+ * 表单字段组件 ID
+ */
+ @ApiModelProperty(value = "表单字段组件ID", example = "account")
+ @NotBlank(message = "表单字段组件 ID 不能为空")
+ private String id;
+
+ /**
+ * 表单字段名称
+ */
+ @ApiModelProperty(value = "表单字段名称", example = "账号")
+ private String name;
+
+ /**
+ * 部分组件是多值,比如日期区间,多选, 多附件
+ */
+ @ApiModelProperty(value = "表单字段默认值", example = "account")
+ private Object value;
+
+ /**
+ * 表单占位提示
+ */
+ @ApiModelProperty(value = "表单字段占位提示")
+ private String placeholder;
+
+ /**
+ * 表单的扩展属性,里面会包含required/editable/readonly/hidden/defaultValue 的 key
+ */
+ @ApiModelProperty(value = "该表单字段的其他扩展属性,期望 JSON 格式")
+ private Map params;
+
+ /**
+ * 当 fieldType=FormContainer 时,这里的代表内部的集合
+ */
+ @ApiModelProperty(value = "分组内的字段,配合 fieldType=FormContainer 使用")
+ private List> fields;
+}
+
+
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldExtDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldExtDTO.java
new file mode 100644
index 000000000..4fe96e93c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldExtDTO.java
@@ -0,0 +1,47 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 表单字段扩展对象
+ *
+ * 注意: FormField 类型中其实包含了一部分本类型的字段,但为了保持统一,将弃用外面的属性,仅以这里为准
+ *
+ * @author wangli
+ * @since 2024-11-12 18:33
+ */
+@Data
+@ApiModel("表单字段扩展对象")
+public class FormFieldExtDTO {
+ /**
+ * 字段可编辑
+ */
+ @ApiModelProperty(value = "可编辑")
+ private Boolean editable;
+
+ /**
+ * 字段必填
+ */
+ @ApiModelProperty(value = "必填")
+ private Boolean required;
+
+ /**
+ * 字段只读
+ */
+ @ApiModelProperty(value = "只读")
+ private Boolean readonly;
+
+ /**
+ * 字段隐藏
+ */
+ @ApiModelProperty(value = "隐藏")
+ private Boolean hidden;
+
+ /**
+ * 字段默认值
+ */
+ @ApiModelProperty(value = "默认值")
+ private String defaultValue;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldsDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldsDTO.java
deleted file mode 100644
index b59efd052..000000000
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldsDTO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package cn.axzo.workflow.common.model.request.form.definition;
-
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-import java.util.Map;
-
-/**
- * 表单定义中的字段相关属性入参模型
- *
- * @author wangli
- * @since 2023/7/20 10:39
- */
-@ApiModel("表单定义中的字段相关属性入参模型")
-@Data
-public class FormFieldsDTO {
-
- @ApiModelProperty(value = "表单字段类型", hidden = true)
- @NotBlank(message = "字段类型不能为空")
- private transient String fieldType = "FormField";
-
- @ApiModelProperty(value = "前端的组件类型")
- private String type;
-
- @ApiModelProperty(value = "表单字段组件ID", example = "account")
- @NotBlank(message = "表单字段组件 ID 不能为空")
- private String id;
-
- @ApiModelProperty(value = "表单字段名称", example = "账号")
- private String name;
-
- @ApiModelProperty(value = "表单字段默认值", example = "account")
- private String value;
-
- @ApiModelProperty(value = "表单字段是否必填,默认 false", example = "true or false")
- private Boolean required = false;
-
- @ApiModelProperty(value = "表单字段是否只读,默认 false", example = "true or false")
- private Boolean readOnly = false;
-
- @ApiModelProperty(value = "表单字段占位提示")
- private String placeholder;
-
- @ApiModelProperty(value = "该表单字段的其他扩展属性,期望 JSON 格式")
- private Map params;
-}
-
-
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java
new file mode 100644
index 000000000..6ec0231d1
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.form.definition;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 获取开始表单的模型入参
+ *
+ * @author wangli
+ * @since 2024-11-14 16:27
+ */
+@Data
+@ApiModel("获取开始表单的模型入参")
+public class StartFormSearchDTO {
+ /**
+ * 业务标识
+ */
+ @ApiModelProperty(value = "业务标识", notes = "也等于表单唯一标识,目前新建一个审批模型,表单和审批的标识都是一样的")
+ @NotBlank(message = "业务标识不能为空")
+ private String key;
+
+ /**
+ * 租户 ID
+ *
+ * 对应安心筑的工作台 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ @NotBlank(message = "租户 ID (工作台)不能为空")
+ private String tenantId = NO_TENANT_ID;
+
+ /**
+ * 显示原始默认值的变量
+ */
+ @ApiModelProperty(value = "是否显示原始的默认值", hidden = true, notes = "如果为 true 则将默认值中的 ${} 变量不进行替换")
+ private Boolean showOriginDefaultValue = false;
+
+ @ApiModelProperty(value = "是否抛出内部异常")
+ private Boolean throwException = true;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormDetailDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormDetailDTO.java
new file mode 100644
index 000000000..985b5906e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormDetailDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.request.form.instance;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 表单详情响应模型
+ *
+ * @author wangli
+ * @since 2024-11-14 14:22
+ */
+@ApiModel("表单详情响应模型")
+@Data
+public class FormDetailDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 任务 ID
+ */
+ @ApiModelProperty(value = "任务 ID")
+ private String taskId;
+
+ /**
+ * 访问表单的人,该属性内部主要用于计算表单字段权限
+ * 支持为 null,则表单所有字段默认全部隐藏
+ */
+ @ApiModelProperty(value = "访问表单的人")
+ private BpmnTaskDelegateAssigner assigner;
+
+ /**
+ * 显示原始默认值的变量
+ */
+ @ApiModelProperty(value = "是否显示原始的默认值", notes = "如果为 true 则将默认值中的 ${} 变量不进行替换")
+ private Boolean showOriginDefaultValue = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormInstanceSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormInstanceSearchDTO.java
new file mode 100644
index 000000000..0fb0f66fb
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormInstanceSearchDTO.java
@@ -0,0 +1,53 @@
+package cn.axzo.workflow.common.model.request.form.instance;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.Map;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 表单实例数据响应模型
+ *
+ * @author wangli
+ * @since 2024-11-11 15:26
+ */
+@ApiModel("表单实例数据响应模型")
+@Data
+public class FormInstanceSearchDTO implements Serializable {
+
+ /**
+ * 表单标识=业务标识
+ */
+ @ApiModelProperty(value = "表单定义 ID", hidden = true)
+ private transient String formDefinitionId;
+
+ /**
+ * 实例 ID
+ */
+ @ApiModelProperty(value = "实例 ID")
+ @NotBlank(message = "流程实例不能为空")
+ private String processInstanceId;
+
+ /**
+ * 任务 ID
+ */
+ @ApiModelProperty(value = "任务 ID")
+ private String taskId;
+
+ /**
+ * 用于临时变更表单内容的变量,不对数据库生效,一些特殊场景可使用
+ */
+ @ApiModelProperty(value = "临时变更表单内容的变量", hidden = true)
+ private Map variables;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID", hidden = true)
+ private transient String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormSearchDTO.java
new file mode 100644
index 000000000..5341465ab
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormSearchDTO.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.request.form.instance;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 表单搜索入参模型
+ *
+ * @author wangli
+ * @since 2024-11-11 19:55
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("表单搜索入参模型")
+@Data
+public class FormSearchDTO extends BpmPageParam {
+
+ /**
+ * 业务标识
+ */
+ @ApiModelProperty("业务标识")
+ private String key;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java
new file mode 100644
index 000000000..b35a1674b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.form.instance;
+
+import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 更新指定流程表单最后一次操作的表单内容的入参模型
+ *
+ * @author wangli
+ * @since 2025-02-08 10:04
+ */
+@ApiModel("更新指定流程表单最后一次操作的表单内容")
+@Data
+public class FormVariablesUpdateDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ *
+ * 图片类型和附件类型组件:请用 @see {@link UploadFieldDTO} 对象集合传入
+ *
+ * // form_image 为表单项的 key, value 为 UploadFileDTO 对象集合,如果前端使用了组件,一般建议回传所有属性;特殊情况下可以只传 fileUrl
+ * "form_image": [{
+ * "fileName": "",
+ * "fileUrl": "http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960",
+ * "fileKey": 123
+ * }]
+ *
+ */
+ @ApiModelProperty(value = "通过表单创建流程时传入的初始表单数据")
+ private Map formVariables;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/model/FormModelCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/model/FormModelCreateDTO.java
index ecd0fadf2..06dc847b6 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/model/FormModelCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/model/FormModelCreateDTO.java
@@ -1,11 +1,16 @@
package cn.axzo.workflow.common.model.request.form.model;
+import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
+import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
/**
* 表单模型创建入参模型
@@ -17,7 +22,7 @@ import javax.validation.constraints.NotBlank;
@Data
public class FormModelCreateDTO {
- @ApiModelProperty(value = "表单标识", example = "form_key", hidden = true)
+ @ApiModelProperty(value = "表单标识", example = "form_key")
@Length(max = 255, message = "表单标识最长只支持255个字符")
@NotBlank(message = "流程表单 key 不能为空")
private String key;
@@ -27,11 +32,14 @@ public class FormModelCreateDTO {
@Length(max = 255, message = "表单名称最长只支持255个字符")
private String name;
- @ApiModelProperty(value = "表单分类", example = "business_form_key")
- private String category;
+// @ApiModelProperty(value = "表单分类", example = "business_form_key")
+// private String category;
+
+ @ApiModelProperty(value = "表单模型的 Json 结构")
+ @Valid
+ private List formFields;
@ApiModelProperty(value = "租户 ID", example = "1")
- @NotBlank(message = "租户 ID 不能为空")
- private String tenantId;
+ private String tenantId = NO_TENANT_ID;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/admin/ProcessAdminVo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/admin/ProcessAdminVo.java
new file mode 100644
index 000000000..65ac53e18
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/admin/ProcessAdminVo.java
@@ -0,0 +1,85 @@
+package cn.axzo.workflow.common.model.response.admin;
+
+import cn.axzo.workflow.common.enums.AdminDataSource;
+import cn.axzo.workflow.common.enums.AdminRoleType;
+import cn.axzo.workflow.common.enums.AdminTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ProcessAdminVo {
+
+ /**
+ * 管理员配置id
+ */
+ @ApiModelProperty("管理员配置id")
+ private Long processAdminId;
+
+ /**
+ * 自然人id
+ */
+ @ApiModelProperty("自然人id")
+ private Long personId;
+
+ /**
+ * 单位id
+ */
+ @ApiModelProperty("单位id")
+ private Long organizationalUnitId;
+
+ /**
+ * 工作台ID
+ */
+ @ApiModelProperty("工作台ID")
+ private Long workspaceId;
+
+ /**
+ * 工作台类型,1-企业, 2-项目, 3-政务监管平台, 6-oms工作台,参考 WorkspaceType枚举
+ */
+ @ApiModelProperty("工作台ID")
+ private Integer workspaceType;
+
+ /**
+ * 管理员类型, super_admin-超级管理员, common_admin-普通管理员
+ */
+ @ApiModelProperty("管理员类型")
+ private AdminTypeEnum adminType;
+
+ /**
+ * 角色类型, organization_admin-单位超管, organization_worksapce_admin-项目内单位负责人, workspace_admin-项目超管,other-其他用户
+ */
+ @ApiModelProperty("角色类型")
+ private AdminRoleType roleType;
+
+ /**
+ * 数据来源, system-系统录入, user-用户手动录入
+ */
+ @ApiModelProperty("数据来源")
+ private AdminDataSource dataSource;
+
+ /**
+ * 创建者
+ */
+ @ApiModelProperty("创建者")
+ private Long createBy;
+
+ /**
+ * 创建时间
+ */
+ @ApiModelProperty("创建时间")
+ private Date createAt;
+
+ /**
+ * 更新者
+ */
+ @ApiModelProperty("更新者")
+ private Long updateBy;
+
+ /**
+ * 更新时间
+ */
+ @ApiModelProperty("更新时间")
+ private Date updateAt;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationItemResultVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationItemResultVO.java
new file mode 100644
index 000000000..9385548c7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationItemResultVO.java
@@ -0,0 +1,43 @@
+package cn.axzo.workflow.common.model.response.bpmn;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 批量处理每一项明细的响应模型
+ *
+ * @author wangli
+ * @since 2024/5/13 11:28
+ */
+@Data
+@ApiModel("批量处理每一项明细的响应模型")
+public class BatchOperationItemResultVO {
+
+ /**
+ * 被处理数据的 ID
+ * 可以是实例 ID,也可以是任务 ID,根据调用的 API 不同而不同
+ */
+ @ApiModelProperty("被处理数据的 ID")
+ private String id;
+
+ /**
+ * 处理的数据类型: 业务审批, 流程审批
+ */
+ @ApiModelProperty("处理的数据类型: 业务审批, 流程审批")
+ private String type;
+
+ /**
+ * 该流程实例处理过程中是否发生错误
+ */
+ @ApiModelProperty("该流程实例处理过程中是否发生错误")
+ private Boolean hasError = false;
+
+ /**
+ * 具体的错误信息
+ */
+ @ApiModelProperty("具体的错误信息")
+ private String errorMessage;
+
+}
+
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationResultVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationResultVO.java
new file mode 100644
index 000000000..c931fb089
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/BatchOperationResultVO.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.common.model.response.bpmn;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 批量处理结果响应模型
+ *
+ * @author wangli
+ * @since 2024/5/13 11:28
+ */
+@Data
+@ApiModel("批量处理结果响应模型")
+public class BatchOperationResultVO {
+
+ /**
+ * 请求数量
+ */
+ @ApiModelProperty(value = "请求数量")
+ private Integer requestCount = 0;
+
+ /**
+ * 失败数量
+ */
+ @ApiModelProperty(value = "失败数量")
+ private Integer failCount = 0;
+
+ /**
+ * 批量操作处理详情
+ */
+ @ApiModelProperty(value = "批量操作处理详情")
+ private List details;
+}
+
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
index ce2a09c4e..2d6df8e43 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
@@ -1,6 +1,7 @@
package cn.axzo.workflow.common.model.response.bpmn.model;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
+import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -28,6 +29,30 @@ public class BpmnModelDetailVO extends BpmnModelBaseVO {
@ApiModelProperty(value = "启用状态")
private Integer status;
+ /**
+ * 打印开关
+ */
+ @ApiModelProperty(value = "打印状态")
+ private Integer printStatus;
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板配置内容
+ */
+ @ApiModelProperty(value = "打印模板配置内容")
+ private String printTemplateConfig;
+
/**
* 描述
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java
new file mode 100644
index 000000000..7fc298914
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java
@@ -0,0 +1,97 @@
+package cn.axzo.workflow.common.model.response.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 基础的流程关联文档的响应模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:49
+ */
+@ApiModel("基础的流程关联文档的响应模型")
+@Data
+@NoArgsConstructor
+public class DocBaseVO {
+
+ private Long id;
+
+ /**
+ * 模型 ID
+ */
+ @ApiModelProperty(value = "模型 ID")
+ private String modelId;
+
+ /**
+ * 模型 KEY
+ */
+ @ApiModelProperty(value = "模型 KEY")
+ private String modelKey;
+
+ /**
+ * 文档对应文件的检索信息
+ * word/excel 对应 wps 的 Id,
+ * hp 对应是
+ * pdf 对应 oss 中的 fileKey
+ */
+ @ApiModelProperty(value = "文档对应文件检索信息")
+ private String fileRelationId;
+
+ /**
+ * 文档名称(用于归档)
+ */
+ @ApiModelProperty(value = "文档名称")
+ private String fileName;
+
+ /**
+ * 文档模板名称
+ */
+ @ApiModelProperty(value = "模板名称")
+ private String templateName;
+
+ /**
+ * 归档位置
+ */
+ private String location;
+
+ /**
+ * 文档类型
+ */
+ @ApiModelProperty(value = "文档类型")
+ private FileTypeEnum fileType;
+
+ /**
+ * 文档业务类型
+ */
+ @ApiModelProperty(value = "业务类型")
+ private String tag;
+
+ /**
+ * 文档状态
+ */
+ @ApiModelProperty(value = "文档状态")
+ private Boolean status;
+
+ @ApiModelProperty(value = "是否是临时文档")
+ private Boolean tempFile;
+ /**
+ * 文档是否必选
+ */
+ @ApiModelProperty(value = "是否必选")
+ private Boolean require;
+
+ /**
+ * 排序号
+ */
+ @ApiModelProperty(value = "排序号")
+ private Integer order;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java
new file mode 100644
index 000000000..e329c2c14
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java
@@ -0,0 +1,88 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
+import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
+import cn.axzo.workflow.common.enums.ApproverScopeEnum;
+import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 发起流程前的节点列表中每个节点的模型配置信息
+ *
+ * @author wangli
+ * @since 2025-03-26 09:40
+ */
+@ApiModel("发起流程前的节点列表中每个节点的模型配置信息")
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class BpmnNodeConfigVO {
+ /**
+ * 审批方式, 审批节点与业务节点会有不同
+ *
+ * human("human", "人工审批", ""),
+ * autoPassed("autoPassed", "自动通过", "[仅审批节点可能选该值]"),
+ * autoRejection("autoRejection", "自动驳回", "[仅审批节点可能选该值]"),
+ * nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"),
+ * bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"),
+ */
+ @ApiModelProperty(value = "审批方式")
+ private ApprovalMethodEnum approvalMethodEnum;
+
+ /**
+ * 审批人所在范围
+ *
+ * entWorkspace("entWorkspace", "企业工作台", "entWorkspaceProcessor"),
+ * govWorkspace("govWorkspace", "政务工作台", "govWorkspaceProcessor"),
+ * projectWorkspace("projectWorkspace", "项目工作台","projectWorkspaceProcessor"),
+ * preTaskUser("preTaskUser", "上节点审批人所在单位","preTaskUserProcessor"),
+ * preTaskSpecified("preTaskSpecified", "上节点审批人指定","preTaskUserProcessor"),
+ */
+ @ApiModelProperty(value = "审批人所在范围")
+ private ApproverScopeEnum approverScopeEnum;
+
+ /**
+ * 审批人指定
+ *
+ * position("position", "指定岗位"),
+ * role("role", "指定角色"),
+ * identity("identity", "指定身份"),
+ * fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型,则该节点下的人,会默认回显至该上级模型属性中
+ * initiatorLeader("initiatorLeader", "发起人主管"),
+ * initiatorSpecified("initiatorSpecified", "发起人自选"),
+ */
+ @ApiModelProperty(value = "审批人指定")
+ private ApproverSpecifyEnum approverSpecifyEnum;
+
+ /**
+ * 审批人为空时的处理方式
+ *
+ * autoPassed("autoPassed", "自动通过"),
+ * autoRejection("autoRejection", "自动驳回"),
+ * autoSkipped("autoSkipped", "自动跳过"),
+ * transferToAdmin("transferToAdmin", "转交给管理员"),
+ * specifyAssignee("specifyAssignee", "指定审批人"),
+ */
+ @ApiModelProperty(value = "审批人为空时的处理方式")
+ private ApproverEmptyHandleTypeEnum approverEmptyHandleTypeEnum;
+
+ /**
+ * 是否开启电子签名
+ */
+ @ApiModelProperty(value = "是否开启电子签名")
+ private Boolean signature;
+
+ /**
+ * 签署确认节点审批人限制规则
+ */
+ @ApiModelProperty(value = "签署确认节点审批人限制规则")
+ private BpmnSignApproverLimit signApproverLimit;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessDefinitionVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessDefinitionVO.java
index ac36be4f8..33ef85472 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessDefinitionVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessDefinitionVO.java
@@ -2,12 +2,14 @@ package cn.axzo.workflow.common.model.response.bpmn.process;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
+import java.util.List;
@ApiModel("流程定义响应模型")
@Data
@@ -57,6 +59,11 @@ public class BpmnProcessDefinitionVO {
@ApiModelProperty(value = "状态 1:生效中(激活) 2:历史(挂起)", required = true, example = "1", notes = "参见 SuspensionState 枚举")
private Integer suspensionState;
+ /**
+ * 表单字段集合
+ */
+ @ApiModelProperty(value = "表单字段集合")
+ private List formFields;
/**
* 流程模型 JSON 数据
*/
@@ -81,4 +88,10 @@ public class BpmnProcessDefinitionVO {
@ApiModelProperty(value = "操作人信息")
private BpmnTaskDelegateAssigner operator;
+ /**
+ * 部署 ID
+ */
+ @ApiModelProperty(value = "部署 ID")
+ private String deploymentId;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java
new file mode 100644
index 000000000..8c9689523
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java
@@ -0,0 +1,165 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.enums.WorkspaceType;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 流程实例日志模型
+ *
+ * @author wangli
+ * @since 2024-09-07 17:07
+ */
+@ApiModel("流程实例日志模型")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnProcessInstanceLogVO {
+ /**
+ * 流程实例的编号
+ */
+ @ApiModelProperty(value = "流程实例的编号", example = "1024")
+ private String id;
+
+ /**
+ * 流程名称
+ */
+ @ApiModelProperty(value = "流程名称", example = "权限点申请")
+ private String name;
+
+ /**
+ * 流程分类
+ */
+ @ApiModelProperty(value = "流程分类", notes = "关联的业务分类", example = "1")
+ private String category;
+
+ /**
+ * 审核状态
+ */
+ @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED")
+ private BpmnProcessInstanceResultEnum result;
+
+ /**
+ * 发起时间
+ */
+ @ApiModelProperty("发起时间")
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ @ApiModelProperty("结束时间")
+ private Date endTime;
+
+ /**
+ * 流程定义 KEY
+ */
+ @ApiModelProperty("流程定义 KEY")
+ private String processDefinitionKey;
+
+ /**
+ * 流程定义 ID
+ */
+ @ApiModelProperty("流程定义 ID")
+ private String processDefinitionId;
+
+ /**
+ * 业务的唯一标识
+ */
+ @ApiModelProperty(value = "业务的唯一标识", example = "1", notes = "例如说,请假申请的编号")
+ private String businessKey;
+
+ /**
+ * 流程最终状态
+ */
+ @ApiModelProperty("流程最终状态")
+ private String businessStatus;
+
+ /**
+ * 发起人
+ */
+ @ApiModelProperty("发起人")
+ private BpmnTaskDelegateAssigner initiator;
+
+ /**
+ * 当前流程发起租户
+ */
+ @ApiModelProperty("当前流程发起租户")
+ private String tenantId;
+
+ /**
+ * 是代运营的流程
+ */
+ @ApiModelProperty("是代运营的流程")
+ private Boolean agented;
+
+ /**
+ * 任务信息集合
+ */
+ @ApiModelProperty("任务信息集合")
+ private List taskDetails;
+
+ /**
+ * 当前实例对应模型的全局兜底按钮配置
+ */
+ @ApiModelProperty(value = "当前实例对应模型的全局兜底按钮配置")
+ private BpmnButtonConf defaultButtonConf;
+
+ /**
+ * 指定人访问实例日志时,计算其流程应该有权限操作的按钮
+ */
+ @ApiModelProperty(value = "指定人访问实例日志时,计算其流程应该有权限操作的按钮", notes = "流程有权限,不代表待办消息中一定能看到按钮")
+ private List currentUserButtons;
+
+ /**
+ * 需要隐藏的自定义按钮集合
+ */
+ @ApiModelProperty(value = "需要隐藏的自定义按钮集合")
+ private List customHiddenButtons;
+
+ /**
+ * 是否支持批量审批
+ */
+ @ApiModelProperty(value = "是否支持批量审批")
+ private Boolean supportBatchOperation;
+
+ /**
+ * 审批同意录入手写签名
+ */
+ @ApiModelProperty(value = "审批同意录入手写签名")
+ private Boolean userAgreeSignature;
+
+ /**
+ * 数据产生版本
+ */
+ @ApiModelProperty(value = "数据产生版本")
+ private String workflowEngineVersion;
+
+ /**
+ * 当前流程对应工作台类型
+ */
+ @ApiModelProperty(value = "工作台类型")
+ private WorkspaceType workspaceType;
+
+ /**
+ * 当前审批能否打印
+ */
+ @ApiModelProperty(value = "能否打印")
+ private Boolean catPrint;
+
+ @ApiModelProperty(value = "程序计算按钮使用,非对外使用", hidden = true)
+ private transient BpmnButtonConf calculatingButtonConf;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java
index 6612b6160..80c4fb378 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java
@@ -3,6 +3,7 @@ package cn.axzo.workflow.common.model.response.bpmn.process;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.enums.WorkspaceType;
+import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
@@ -34,9 +35,15 @@ public class BpmnProcessInstanceVO {
/**
* 流程分类
*/
- @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
+ @ApiModelProperty(value = "流程分类", notes = "是审批业务的 value", example = "1")
private String category;
+ /**
+ * 流程分类名称
+ */
+ @ApiModelProperty(value = "流程分类名称", notes = "是审批业务的 label", example = "在场管理")
+ private String categoryDesc;
+
/**
* 审核状态
*/
@@ -97,6 +104,12 @@ public class BpmnProcessInstanceVO {
@ApiModelProperty(value = "流程模型全局兜底的按钮配置信息")
private BpmnButtonConf defaultButtonConf;
+ /**
+ * 流程模型审批相关配置
+ */
+ @ApiModelProperty(value = "流程模型审批相关配置")
+ private BpmnApproveConf processApproveConf;
+
/**
* 发起人信息
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ExtProcessLogVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ExtProcessLogVO.java
new file mode 100644
index 000000000..ccb8bb63e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ExtProcessLogVO.java
@@ -0,0 +1,53 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.model.dto.OrgStructureSnapshotInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 审批扩展日志表的响应模型
+ *
+ * @author wangli
+ * @since 2025-07-08 10:09
+ */
+@ApiModel("流程实例日志表响应模型")
+@Data
+public class ExtProcessLogVO {
+ @ApiModelProperty("日志表主键 ID")
+ private Long id;
+
+ @ApiModelProperty("流程实例 ID")
+ private String processInstanceId;
+
+ @ApiModelProperty("流程归属的租户 ID(工作台 ID)")
+ private String processTenantId;
+
+ @ApiModelProperty("审批节点 ID")
+ private String activityId;
+
+ @ApiModelProperty("审批节点名称")
+ private String activityName;
+
+ @ApiModelProperty("审批任务 ID")
+ private String taskId;
+
+ @ApiModelProperty("审批人自然人 ID")
+ private String assigneePersonId;
+
+ @ApiModelProperty("审批人租户 ID(工作台 ID)")
+ private String assigneeTenantId;
+
+ @ApiModelProperty("审批人姓名")
+ private String assigneeName;
+
+ @ApiModelProperty("审批人单位 ID")
+ private String assigneeOuId;
+
+ @ApiModelProperty("日志的处理状态")
+ private BpmnProcessInstanceResultEnum status;
+
+ @ApiModelProperty("审批人在接受到审批任务时的组织快照信息")
+ private OrgStructureSnapshotInfo orgStructureSnapshotInfo;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java
new file mode 100644
index 000000000..7e9cdde46
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java
@@ -0,0 +1,69 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 模型节点集合响应模型
+ *
+ * @author wangli
+ * @since 2025-01-15 10:40
+ */
+@ApiModel("模型节点集合响应模型")
+@Data
+@Accessors(chain = true)
+public class NodesByModelVO {
+
+ /**
+ * 节点 ID
+ */
+ @ApiModelProperty(value = "节点 ID")
+ private String activityId;
+
+ /**
+ * 节点名称
+ */
+ @ApiModelProperty(value = "节点名称")
+ private String activityName;
+
+ /**
+ * 是否支持发起人自选人
+ */
+ @ApiModelProperty(value = "是否支持发起自选人")
+ private Boolean supportSpecify;
+
+ /**
+ * 节点的人
+ */
+ private List assigners;
+ /**
+ * 节点模式(会、或签,普通节点)
+ */
+ @ApiModelProperty(value = "节点模式(会、或签,普通节点)")
+ private BpmnFlowNodeMode nodeModel;
+
+ /**
+ * 节点类型, 只要是以下类型
+ *
+ * NODE_STARTER("NODE_STARTER", "发起人节点"),
+ * NODE_TASK("NODE_TASK", "审核节点"),
+ * NODE_BUSINESS("NODE_BUSINESS", "业务节点"),
+ * NODE_SIGN("NODE_SIGN", "签署确认节点"),
+ * NODE_CARBON_COPY("NODE_CARBON_COPY", "抄送节点"),
+ */
+ @ApiModelProperty(value = "节点类型")
+ private BpmnFlowNodeType nodeType;
+
+ /**
+ * 节点原始配置信息
+ */
+ @ApiModelProperty(value = "节点原始配置")
+ private BpmnNodeConfigVO nodeConfig;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java
index 0080dabd2..145e113eb 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java
@@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -56,4 +57,13 @@ public class ProcessNodeDetailVO {
*/
private List forecastAssigners;
+ /**
+ * 提级审批配置
+ */
+ private BpmnUpgradeApprovalConf upgradeApprovalConf;
+
+ /**
+ * 是未来节点
+ */
+ private Boolean futureNode;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java
new file mode 100644
index 000000000..78d5ac6bf
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java
@@ -0,0 +1,47 @@
+package cn.axzo.workflow.common.model.response.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 基础的流程关联文档待办中的响应模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:49
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("基础的流程关联文档待办中的响应模型")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocPendingVO extends DocBaseVO {
+
+ /**
+ * oss 的 fileKey
+ */
+ @ApiModelProperty(value = "oss 的 fileKey")
+ private String fileKey;
+
+ /**
+ * 文件 OBS 地址
+ */
+ @ApiModelProperty(value = "文件 OBS 地址")
+ private String ossUrl;
+
+ /**
+ * 文件大小,单位 Byte
+ */
+ @ApiModelProperty(value = "文件大小,单位 byte")
+ private Long storageSize;
+
+ /**
+ * 文档已读状态,true:已读
+ */
+ @ApiModelProperty(value = "文档已读状态,true:已读")
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java
new file mode 100644
index 000000000..42d2f722d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java
@@ -0,0 +1,60 @@
+package cn.axzo.workflow.common.model.response.bpmn.task;
+
+import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum;
+import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnTaskButtonVo implements Serializable {
+
+ private static final long serialVersionUID = -2701890396246979758L;
+
+ /**
+ * 执行人任务状态
+ */
+ @ApiModelProperty(value = "执行人任务执行状态")
+ private BpmnProcessTaskResultEnum executorTaskResult;
+
+ /**
+ * 发起人执行状态
+ */
+ @ApiModelProperty(value = "发起人任务执行状态")
+ private BpmnProcessTaskResultEnum initiatorTaskResult;
+
+ /**
+ * 当前任务执行人以及发起人全量按钮
+ */
+ @ApiModelProperty(value = "当前任务相关以及发起人的全量按钮")
+ private List buttons;
+
+ /**
+ * 需要隐藏的按钮
+ */
+ @ApiModelProperty(value = "需要隐藏的自定义按钮")
+ private List customHiddenButtons;
+
+ /**
+ * 全量的配置按钮
+ */
+ @ApiModelProperty(value = "全量的配置按钮")
+ private List allConfigButtons;
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static final class BpmnButtonMetaInfoWithVisibleScope extends BpmnButtonMetaInfo {
+
+ private static final long serialVersionUID = 5758633314769798044L;
+
+ private List visibleScopes;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java
new file mode 100644
index 000000000..d4322ce5f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java
@@ -0,0 +1,140 @@
+package cn.axzo.workflow.common.model.response.bpmn.task;
+
+import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
+import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 流程任务日志模型
+ *
+ * @author wangli
+ * @since 2024-09-07 17:08
+ */
+@ApiModel("流程任务日志模型")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnTaskInstanceLogVO {
+
+ /**
+ * 审批任务 ID
+ */
+ @ApiModelProperty(value = "审批任务 ID")
+ private String taskId;
+ /**
+ * 审批任务节点定义KEY
+ */
+ @ApiModelProperty(value = "审批任务节点定义KEY")
+ private String taskDefinitionKey;
+ /**
+ * 审批任务节点名称
+ */
+ @ApiModelProperty(value = "审批任务节点名称")
+ private String name;
+ /**
+ * 任务创建时间
+ */
+ @ApiModelProperty(value = "任务创建时间")
+ private Date createTime;
+ /**
+ * 任务结束时间
+ */
+ @ApiModelProperty(value = "任务结束时间")
+ private Date endTime;
+ /**
+ * 审批方式
+ */
+ @ApiModelProperty(value = "审批方式")
+ private ApprovalMethodEnum approvalMethod;
+ /**
+ * 节点类型
+ */
+ @ApiModelProperty(value = "节点类型")
+ private BpmnFlowNodeType nodeType;
+ /**
+ * 审批任务节点的类型
+ */
+ @ApiModelProperty(value = "审批任务节点的类型")
+ private BpmnFlowNodeMode nodeMode;
+ /**
+ * 任务状态
+ */
+ @ApiModelProperty(value = "任务状态")
+ private BpmnProcessInstanceResultEnum result;
+
+ /**
+ * 操作描述
+ */
+ @ApiModelProperty(value = "操作描述")
+ private String operationDesc;
+ /**
+ * 审批建议
+ */
+ @ApiModelProperty(value = "审批建议")
+ private String advice;
+ /**
+ * 一些扩展信息
+ */
+ @ApiModelProperty(value = "一些扩展信息")
+ private String commentExt;
+ /**
+ * 图片列表
+ */
+ @ApiModelProperty(value = "图片列表")
+ private List imageList;
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ private List fileList;
+ /**
+ * 手写签名地址
+ */
+ @ApiModelProperty(value = "手写签名地址")
+ private String signatureUrl;
+
+ /**
+ * 电子签名开关
+ */
+ @ApiModelProperty(value = "电子签名开关")
+ private Boolean signature;
+ /**
+ * 审批人快照信息
+ */
+ @ApiModelProperty(value = "审批人快照信息")
+ private BpmnTaskDelegateAssigner assigneeSnapshot;
+ /**
+ * 未完成节点多实例模式的审批人信息
+ */
+ @ApiModelProperty(value = "未完成节点多实例模式的审批人信息")
+ private List forecastAssignees;
+
+ /**
+ * 提级审批配置
+ */
+ @ApiModelProperty(value = "提级审批配置")
+ private BpmnUpgradeApprovalConf upgradeApprovalConf;
+
+ @ApiModelProperty(value = "程序计算按钮使用,非对外使用", hidden = true)
+ private transient BpmnButtonConf buttonConf;
+
+ public boolean isVirtual() {
+ return StringUtils.isBlank(this.taskId);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java
new file mode 100644
index 000000000..128c52c51
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java
@@ -0,0 +1,75 @@
+package cn.axzo.workflow.common.model.response.category;
+
+
+import cn.axzo.workflow.common.enums.VarTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarItemVo implements Serializable {
+
+ private static final long serialVersionUID = -3349551294678140220L;
+
+ /**
+ * 分组id
+ */
+ private Long id;
+
+ /**
+ * 上级分组id
+ */
+ private Long parentGroupId;
+
+ /**
+ * 分组名
+ */
+ private String groupName;
+
+ /**
+ * 当前分组对应的变量
+ */
+ private List vars;
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryVarItemVo implements Serializable {
+
+ private static final long serialVersionUID = -1918203166603971593L;
+
+ /**
+ * 变量id
+ */
+ private Long id;
+
+ /**
+ * 分组id
+ */
+ private Long groupId;
+
+ /**
+ * 变量类型,文本/图片
+ */
+ private VarTypeEnum type;
+
+ /**
+ * 变量code
+ */
+ private String code;
+
+ /**
+ * 变量名称
+ */
+ private String name;
+
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
index b106432aa..63c39692c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.response.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -34,6 +35,15 @@ public class CategoryItemVO {
@ApiModelProperty(value = "工作台类型值")
private String workspaceTypeCode;
+ @ApiModelProperty(value = "图标")
+ private String icon;
+
+ @ApiModelProperty(value = "业务类型")
+ private BusinessTypeEnum businessType;
+
+ @ApiModelProperty(value = "是否展示在发起工作台")
+ private Boolean displayInitiateMenu;
+
@ApiModelProperty(value = "更新时间")
private Date updateAt;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessInstanceDocumentVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessInstanceDocumentVO.java
new file mode 100644
index 000000000..fe059f4bc
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessInstanceDocumentVO.java
@@ -0,0 +1,97 @@
+package cn.axzo.workflow.common.model.response.es;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 搜索 ES 的流程实例相关数据模型
+ *
+ * @author wangli
+ * @since 2024-10-09 14:26
+ */
+@Data
+@ApiModel("搜索 ES 的流程实例相关数据模型")
+public class ProcessInstanceDocumentVO {
+
+ /**
+ * 流程实例 ID
+ */
+ private String instanceId;
+
+ /**
+ * 流程实例名称
+ */
+ private String processInstanceName;
+
+ /**
+ * 业务传入业务信息
+ */
+ private String businessKey;
+
+ /**
+ * 流程实例使用的定义 ID
+ */
+ private String processDefinitionId;
+
+ /**
+ * 流程对应业务分类的类型,项目/单位/监管/OMS
+ */
+ private String processCategoryType;
+
+ /**
+ * 流程实例的发起时间
+ */
+ private Date instanceStartTime;
+
+ /**
+ * 流程实例的结束时间
+ */
+ private Date instanceEndTime;
+
+ /**
+ * 流程实例的持续时间 ms
+ */
+ private Long durationInMillis;
+
+ /**
+ * 该流程中上次操作完成的时间, 如果是已完成的实例, 就清空该值
+ */
+ private Date lastOperationTime;
+
+ /**
+ * 租户 ID
+ */
+ private String instanceTenantId;
+
+ /**
+ * 流程实例业务状态
+ */
+ private String businessStatus;
+
+ /**
+ * 发起人姓名
+ */
+ private String initiatorName;
+
+ /**
+ * 实例对应的流程引擎服务端迭代版本
+ */
+ private String workflowEngineVersion;
+
+ /**
+ * 是否代运营
+ */
+ private Boolean agent;
+
+ /**
+ * 是否支持批量操作任务
+ */
+ private Boolean supportBatch;
+
+ /**
+ * 是否开启同意操作时的签名
+ */
+ private Boolean userAgreeSignature;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessTaskDocumentVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessTaskDocumentVO.java
new file mode 100644
index 000000000..ee6d28342
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/es/ProcessTaskDocumentVO.java
@@ -0,0 +1,107 @@
+package cn.axzo.workflow.common.model.response.es;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 搜索 ES 的流程任务相关数据模型
+ *
+ * @author wangli
+ * @since 2024-10-12 21:53
+ */
+@Data
+@ApiModel("搜索 ES 的流程任务相关数据模型")
+public class ProcessTaskDocumentVO {
+
+ /**
+ * 任务 ID
+ */
+ private String taskId;
+
+ /**
+ * 所属实例 ID
+ */
+ private String processInstanceId;
+
+ /**
+ * 任务定义 KEY,对应节点 ID
+ */
+ private String taskDefinitionKey;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+ /**
+ * 任务状态:审批中/通过/驳回/转交/加签...
+ */
+ private String taskStatus;
+
+ /**
+ * 操作建议
+ */
+ private String advice;
+
+ /**
+ * 操作描述
+ */
+ private String operationDesc;
+
+ /**
+ * 流程实例的发起时间
+ */
+ private Date taskStartTime;
+
+ /**
+ * 流程实例的结束时间
+ */
+ private Date taskEndTime;
+
+ /**
+ * 流程实例的持续时间 ms
+ */
+ private Long duration;
+
+ /**
+ * 归属租户,与 processInstance#tenantId 一致
+ */
+ private String taskTenantId;
+
+ /**
+ * 审批人姓名
+ */
+ private String assigneeName;
+
+ /**
+ * 审批人自然人 ID
+ */
+ private String assigneePersonId;
+
+ /**
+ * 审批人所属单位 ID
+ */
+ private String assigneeOuId;
+
+ /**
+ * 审批人所属租户 ID
+ */
+ private String assigneeTenantId;
+
+ /**
+ * 审批方式:配置审批人/业务指定/业务触发(不含人)
+ */
+ private String approvalMethod;
+
+ /**
+ * 节点类型:审批节点/业务节点/评论节点/抄送节点
+ */
+ private String nodeType;
+
+ /**
+ * 节点模式:会签/或签
+ */
+ private String nodeMode;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/FormVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/FormVO.java
new file mode 100644
index 000000000..025cb7ebe
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/FormVO.java
@@ -0,0 +1,41 @@
+package cn.axzo.workflow.common.model.response.form;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 表单相应模型
+ *
+ * @author wangli
+ * @since 2024-11-11 20:01
+ */
+@ApiModel("表单响应模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FormVO {
+
+ /**
+ * 业务标识
+ */
+ @ApiModelProperty(value = "业务标识")
+ private String key;
+
+ /**
+ * 业务名称
+ */
+ @ApiModelProperty(value = "业务名称")
+ private String name;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/definition/FormDefinitionVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/definition/FormDefinitionVO.java
index c20bbb6ef..75ac226a7 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/definition/FormDefinitionVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/definition/FormDefinitionVO.java
@@ -1,6 +1,6 @@
package cn.axzo.workflow.common.model.response.form.definition;
-import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
+import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -16,22 +16,40 @@ import java.util.List;
@ApiModel("表单定义的响应模型")
@Data
public class FormDefinitionVO {
+ /**
+ * 模型定义 ID
+ */
+ @ApiModelProperty(value = "模型定义 ID")
+ private String formDefinitionId;
+
+ /**
+ * 模型名称
+ */
@ApiModelProperty(value = "模型名称")
private String name;
+ /**
+ * 模型标识
+ */
@ApiModelProperty(value = "模型 KEY")
private String key;
- @ApiModelProperty(value = "自定义分类")
- private String category;
-
+ /**
+ * 版本
+ */
@ApiModelProperty(value = "版本")
private Integer version;
+ /**
+ * 租户 ID
+ */
@ApiModelProperty(value = "租户")
private String tenantId;
+ /**
+ * 表单模型字段
+ */
@ApiModelProperty(value = "表单模型字段")
- private List fields;
+ private List fields;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/instance/FormInstanceVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/instance/FormInstanceVO.java
new file mode 100644
index 000000000..fd356056c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/instance/FormInstanceVO.java
@@ -0,0 +1,78 @@
+package cn.axzo.workflow.common.model.response.form.instance;
+
+import cn.axzo.workflow.common.model.response.form.model.FormModelVO;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 表单实例的响应模型
+ *
+ * @author wangli
+ * @since 2024-11-14 10:05
+ */
+@ApiModel("表单实例的响应模型")
+@Data
+public class FormInstanceVO {
+ /**
+ * 表单定义 ID
+ */
+ private String id;
+
+ /**
+ * 表单定义名称
+ */
+ private String name;
+
+ /**
+ * 表单唯一标识
+ */
+ private String key;
+
+ /**
+ * 表单定义版本
+ */
+ private Integer version;
+
+ /**
+ * 表单模型数据
+ */
+ private FormModelVO formModel;
+
+ /**
+ * 表单实例 ID
+ */
+ private String formInstanceId;
+
+ /**
+ * 表单数据操作人,格式:"ouId|personId"
+ * 示例数据:"5144|43893"
+ */
+ private String submittedBy;
+
+ /**
+ * 表单提交时间
+ */
+ private Date submittedDate;
+
+ /**
+ * 这个表单数据关联的任务,如果是发起时提交的表单,则 taskId 为空
+ */
+ private String taskId;
+
+ /**
+ * 流程实例 ID
+ */
+ private String processInstanceId;
+
+ /**
+ * 流程定义 ID
+ */
+ private String processDefinitionId;
+
+ /**
+ * 租户 ID
+ */
+ private String tenantId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/model/FormModelVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/model/FormModelVO.java
new file mode 100644
index 000000000..e869c37ad
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/form/model/FormModelVO.java
@@ -0,0 +1,35 @@
+package cn.axzo.workflow.common.model.response.form.model;
+
+import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 表单模型响应模型
+ *
+ * @author wangli
+ * @since 2024-11-14 10:10
+ */
+@ApiModel("表单模型响应模型")
+@Data
+public class FormModelVO {
+ /**
+ * 表单模型 ID
+ */
+ private String id;
+ /**
+ * 表单模型名称
+ */
+ private String name;
+ /**
+ * 表单模型标识
+ */
+ private String key;
+ private Integer version;
+ /**
+ * 表单字段
+ */
+ private List fields;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
index 7dd744432..184614bf7 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
@@ -1,6 +1,8 @@
package cn.axzo.workflow.common.model.response.mq;
import cn.axzo.workflow.common.enums.ProcessMessagePushEventEnum;
+import cn.axzo.workflow.common.model.request.BpmnApproveConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -29,6 +31,16 @@ public class MessagePushDTO implements Serializable {
*/
private String processInstanceId;
+ /**
+ * 流程归属的租户 ID
+ */
+ private String adscriptionTenantId;
+
+ /**
+ * 业务 ID
+ */
+ private String processDefinitionKey;
+
/**
* 流程任务 ID
*/
@@ -49,4 +61,23 @@ public class MessagePushDTO implements Serializable {
*/
private Map variables;
+ /**
+ * 可用按钮集合
+ */
+ private List buttons;
+
+ /**
+ * 流程高级配置
+ */
+ private BpmnApproveConf processApproveConf;
+
+ /**
+ * 节点电子签开关
+ */
+ private Boolean activitySignature;
+ /**
+ * 催办专用属性,催办时的终端类型(管理端、工人端)
+ */
+ private String terminalType;
+
}
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 f1e193c1a..b36007eca 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
@@ -2,6 +2,7 @@ package cn.axzo.workflow.common.model.response.mq;
import cn.axzo.workflow.common.enums.ProcessInstanceEventEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -102,6 +103,11 @@ public class ProcessInstanceDTO implements Serializable {
*/
private BpmnNoticeConf noticeConf;
+ /**
+ * 模型中的签署配置
+ */
+ private BpmnSignConf signConf;
+
/**
* 当前数据的流程引擎版本
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
index a3db4b04c..d356f394a 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
@@ -3,6 +3,7 @@ package cn.axzo.workflow.common.model.response.mq;
import cn.axzo.workflow.common.enums.BpmnNoticeEnum;
import cn.axzo.workflow.common.enums.ProcessTaskEventEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -28,8 +29,11 @@ public class ProcessTaskDTO implements Serializable {
private ProcessTaskEventEnum type;
/**
+ * 请使用 {@link ProcessTaskDTO#processDefinitionKey} 代替访问此属性,未来将逐步废弃
+ *
* 流程实例所属业务分类,同时也等于流程模型对应的业务分类 ID
*/
+ @Deprecated
private String category;
/**
@@ -41,6 +45,14 @@ public class ProcessTaskDTO implements Serializable {
* 流程实例 ID
*/
private String processInstanceId;
+ /**
+ * 流程实例的businessKey
+ */
+ private String businessKey;
+ /**
+ * 流程实例所属业务分类,同时也等于流程模型对应的业务分类 ID
+ */
+ private String processDefinitionKey;
/**
* 流程定义中当前任务节点 Key
@@ -82,6 +94,16 @@ public class ProcessTaskDTO implements Serializable {
*/
private BpmnTaskDelegateAssigner approver;
+ /**
+ * 被转交人信息
+ */
+ private BpmnTaskDelegateAssigner transferTargetApprover;
+
+ /**
+ * 转交意见
+ */
+ private String transferAdvice;
+
/**
* 通知方式
*/
@@ -96,4 +118,13 @@ public class ProcessTaskDTO implements Serializable {
* 当前数据的流程引擎版本
*/
private String workflowEngineVersion;
+ /**
+ * 任务关联的附件
+ */
+ private List attachments;
+
+ /**
+ * 审批意见
+ */
+ private String advice;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java
new file mode 100644
index 000000000..de160efff
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java
@@ -0,0 +1,54 @@
+package cn.axzo.workflow.common.model.response.mq;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Starter RPC 调用事件模型
+ *
+ * @author wangli
+ * @since 2024/5/30 11:21
+ */
+public class WorkflowEngineStarterRpcInvokeDTO implements Serializable {
+ private static final long serialVersionUID = -1L;
+
+ private String className;
+
+ private String methodName;
+
+ private List parameters;
+
+ private String parameterTypesMd5;
+
+ public String getClassName() {
+ return className;
+ }
+
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+ public String getMethodName() {
+ return methodName;
+ }
+
+ public void setMethodName(String methodName) {
+ this.methodName = methodName;
+ }
+
+ public List getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(List parameters) {
+ this.parameters = parameters;
+ }
+
+ public String getParameterTypesMd5() {
+ return parameterTypesMd5;
+ }
+
+ public void setParameterTypesMd5(String parameterTypesMd5) {
+ this.parameterTypesMd5 = parameterTypesMd5;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java
new file mode 100644
index 000000000..6bdbc1f2e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java
@@ -0,0 +1,38 @@
+package cn.axzo.workflow.common.model.response.print;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 打印模板响应模型
+ *
+ * @author wangli
+ * @since 2025-02-11 10:41
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PrintModelDTO {
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板内容(前端打印组件的生成的完全数据)
+ */
+ @ApiModelProperty(value = "打印模板内容")
+ private String printTemplateConfig;
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnNativeQueryUtil.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/BpmnNativeQueryUtil.java
similarity index 95%
rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnNativeQueryUtil.java
rename to workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/BpmnNativeQueryUtil.java
index d28360c4a..c0f7b4f24 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnNativeQueryUtil.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/BpmnNativeQueryUtil.java
@@ -1,4 +1,4 @@
-package cn.axzo.workflow.core.common.utils;
+package cn.axzo.workflow.common.util;
/**
* @author wangli
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ExpressionUtil.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ExpressionUtil.java
new file mode 100644
index 000000000..0b0dd9665
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ExpressionUtil.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.util;
+
+import org.springframework.util.PropertyPlaceholderHelper;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * 处理字符串中含有变量的字符串
+ *
+ * @author wangli
+ * @since 2024-11-15 17:57
+ */
+public abstract class ExpressionUtil {
+ private static final String PREFIX = "${";
+ private static final String SUFFIX = "}";
+
+ private ExpressionUtil() {
+ throw new RuntimeException("Instantiation not supported");
+ }
+
+ public static String parseString(String exp, Map variables) {
+ return parseString(null, null, exp, variables);
+ }
+
+ public static String parseString(String prefix, String suffix, String exp, Map variables) {
+ if (!StringUtils.hasText(prefix) && !StringUtils.hasText(suffix)) {
+ prefix = PREFIX;
+ suffix = SUFFIX;
+ }
+ PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper(prefix, suffix);
+ Properties properties = new Properties();
+ variables.forEach((k, v) -> properties.setProperty(k, String.valueOf(v)));
+
+ // 自定义PlaceholderResolver实现类,用于处理占位符找不到对应值时返回空字符串
+ PropertyPlaceholderHelper.PlaceholderResolver resolver = placeholder -> properties.getProperty(placeholder, "");
+ return propertyPlaceholderHelper.replacePlaceholders(exp, resolver);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ThreadUtil.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ThreadUtil.java
new file mode 100644
index 000000000..42b09f932
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/util/ThreadUtil.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.util;
+
+
+import cn.axzo.workflow.common.enums.RpcInvokeModeEnum;
+
+/**
+ * 父子线程工具类
+ *
+ * @author wangli
+ * @since 2024/5/29 23:57
+ */
+public class ThreadUtil {
+
+ final static InheritableThreadLocal threadLocal = new InheritableThreadLocal<>();
+
+ public static void set(RpcInvokeModeEnum rpcInvokeMode) {
+ threadLocal.set(rpcInvokeMode);
+ }
+
+ public static RpcInvokeModeEnum get() {
+ return threadLocal.get();
+ }
+
+ public static void clear() {
+ threadLocal.remove();
+ }
+}
diff --git a/workflow-engine-core/pom.xml b/workflow-engine-core/pom.xml
index ee2d63944..d449a41c3 100644
--- a/workflow-engine-core/pom.xml
+++ b/workflow-engine-core/pom.xml
@@ -9,8 +9,7 @@
${revision}
workflow-engine-core
jar
-
- workflow-engine-core
+ Workflow Engine Core
6.7.2
2.0.0-SNAPSHOT
@@ -39,6 +38,10 @@
hutool-all
provided
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
-
+
org.flowable
@@ -86,13 +89,30 @@
cn.axzo.workflow
workflow-engine-api
+
cn.axzo.workflow
workflow-engine-common
+
+
+ cn.axzo.workflow
+ workflow-engine-form
+
+
org.apache.maven
maven-artifact
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+
+
+
+ com.aliyun
+ alibaba-dingtalk-service-sdk
+
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnModelRespCode.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnModelRespCode.java
deleted file mode 100644
index 2f5f12a2e..000000000
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/BpmnModelRespCode.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package cn.axzo.workflow.core.common.code;
-
-import cn.axzo.framework.domain.web.code.IModuleRespCode;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 流程模型响应码
- *
- * @author wangli
- * @since 2023/12/14 16:25
- */
-@Getter
-@AllArgsConstructor
-public enum BpmnModelRespCode implements IModuleRespCode {
- MODEL_KEY_EXISTS("001", "已经存在流程标识为【{}】的流程"),
- MODEL_ID_NOT_EXISTS("002", "流程模型ID【{}】不存在"),
- MODEL_KEY_NOT_EXISTS("003", "流程模型KEY【{}】不存在"),
- MODEL_NOT_EXISTS("004", "流程模型不存在"),
- BPMN_BYTES_NOT_EXISTS("005", "模型定义内容字节码不存在"),
- ;
-
- private String code;
- private String message;
-
- @Override
- public String getModuleCode() {
- return "03";
- }
-
- @Override
- public String getProjectCode() {
- return "998";
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
-
- public void setMessage(String message) {
- this.message = message;
- }
-
-}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ActivityOperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ActivityOperationContext.java
new file mode 100644
index 000000000..802dfac33
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ActivityOperationContext.java
@@ -0,0 +1,10 @@
+package cn.axzo.workflow.core.common.context;
+
+/**
+ * 活动(节点)相关操作上下文
+ *
+ * @author wangli
+ * @since 2024/4/12 16:43
+ */
+public class ActivityOperationContext extends CommonContext {
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java
new file mode 100644
index 000000000..02eeb6713
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java
@@ -0,0 +1,98 @@
+package cn.axzo.workflow.core.common.context;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
+import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
+import org.flowable.bpmn.model.Process;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.util.StringUtils;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * 事件处理器中通用的上下文
+ *
+ * @author wangli
+ * @since 2024/4/9 21:00
+ */
+public abstract class CommonContext implements OperationContext {
+ private T context;
+ private ProcessInstance processInstance;
+ private Deployment deployment;
+ private Process process;
+ private BpmnTaskDelegateAssigner initiator;
+ private BpmnProcessInstanceVO instanceVO;
+ private BpmnProcessDefinitionVO definitionVO;
+ private String processInstanceVersion;
+ private BpmnTaskDelegateAssigner lastOperationAssigner;
+
+ public ProcessInstance getProcessInstance(Supplier supplier) {
+ if (Objects.isNull(processInstance)) {
+ processInstance = supplier.get();
+ }
+ return processInstance;
+ }
+
+ public Deployment getDeployment(Supplier supplier) {
+ if (Objects.isNull(deployment)) {
+ deployment = supplier.get();
+ }
+ return deployment;
+ }
+
+ public Process getProcess(Supplier supplier) {
+ if (Objects.isNull(process)) {
+ process = supplier.get();
+ }
+ return process;
+ }
+
+ public BpmnProcessInstanceVO getInstanceVO(Supplier supplier) {
+ if (Objects.isNull(instanceVO)) {
+ instanceVO = supplier.get();
+ }
+ return instanceVO;
+ }
+
+ public BpmnProcessDefinitionVO getDefinitionVO(Supplier supplier) {
+ if (Objects.isNull(definitionVO)) {
+ definitionVO = supplier.get();
+ }
+ return definitionVO;
+ }
+
+ public BpmnTaskDelegateAssigner getInitiator(Supplier supplier) {
+ if (Objects.isNull(initiator)) {
+ initiator = supplier.get();
+ }
+ return initiator;
+ }
+
+ public BpmnTaskDelegateAssigner getLastOperationAssigner(Supplier supplier) {
+ if (Objects.isNull(lastOperationAssigner)) {
+ lastOperationAssigner = supplier.get();
+ }
+ return lastOperationAssigner;
+ }
+
+ public String getProcessInstanceVersion(Supplier supplier) {
+ if (!StringUtils.hasText(processInstanceVersion)) {
+ processInstanceVersion = supplier.get();
+ }
+ return processInstanceVersion;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void setContext(OperationContext context) {
+ this.context = (T) context;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T getContext() {
+ return context;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/NoticeOperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/NoticeOperationContext.java
new file mode 100644
index 000000000..cb2a5e116
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/NoticeOperationContext.java
@@ -0,0 +1,10 @@
+package cn.axzo.workflow.core.common.context;
+
+/**
+ * 通知相关操作上下文
+ *
+ * @author wangli
+ * @since 2024/4/12 16:47
+ */
+public class NoticeOperationContext extends CommonContext {
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/OperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/OperationContext.java
new file mode 100644
index 000000000..25f74bb2a
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/OperationContext.java
@@ -0,0 +1,17 @@
+package cn.axzo.workflow.core.common.context;
+
+
+/**
+ * 操作上下文接口
+ *
+ * @author wangli
+ * @since 2024/4/9 10:05
+ */
+public interface OperationContext {
+
+ default void setContext(OperationContext context) {
+ }
+
+ T getContext();
+}
+
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java
new file mode 100644
index 000000000..9342cd93b
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.core.common.context;
+
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * 流程相关操作上下文
+ *
+ * @author wangli
+ * @since 2024/4/9 22:52
+ */
+public class ProcessOperationContext extends CommonContext {
+
+ private List processFileTags;
+ private ProcessEngineConfiguration processEngineConfiguration;
+
+ public List getProcessFileTags(Supplier> supplier) {
+ if (CollectionUtils.isEmpty(processFileTags)) {
+ processFileTags = supplier.get();
+ }
+ return processFileTags;
+ }
+
+ public ProcessEngineConfiguration getProcessEngineConfiguration(Supplier supplier) {
+ if (Objects.isNull(processEngineConfiguration)) {
+ return supplier.get();
+ }
+ return processEngineConfiguration;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/TaskOperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/TaskOperationContext.java
new file mode 100644
index 000000000..9c52d02cf
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/TaskOperationContext.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.core.common.context;
+
+import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * 任务相关操作上下文
+ *
+ * @author wangli
+ * @since 2024/4/9 20:59
+ */
+public class TaskOperationContext extends CommonContext {
+
+ private List extAxHiTaskInsts = new ArrayList<>();
+
+ public List getExtAxHiTaskInsts(Supplier> supplier) {
+ if (CollectionUtils.isEmpty(extAxHiTaskInsts)) {
+ extAxHiTaskInsts.addAll(supplier.get());
+ }
+ return extAxHiTaskInsts;
+ }
+
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
index 3b6532d74..06400d673 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
@@ -9,7 +9,9 @@ import java.util.Arrays;
* @since 2023/9/18 17:11
*/
public enum BpmnProcessTaskResultEnum {
-
+ HANDLING("HANDLING", "审批中"), // 修改这里
+ PENDING("PENDING", "待处理"),
+ PROCESSED("PROCESSED", "已处理"),
AUTO_SKIP("AUTO_SKIP", "任务自动跳过"),
// 引擎默认的标识,不允许修改
MI_END("MI_END", "多实例任务运行结束"),
@@ -17,8 +19,7 @@ public enum BpmnProcessTaskResultEnum {
DELETE_MI_EXECUTION("Delete MI execution", "多实例任务被删除"),
INITIATOR_REVOCATION("INITIATOR_REVOCATION", "发起者主动撤回"),
REJECTION_AUTO_COMPLETED("REJECTION_AUTO_COMPLETED", "审批驳回自动结束"),
- BACKED("BACKED", "退回");
-
+ ;
private final String status;
/**
* 描述
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/MqLogEventType.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/MqLogEventType.java
new file mode 100644
index 000000000..d7ad3bb6b
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/MqLogEventType.java
@@ -0,0 +1,11 @@
+package cn.axzo.workflow.core.common.enums;
+
+/**
+ * MQ log 事件类型
+ *
+ * @author wangli
+ * @since 2024/5/15 15:36
+ */
+public enum MqLogEventType {
+ INSERT, UPDATE, DELETE
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogEvent.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogEvent.java
index 1bac74993..d9920b8ec 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogEvent.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogEvent.java
@@ -13,15 +13,20 @@ import org.springframework.context.ApplicationEvent;
public class ApiLogEvent extends ApplicationEvent {
private String traceId;
private String apiUrl;
+ private String requestApplicationName;
+ private String clientVersion;
private Object requestBody;
private Object responseBody;
private Double takeTime;
private String type;
- public ApiLogEvent(String traceId, String apiUrl, Object requestBody, Object responseBody, Double takeTime, String type) {
+ public ApiLogEvent(String traceId, String apiUrl, String requestApplicationName, String clientVersion,
+ Object requestBody, Object responseBody, Double takeTime, String type) {
super(apiUrl);
this.traceId = traceId;
this.apiUrl = apiUrl;
+ this.requestApplicationName = requestApplicationName;
+ this.clientVersion = clientVersion;
this.requestBody = requestBody;
this.responseBody = responseBody;
this.takeTime = takeTime;
@@ -32,10 +37,22 @@ public class ApiLogEvent extends ApplicationEvent {
return traceId;
}
+ public void setTraceId(String traceId) {
+ this.traceId = traceId;
+ }
+
public String getApiUrl() {
return apiUrl;
}
+ public String getRequestApplicationName() {
+ return requestApplicationName;
+ }
+
+ public String getClientVersion() {
+ return clientVersion;
+ }
+
public Object getRequestBody() {
return requestBody;
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
index d92acc91c..1d98e44cb 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
@@ -1,17 +1,25 @@
package cn.axzo.workflow.core.common.event;
+import cn.axzo.workflow.core.conf.SupportRefreshProperties;
import cn.axzo.workflow.core.repository.entity.ExtAxApiLog;
import cn.axzo.workflow.core.service.ExtAxApiLogService;
import cn.hutool.json.JSONUtil;
+import com.google.common.base.Strings;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.UUID;
+
+import static cn.azxo.framework.common.constatns.Constants.CTX_LOG_ID_MDC;
/**
* Api Log 记录表操作监听
@@ -22,7 +30,8 @@ import java.util.List;
@Component
@Slf4j
public class ApiLogListener implements ApplicationListener {
-
+ @Resource
+ private SupportRefreshProperties refreshProperties;
@Resource
private ExtAxApiLogService apiLogService;
private static final List EXCLUDE_URLS = new ArrayList<>();
@@ -35,9 +44,14 @@ public class ApiLogListener implements ApplicationListener {
@Override
@Async
public void onApplicationEvent(ApiLogEvent event) {
- if (EXCLUDE_URLS.contains(event.getApiUrl())) {
+ if (!refreshProperties.getApiLogEnable() || EXCLUDE_URLS.contains(event.getApiUrl())) {
return;
}
+ if (!supportApiType(event)) {
+ return;
+ }
+ rebuildTraceId(event);
+
ExtAxApiLog apiLog = new ExtAxApiLog();
apiLog.setTraceId(event.getTraceId());
apiLog.setApiUrl(event.getApiUrl());
@@ -47,4 +61,21 @@ public class ApiLogListener implements ApplicationListener {
apiLog.setType(event.getType());
apiLogService.insert(apiLog);
}
+
+ private static void rebuildTraceId(ApiLogEvent event) {
+ if (Strings.isNullOrEmpty(event.getTraceId())) {
+ String traceId = Strings.isNullOrEmpty(event.getTraceId())
+ ? UUID.randomUUID().toString().replaceAll("-", "") : event.getTraceId();
+ MDC.put(CTX_LOG_ID_MDC, traceId);
+ event.setTraceId(traceId);
+ }
+ }
+
+ private boolean supportApiType(ApiLogEvent event) {
+ if (!StringUtils.hasText(refreshProperties.getFilterApiType())) {
+ return true;
+ }
+ List list = Arrays.asList(refreshProperties.getFilterApiType().split(","));
+ return list.contains(event.getType());
+ }
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogEvent.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogEvent.java
new file mode 100644
index 000000000..5433ce7e6
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogEvent.java
@@ -0,0 +1,89 @@
+package cn.axzo.workflow.core.common.event;
+
+import cn.axzo.workflow.core.common.enums.MqLogEventType;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * Mq Log Event 时间对象
+ *
+ * @author wangli
+ * @since 2024/5/15 11:01
+ */
+@Slf4j
+public class MqLogEvent extends ApplicationEvent {
+ private String uniqueId;
+ private String messageId;
+ private String mqTag;
+ private String mqKey;
+ private String messageBody;
+ private String traceId;
+ private MqLogEventType eventType;
+
+ public MqLogEvent(String uniqueId, String messageId, String mqTag, String mqKey, String messageBody, String traceId, MqLogEventType eventType) {
+ super(uniqueId);
+ this.uniqueId = uniqueId;
+ this.messageId = messageId;
+ this.mqTag = mqTag;
+ this.mqKey = mqKey;
+ this.messageBody = messageBody;
+ this.traceId = traceId;
+ this.eventType = eventType;
+ }
+
+ public String getUniqueId() {
+ return uniqueId;
+ }
+
+ public void setUniqueId(String uniqueId) {
+ this.uniqueId = uniqueId;
+ }
+
+ public String getMessageId() {
+ return messageId;
+ }
+
+ public void setMessageId(String messageId) {
+ this.messageId = messageId;
+ }
+
+ public String getMqTag() {
+ return mqTag;
+ }
+
+ public void setMqTag(String tag) {
+ this.mqTag = tag;
+ }
+
+ public String getMqKey() {
+ return mqKey;
+ }
+
+ public void setMqKey(String key) {
+ this.mqKey = key;
+ }
+
+ public String getMessageBody() {
+ return messageBody;
+ }
+
+ public void setMessageBody(String messageBody) {
+ this.messageBody = messageBody;
+ }
+
+ public String getTraceId() {
+ return traceId;
+ }
+
+ public void setTraceId(String traceId) {
+ this.traceId = traceId;
+ }
+
+ public MqLogEventType getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(MqLogEventType eventType) {
+ this.eventType = eventType;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogListener.java
new file mode 100644
index 000000000..8a9b6be6c
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/MqLogListener.java
@@ -0,0 +1,81 @@
+package cn.axzo.workflow.core.common.event;
+
+import cn.axzo.workflow.core.conf.SupportRefreshProperties;
+import cn.axzo.workflow.core.repository.entity.ExtAxMqLog;
+import cn.axzo.workflow.core.service.ExtAxMqLogService;
+import cn.hutool.json.JSONUtil;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * Api Log 记录表操作监听
+ *
+ * @author wangli
+ * @since 2024/4/3 10:37
+ */
+@Component
+@Slf4j
+public class MqLogListener implements ApplicationListener {
+
+ @Resource
+ private SupportRefreshProperties refreshProperties;
+ @Resource
+ private ExtAxMqLogService mqLogService;
+
+
+ @SneakyThrows
+ @Override
+ public void onApplicationEvent(MqLogEvent event) {
+ log.info("receive mq log event");
+ if (!refreshProperties.getMqLogEnable()) {
+ return;
+ }
+ switch (event.getEventType()) {
+ case INSERT:
+ insert(buildMqLogEntity(event));
+ break;
+ case UPDATE:
+ update(buildMqLogEntity(event));
+ break;
+ case DELETE:
+ delete(buildMqLogEntity(event));
+ break;
+ default:
+ break;
+ }
+ }
+
+ private ExtAxMqLog buildMqLogEntity(MqLogEvent event) {
+ ExtAxMqLog entity = new ExtAxMqLog();
+ entity.setUniqueId(event.getUniqueId());
+ entity.setMessageId(event.getMessageId());
+ entity.setMqTag(event.getMqTag());
+ entity.setMqKey(event.getMqKey());
+ entity.setMessageBody(event.getMessageBody());
+ entity.setTraceId(event.getTraceId());
+ return entity;
+ }
+
+ private void delete(ExtAxMqLog event) {
+ log.info("delete mq log, event: {}", JSONUtil.toJsonStr(event));
+ event.setDeleteThreadName(Thread.currentThread().getName());
+ mqLogService.delete(event);
+ }
+
+ private void update(ExtAxMqLog event) {
+ log.info("update mq log, event: {}", JSONUtil.toJsonStr(event));
+ event.setUpdateThreadName(Thread.currentThread().getName());
+ mqLogService.update(event);
+ }
+
+ private void insert(ExtAxMqLog event) {
+ log.info("insert mq log, event: {}", JSONUtil.toJsonStr(event));
+ event.setInsertThreadName(Thread.currentThread().getName());
+ mqLogService.insert(event);
+ }
+
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java
deleted file mode 100644
index 62575250f..000000000
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java
+++ /dev/null
@@ -1,432 +0,0 @@
-package cn.axzo.workflow.core.common.utils;
-
-import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
-import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
-import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
-import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
-import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
-import com.google.common.collect.Lists;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.flowable.bpmn.BpmnAutoLayout;
-import org.flowable.bpmn.converter.BpmnXMLConverter;
-import org.flowable.bpmn.model.BpmnModel;
-import org.flowable.bpmn.model.EndEvent;
-import org.flowable.bpmn.model.ExclusiveGateway;
-import org.flowable.bpmn.model.FlowElement;
-import org.flowable.bpmn.model.FlowableListener;
-import org.flowable.bpmn.model.MultiInstanceLoopCharacteristics;
-import org.flowable.bpmn.model.Process;
-import org.flowable.bpmn.model.SequenceFlow;
-import org.flowable.bpmn.model.ServiceTask;
-import org.flowable.bpmn.model.StartEvent;
-import org.flowable.bpmn.model.UserTask;
-import org.flowable.engine.delegate.TaskListener;
-import org.flowable.engine.repository.Model;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
-import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
-import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO;
-import static cn.axzo.workflow.common.constant.BpmnConstants.OR_SIGN_EXPRESSION_ONE_PASS;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_META_DATA_FORMAT_ERROR;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_UNKNOW_NODE_TYPE;
-import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
-import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_END;
-import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_START;
-
-/**
- * 该工具是以前枢智版本使用,后续迭代都通过 BpmnJsonConverterUtil 该工具操作
- */
-@Slf4j
-@Deprecated
-public class BpmTransformUtil {
- public static byte[] transformBpmnJsonToXml(BpmnJsonNode bpmnJson, Model model) {
- return transformBpmnJsonToXml(bpmnJson, model, null);
- }
-
- public static byte[] transformBpmnJsonToXml(BpmnJsonNode bpmnJson, Model model, String category) {
- BpmnModel bpmnModel = new BpmnModel();
- Process process = new Process();
- bpmnModel.addProcess(process);
-
- process.setId(model.getKey());
- process.setName(model.getName());
-
- if (BpmnFlowNodeType.NODE_STARTER.equals(bpmnJson.getType())) {
- process.addFlowElement(createStartEvent(bpmnJson.getId(), Objects.nonNull(bpmnJson.getProperty()) ?
- bpmnJson.getProperty().getFormKey() : ""));
- }
-
- List sequenceFlows = Lists.newArrayList();
- Map childNodeMap = new HashMap<>();
-
- String lastNode = null;
- try {
- lastNode = create(bpmnJson.getId(), bpmnJson.getChildren(), process, bpmnModel, sequenceFlows,
- childNodeMap);
- } catch (WorkflowEngineException e) {
- throw e;
- } catch (Exception e) {
- throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR);
- }
- EndEvent endEvent = createEndEvent();
- process.addFlowElement(endEvent);
- process.addFlowElement(sequenceFlow(lastNode, endEvent.getId(), sequenceFlows, childNodeMap, process));
-
-
- if (StringUtils.isNotBlank(category)) {
- bpmnModel.setTargetNamespace(category);
- }
- new BpmnAutoLayout(bpmnModel).execute();
- byte[] xmlMeta = new BpmnXMLConverter().convertToXML(bpmnModel);
- String xmlResult = new String(xmlMeta);
- return xmlMeta;
-
- }
-
- private static String id(String prefix) {
- return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase();
- }
-
- private static ServiceTask serviceTask(String name) {
- ServiceTask serviceTask = new ServiceTask();
- serviceTask.setName(name);
- return serviceTask;
- }
-
- public static SequenceFlow sequenceFlow(String from, String to, List sequenceFlows, Map childNodeMap, Process process) {
- SequenceFlow flow = new SequenceFlow();
- String sequenceFlowId = id("sequenceFlow");
- if (process.getFlowElement(from) != null && process.getFlowElement(from) instanceof ExclusiveGateway) {
- BpmnJsonNode childNode = childNodeMap.get(to);
- if (childNode != null) {
- String parentId = childNode.getParentId();
- if (StringUtils.isNotBlank(parentId)) {
- BpmnJsonNode parentNode = childNodeMap.get(parentId);
- if (parentNode != null) {
- if (BpmnFlowNodeType.NODE_CONDITION.equals(parentNode.getType())) {
- sequenceFlowId = parentNode.getId();
- flow.setName(parentNode.getName());
- if (!ObjectUtils.isEmpty(parentNode.getProperty()) && !Boolean.TRUE.equals(parentNode.getProperty().getDefaultBranch())) {
- //解析条件表达式
- // StringBuffer conditionExpression = new StringBuffer();
- // conditionExpression.append("${ ")
- // .append("var:eq('")
- // .append(parentNode.getProperty()
- // .getConditionBranchKey())
- // .append("', ")
- // .append(parentNode.getProperty()
- // .getConditionBranchValue())
- // .append(")");
- // conditionExpression.append(" }");
- //
- // flow.setConditionExpression(conditionExpression
- // .toString());
- }
- }
- }
- }
- }
- }
- flow.setId(sequenceFlowId);
- flow.setSourceRef(from);
- flow.setTargetRef(to);
- sequenceFlows.add(flow);
- return flow;
- }
-
- public static StartEvent createStartEvent(String id, String formKey) {
- StartEvent startEvent = new StartEvent();
- startEvent.setId(id);
- // startEvent.setInitiator("applyUserId");
- if (Objects.nonNull(formKey) && !formKey.trim().isEmpty()) {
- startEvent.setFormKey(formKey);
- }
- return startEvent;
- }
-
- public static EndEvent createEndEvent() {
- EndEvent endEvent = new EndEvent();
- endEvent.setId(END_EVENT_ID);
- return endEvent;
- }
-
-
- public static String create(String fromId, BpmnJsonNode flowNode, Process process, BpmnModel bpmnModel,
- List sequenceFlows, Map childNodeMap) throws InvocationTargetException, IllegalAccessException {
- String nodeType = flowNode.getType().getType();
- if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.isEqual(nodeType)) {
- return createExclusiveGatewayBuilder(fromId, flowNode, process, bpmnModel, sequenceFlows, childNodeMap);
- } else if (BpmnFlowNodeType.NODE_TASK.isEqual(nodeType)) {
- childNodeMap.put(flowNode.getId(), flowNode);
- flowNode.setIncoming(Collections.singletonList(fromId));
- String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
- // 如果当前任务还有后续任务,则遍历创建后续任务
- BpmnJsonNode children = flowNode.getChildren();
- if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
- return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
- } else {
- return id;
- }
- } else if (BpmnFlowNodeType.NODE_STARTER.isEqual(nodeType)) {
- childNodeMap.put(flowNode.getId(), flowNode);
- flowNode.setIncoming(Collections.singletonList(fromId));
- String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
- // 如果当前任务还有后续任务,则遍历创建后续任务
- BpmnJsonNode children = flowNode.getChildren();
- if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
- return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
- } else {
- return id;
- }
- } else {
- throw new WorkflowEngineException(CONVERTOR_UNKNOW_NODE_TYPE, nodeType);
- }
- }
-
- public static ExclusiveGateway createExclusiveGateWayEnd(String id) {
- ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
- exclusiveGateway.setId(id);
- return exclusiveGateway;
- }
-
-
- private static String createExclusiveGatewayBuilder(String formId, BpmnJsonNode flowNode, Process process,
- BpmnModel bpmnModel, List sequenceFlows,
- Map childNodeMap) throws InvocationTargetException, IllegalAccessException {
- childNodeMap.put(flowNode.getId(), flowNode);
- String name = flowNode.getName();
- String exclusiveGatewayId = flowNode.getId();
- ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
- exclusiveGateway.setId(exclusiveGatewayId);
- exclusiveGateway.setName(name);
- process.addFlowElement(exclusiveGateway);
- process.addFlowElement(sequenceFlow(formId, exclusiveGatewayId, sequenceFlows, childNodeMap, process));
-
- if (Objects.isNull(flowNode.getBranches()) && Objects.isNull(flowNode.getChildren())) {
- return exclusiveGatewayId;
- }
- List branches = flowNode.getBranches();
- List incoming = Lists.newArrayListWithCapacity(branches.size());
- List conditions = Lists.newCopyOnWriteArrayList();
- for (BpmnJsonNode element : branches) {
- if (!ObjectUtils.isEmpty(element.getProperty())) {
- Boolean typeElse = element.getProperty().getDefaultBranch();
- if (Boolean.TRUE.equals(typeElse)) {
- exclusiveGateway.setDefaultFlow(element.getId());
- }
- }
-
- childNodeMap.put(element.getId(), element);
- BpmnJsonNode children = element.getChildren();
- String nodeName = element.getName();
-
- if (!ObjectUtils.isEmpty(element.getProperty()) && (Objects.isNull(children) || StringUtils.isBlank(children.getId()))) {
-
- incoming.add(exclusiveGatewayId);
- Map condition = new HashMap();
-
- //解析条件表达式
- // StringBuffer conditionExpression = new StringBuffer();
- // conditionExpression.append("${ ");
- // conditionExpression.append("var:eq('" + element.getProperty().getConditionBranchKey
- // () + "', " + element.getProperty().getConditionBranchValue() + ") ");
- // conditionExpression.append(" }");
- // condition.put("nodeName", nodeName);
- // condition.put("expression", conditionExpression.toString());
-
- conditions.add(condition);
- continue;
- }
- // 只生成一个任务,同时设置当前任务的条件
- children.setIncoming(Collections.singletonList(exclusiveGatewayId));
- String identifier = create(exclusiveGatewayId, children, process, bpmnModel, sequenceFlows, childNodeMap);
- List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId,
- flow.getSourceRef()))
- .collect(Collectors.toList());
- flows.stream().forEach(
- e -> {
- if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) {
- e.setName(nodeName);
- }
- // 设置条件表达式
- // if (Objects.isNull(e.getConditionExpression()) && StringUtils
- // .isNotBlank(expression)) {
- // e.setConditionExpression(expression);
- // }
- }
- );
- if (Objects.nonNull(identifier)) {
- incoming.add(identifier);
- }
- }
-
-
- BpmnJsonNode childNode = flowNode.getChildren();
-
- if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) {
- String parentId = childNode.getParentId();
- BpmnJsonNode parentChildNode = childNodeMap.get(parentId);
- if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.equals(parentChildNode.getType())) {
- String endExId = parentChildNode.getId() + "end";
- process.addFlowElement(createExclusiveGateWayEnd(endExId));
- if (incoming == null || incoming.isEmpty()) {
- return create(exclusiveGatewayId, childNode, process, bpmnModel, sequenceFlows,
- childNodeMap);
- } else {
- // 所有 service task 连接 end exclusive gateway
- childNode.setIncoming(incoming);
- FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
- // 1.0 先进行边连接, 暂存 nextNode
- BpmnJsonNode nextNode = childNode.getChildren();
- childNode.setChildren(null);
- String identifier = endExId;
- for (int i = 0; i < incoming.size(); i++) {
- process.addFlowElement(sequenceFlow(incoming.get(i), identifier, sequenceFlows, childNodeMap,
- process));
- }
-
- // 针对 gateway 空任务分支 添加条件表达式
- if (!conditions.isEmpty()) {
- FlowElement flowElement1 = bpmnModel.getFlowElement(identifier);
- // 获取从 gateway 到目标节点 未设置条件表达式的节点
- List flows = sequenceFlows.stream().filter(
- flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef()))
- .filter(
- flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId))
- .collect(Collectors.toList());
- flows.stream().forEach(sequenceFlow -> {
- if (!conditions.isEmpty()) {
- Map condition = conditions.get(0);
- String nodeName = (String) condition.get("nodeName");
- String expression = (String) condition.get("expression");
-
- if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils
- .isNotBlank(nodeName)) {
- sequenceFlow.setName(nodeName);
- }
- // 设置条件表达式
- if (Objects.isNull(sequenceFlow.getConditionExpression())
- && StringUtils.isNotBlank(expression)) {
- sequenceFlow.setConditionExpression(expression);
- }
- conditions.remove(0);
- }
- });
-
- }
-
- // 1.1 边连接完成后,在进行 nextNode 创建
- if (StringUtils.isNotBlank(childNode.getId())) {
- return create(identifier, childNode, process, bpmnModel, sequenceFlows,
- childNodeMap);
- } else {
- return identifier;
- }
- }
- }
- }
- return exclusiveGatewayId;
- }
-
-
- private static String createTask(Process process, BpmnJsonNode flowNode, List sequenceFlows,
- Map childNodeMap) {
- List incoming = flowNode.getIncoming();
- // 自动生成id
- // String id = id("serviceTask");
- String id = flowNode.getId();
- if (incoming != null && !incoming.isEmpty()) {
- UserTask userTask = new UserTask();
- userTask.setName(flowNode.getName());
- userTask.setId(id);
- process.addFlowElement(userTask);
- process.addFlowElement(sequenceFlow(incoming.get(0), id, sequenceFlows, childNodeMap, process));
-
- FlowableListener createTaskListener = new FlowableListener();
- createTaskListener.setEvent(TaskListener.EVENTNAME_ALL_EVENTS);
- createTaskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
-
- createTaskListener.setImplementation("${engineTaskEventListener}");
- List taskListeners = new ArrayList<>();
- taskListeners.add(createTaskListener);
- userTask.setTaskListeners(taskListeners);
- if ("root".equalsIgnoreCase(id)) {
- } else {
- List executionListeners = new ArrayList<>();
- createExecutionListener(EVENTNAME_START, executionListeners);
- // End 事件,主要想用于多实例节点保留一条历史的任务信息, 后续研究过程中, 发现通过更优的解决方案, 所以注释掉下面一行
- // createExecutionListener(EVENTNAME_END, executionListeners);
- userTask.setExecutionListeners(executionListeners);
-
- if (!ObjectUtils.isEmpty(flowNode.getProperty()) && Boolean.TRUE.equals(flowNode.getProperty().getIsMultiTask())) {
- BpmnJsonNodeProperty property = flowNode.getProperty();
- BpmnFlowNodeMode mode = property.getMultiMode();
-
- MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics =
- new MultiInstanceLoopCharacteristics();
- // 审批人集合参数
- multiInstanceLoopCharacteristics.setInputDataItem(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO + userTask.getId());
- // 迭代集合
- multiInstanceLoopCharacteristics.setElementVariable("assigneeName");
- // 并行
- multiInstanceLoopCharacteristics.setSequential(false);
- userTask.setAssignee("${assigneeName}");
- // 设置多实例属性
- userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
- if (BpmnFlowNodeMode.OR.getType().equals(mode.getType())) {
- multiInstanceLoopCharacteristics.setCompletionCondition(OR_SIGN_EXPRESSION_ONE_PASS);
- } else if (BpmnFlowNodeMode.AND.getType().equals(mode.getType())) {
- multiInstanceLoopCharacteristics.setCompletionCondition(AND_SIGN_EXPRESSION);
- }
- }
- // 设置审批人为空时,允许自动通过
- // if (!ObjectUtils.isEmpty(flowNode.getProperty()) && flowNode.getProperty()
- // .getAllowSkip()) {
- // userTask.setSkipExpression("${" + BPM_ALLOW_SKIP_USER_TASK + "}");
- // }
- if (!ObjectUtils.isEmpty(flowNode.getProperty()) && StringUtils.isNotBlank(flowNode.getProperty().getFormKey())) {
- userTask.setFormKey(flowNode.getProperty().getFormKey());
- }
- }
- }
- return id;
- }
-
- /**
- * 根据 Execution 事件类型, 创建 Execution 监听器
- *
- * @param eventName @see ExecutionListener
- * @return
- */
- private static void createExecutionListener(String eventName, List listeners) {
- FlowableListener executionListener = new FlowableListener();
- executionListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
- executionListener.setEvent(eventName);
- switch (eventName) {
- case EVENTNAME_START:
- executionListener.setImplementation("${engineExecutionStartListener}");
- break;
- case EVENTNAME_END:
- executionListener.setImplementation("${engineExecutionEndListener}");
- break;
- default:
- return;
- }
- listeners.add(executionListener);
- }
-
-
-}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnExpressionTranslator.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnExpressionTranslator.java
index 412cccba0..4933a7730 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnExpressionTranslator.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnExpressionTranslator.java
@@ -1,16 +1,16 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.model.request.bpmn.BpmnCondition;
-import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.exception.WorkflowEngineException;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Objects;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_OPERATION_CHECKBOX_TYPE_ERROR;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_OPERATION_NUMBER_TYPE_ERROR;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_OPERATION_RADIO_TYPE_ERROR;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_OPERATION_STRING_TYPE_ERROR;
+import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_OPERATION_CHECKBOX_TYPE_ERROR;
+import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_OPERATION_NUMBER_TYPE_ERROR;
+import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_OPERATION_RADIO_TYPE_ERROR;
+import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_OPERATION_STRING_TYPE_ERROR;
/**
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
index 2450b8e65..fe050478b 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
@@ -1,15 +1,21 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
+import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
+import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
-import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
+import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
import cn.axzo.workflow.core.converter.json.EndEventJsonConverter;
import cn.axzo.workflow.core.converter.json.ExclusiveGatewayJsonConverter;
import cn.axzo.workflow.core.converter.json.NotSupportConverter;
@@ -19,12 +25,14 @@ import cn.axzo.workflow.core.converter.json.SequenceFlowJsonConverter;
import cn.axzo.workflow.core.converter.json.ServiceTaskJsonConverter;
import cn.axzo.workflow.core.converter.json.StartEventJsonConverter;
import cn.axzo.workflow.core.converter.json.UserTaskJsonConverter;
+import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BaseElement;
+import org.flowable.bpmn.model.BoundaryEvent;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.ExclusiveGateway;
@@ -63,8 +71,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import java.util.UUID;
+import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
+import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_SUPPORT_BATCH_OPERATION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_USER_AGREE_SIGNATURE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_META;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
@@ -75,6 +89,8 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DISABLED;
@@ -84,20 +100,33 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.SEQUENCE_FLOW_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.START_EVENT_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
-import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_CONFIG;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ASSIGNERS;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_HISTORIES;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_INITIATOR;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_POSITIONS;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_EVENTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SIGN_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
-import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
+import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getUpgradeApprovalConf;
/**
* BPMN json 格式转换工具
@@ -127,6 +156,7 @@ public final class BpmnJsonConverterUtil {
CONVERTERS.put(UserTask.class, new UserTaskJsonConverter());
CONVERTERS.put(ServiceTask.class, new ServiceTaskJsonConverter());
CONVERTERS.put(ReceiveTask.class, new ReceiveTaskJsonConverter());
+ CONVERTERS.put(BoundaryEvent.class, new BoundaryEventJsonConverter());
}
/**
@@ -141,9 +171,11 @@ public final class BpmnJsonConverterUtil {
BpmnJsonNode bpmnJsonNode = JSON.parseObject(mainProcess.getAttributeValue(null, FLOW_NODE_JSON),
BpmnJsonNode.class);
model.setNode(bpmnJsonNode);
+ getProcessApproveConf(mainProcess).ifPresent(model::setApproveConf);
getNoticeConfig(mainProcess).ifPresent(model::setNoticeConf);
getButtonConfig(mainProcess).ifPresent(model::setButtonConf);
getFieldConfig(mainProcess).ifPresent(model::setFieldConf);
+ getSignConfig(mainProcess).ifPresent(model::setSignConf);
return model;
}
@@ -151,13 +183,19 @@ public final class BpmnJsonConverterUtil {
* 将 json 格式数据转的 BpmnJsonNode 对象,转换成 Flowable 标准的模型 {@link BpmnModel}
*
* @param bpmnJsonNode json 格式对象,可以直接解析
+ * @param approveConf 流程高审批相关高级配置
* @param noticeConf
* @param buttonConf
* @param fieldConf
* @return {@link BpmnModel}
*/
- public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, String id, String name, String documentation,
- BpmnNoticeConf noticeConf, BpmnButtonConf buttonConf,
+ public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
+ String id, String name, String formKey,
+ String documentation,
+ BpmnApproveConf approveConf,
+ BpmnSignConf signConf,
+ BpmnNoticeConf noticeConf,
+ BpmnButtonConf buttonConf,
List fieldConf,
String serverVersionStr) {
if (Objects.isNull(bpmnJsonNode)) {
@@ -165,22 +203,28 @@ public final class BpmnJsonConverterUtil {
}
// 提交的 BpmnJsonNode 全部都是任务是可执行节点, 这里的转换是全局都会增加开始和结束节点. 因为前段的提交的数据是不包含开始和结束
BpmnModel bpmnModel = new BpmnModel();
-
+ ExtensionAttribute modelType = new ExtensionAttribute();
+ modelType.setName(FLOW_MODEL_BIZ_TYPE);
+ modelType.setValue(Objects.nonNull(modelBizType) ? modelBizType.getType() : ModelBizTypeEnum.FLOWABLE.getType());
ExtensionAttribute serverVersion = new ExtensionAttribute();
serverVersion.setName(FLOW_SERVER_VERSION);
- //FIXME: 尽量在每次版本迭代时, 都修改这里的版本号, 用于以后特殊场景下消息流程相关数据时, 能区别不同时期的处理办法,还需要动态起来
serverVersion.setValue(serverVersionStr);
ExtensionAttribute jsonMetaValue = new ExtensionAttribute();
jsonMetaValue.setName(FLOW_NODE_JSON);
- jsonMetaValue.setValue(JSON.toJSONString(bpmnJsonNode));
+ jsonMetaValue.setValue(JSONUtil.toJsonStr(bpmnJsonNode));
Process mainProcess = new Process();
mainProcess.setId(id);
mainProcess.setName(name);
mainProcess.setDocumentation(documentation);
+ mainProcess.addAttribute(modelType);
mainProcess.addAttribute(serverVersion);
mainProcess.addAttribute(jsonMetaValue);
+ //设置流程审批相关高级配置
+ setProcessApproveConfigs(approveConf, mainProcess);
+ // 设置签署配置
+ setSignConfig(signConf, mainProcess);
// 设置流程的通知管理配置
setProcessNoticeConfig(noticeConf, mainProcess);
// 设置流程的默认的按钮配置
@@ -191,13 +235,16 @@ public final class BpmnJsonConverterUtil {
bpmnModel.addProcess(mainProcess);
// 创建固定的开始节点
- mainProcess.addFlowElement(convertJsonToElement(StartEvent.class, mainProcess));
+ mainProcess.addFlowElement(convertJsonToElement(StartEvent.class, mainProcess, formKey));
// 创建固定的结束节点
- mainProcess.addFlowElement(convertJsonToElement(EndEvent.class, mainProcess));
+ mainProcess.addFlowElement(convertJsonToElement(EndEvent.class, mainProcess, formKey));
// 解析前端传入的模型设计 json
- List lastNodeIds = create(bpmnJsonNode, mainProcess, bpmnModel, null, START_EVENT_ID);
+ List lastNodeIds = Lists.newArrayList(START_EVENT_ID);
+ if (StringUtils.hasText(bpmnJsonNode.getId())) {
+ lastNodeIds = create(formKey, bpmnJsonNode, mainProcess, bpmnModel, null, START_EVENT_ID);
+ }
if (CollectionUtils.isEmpty(lastNodeIds)) {
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "未找到链接结束节点的节点数据");
@@ -214,6 +261,39 @@ public final class BpmnJsonConverterUtil {
return bpmnModel;
}
+ private static void setSignConfig(BpmnSignConf signConf, Process mainProcess) {
+ if (Objects.isNull(signConf)) {
+ return;
+ }
+ ExtensionElement signConfigElement = new ExtensionElement();
+ signConfigElement.setName(CONFIG_SIGN);
+
+ if (Objects.nonNull(signConf.getSignType())) {
+ ExtensionElement signType = new ExtensionElement();
+ signType.setName(CONFIG_SIGN_TYPE);
+ ExtensionAttribute signTypeAttr = new ExtensionAttribute();
+ signTypeAttr.setName(ELEMENT_ATTRIBUTE_TYPE);
+ signTypeAttr.setValue(signConf.getSignType().getType());
+ signType.addAttribute(signTypeAttr);
+ signType.setElementText(signConf.getSignType().getDesc());
+ signConfigElement.addChildElement(signType);
+ }
+
+ // 签署待办消息模板配置
+ if (Objects.nonNull(signConf.getSignPendingProperty()) && Objects.nonNull(signConf.getSignPendingProperty().getPendingMessageId())) {
+ ExtensionElement signPendingMessage = new ExtensionElement();
+ signPendingMessage.setName(TEMPLATE_SIGN_PENDING_MESSAGE_ID);
+ ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
+ pendingMessageAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ pendingMessageAttribute.setValue(signConf.getSignPendingProperty().getPendingMessageId());
+ signPendingMessage.addAttribute(pendingMessageAttribute);
+ signPendingMessage.setElementText(StringUtils.hasText(signConf.getSignPendingProperty().getViewJson()) ?
+ signConf.getSignPendingProperty().getViewJson() : "");
+ signConfigElement.addChildElement(signPendingMessage);
+ }
+ mainProcess.addExtensionElement(signConfigElement);
+ }
+
private static void setProcessFieldConfig(List fieldConf, Process mainProcess) {
if (CollectionUtils.isEmpty(fieldConf)) {
return;
@@ -313,6 +393,12 @@ public final class BpmnJsonConverterUtil {
disabledAttribute.setName(ELEMENT_ATTRIBUTE_DISABLED);
disabledAttribute.setValue(String.valueOf(i.getDisabled()));
button.addAttribute(disabledAttribute);
+
+ ExtensionAttribute typeAttribute = new ExtensionAttribute();
+ typeAttribute.setName(ELEMENT_ATTRIBUTE_TYPE);
+ typeAttribute.setValue(StringUtils.hasText(i.getType()) ? i.getType() : "SYSTEM");
+ button.addAttribute(typeAttribute);
+
initiator.addChildElement(button);
});
buttonConfigElement.addChildElement(initiator);
@@ -327,15 +413,88 @@ public final class BpmnJsonConverterUtil {
noticeConfigElement.setName(CONFIG_NOTICE);
// 通知消息模板配置
- if (Objects.nonNull(noticeConf.getNotice()) && Objects.nonNull(noticeConf.getNotice().getNoticeMessageId())) {
+ if (Objects.nonNull(noticeConf.getNotice()) && noticeConf.getNotice().getSendMessage() != null && noticeConf.getNotice().getSendMessage()) {
ExtensionElement noticeMessage = new ExtensionElement();
- noticeMessage.setName(TEMPLATE_NOTICE_MESSAGE_ID);
+ noticeMessage.setName(TEMPLATE_NOTICE_MESSAGE_CONFIG);
ExtensionAttribute noticeMessageAttribute = new ExtensionAttribute();
- noticeMessageAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
- noticeMessageAttribute.setValue(noticeConf.getNotice().getNoticeMessageId());
+ noticeMessageAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ noticeMessageAttribute.setValue(String.valueOf(noticeConf.getNotice().getSendMessage()));
noticeMessage.addAttribute(noticeMessageAttribute);
- noticeMessage.setElementText(StringUtils.hasText(noticeConf.getNotice().getViewJson()) ?
- noticeConf.getNotice().getViewJson() : "");
+
+ ExtensionElement noticeEvents = new ExtensionElement();
+ noticeEvents.setName(TEMPLATE_NOTICE_MESSAGE_EVENTS);
+ noticeEvents.setElementText(JSON.toJSONString(noticeConf.getNotice().getTriggerEvents()));
+ noticeMessage.addChildElement(noticeEvents);
+
+ ExtensionElement noticeToObject = new ExtensionElement();
+ noticeToObject.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION);
+
+ if (Objects.nonNull(noticeConf.getNotice().getInitiator())) {
+ ExtensionElement initiator = new ExtensionElement();
+ initiator.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION_INITIATOR);
+ ExtensionAttribute initiatorAttribute = new ExtensionAttribute();
+ initiatorAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ initiatorAttribute.setValue(String.valueOf(noticeConf.getNotice().getInitiator().getSelected()));
+ initiator.addAttribute(initiatorAttribute);
+ if (StringUtils.hasText(noticeConf.getNotice().getInitiator().getViewJson())) {
+ initiator.setElementText(noticeConf.getNotice().getInitiator().getViewJson());
+ }
+ noticeToObject.addChildElement(initiator);
+ }
+
+ if (Objects.nonNull(noticeConf.getNotice().getHistories())) {
+ ExtensionElement histories = new ExtensionElement();
+ histories.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION_HISTORIES);
+ ExtensionAttribute historiesAttribute = new ExtensionAttribute();
+ historiesAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ historiesAttribute.setValue(String.valueOf(noticeConf.getNotice().getHistories().getSelected()));
+ histories.addAttribute(historiesAttribute);
+ if (StringUtils.hasText(noticeConf.getNotice().getHistories().getViewJson())) {
+ histories.setElementText(noticeConf.getNotice().getHistories().getViewJson());
+ }
+ noticeToObject.addChildElement(histories);
+ }
+
+ if (Objects.nonNull(noticeConf.getNotice().getRoles())) {
+ ExtensionElement roles = new ExtensionElement();
+ roles.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES);
+ ExtensionAttribute rolesAttribute = new ExtensionAttribute();
+ rolesAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ rolesAttribute.setValue(String.valueOf(noticeConf.getNotice().getRoles().getSelected()));
+ roles.addAttribute(rolesAttribute);
+ if (StringUtils.hasText(noticeConf.getNotice().getRoles().getViewJson())) {
+ roles.setElementText(noticeConf.getNotice().getRoles().getViewJson());
+ }
+ noticeToObject.addChildElement(roles);
+ }
+
+ if (Objects.nonNull(noticeConf.getNotice().getPositions())) {
+ ExtensionElement positions = new ExtensionElement();
+ positions.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION_POSITIONS);
+ ExtensionAttribute positionsAttribute = new ExtensionAttribute();
+ positionsAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ positionsAttribute.setValue(String.valueOf(noticeConf.getNotice().getPositions().getSelected()));
+ positions.addAttribute(positionsAttribute);
+ if (StringUtils.hasText(noticeConf.getNotice().getPositions().getViewJson())) {
+ positions.setElementText(noticeConf.getNotice().getPositions().getViewJson());
+ }
+ noticeToObject.addChildElement(positions);
+ }
+
+ if (Objects.nonNull(noticeConf.getNotice().getAssigners())) {
+ ExtensionElement assigners = new ExtensionElement();
+ assigners.setName(TEMPLATE_NOTICE_MESSAGE_DESTINATION_ASSIGNERS);
+ ExtensionAttribute assignersAttribute = new ExtensionAttribute();
+ assignersAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
+ assignersAttribute.setValue(String.valueOf(noticeConf.getNotice().getAssigners().getSelected()));
+ assigners.addAttribute(assignersAttribute);
+ if (StringUtils.hasText(noticeConf.getNotice().getAssigners().getViewJson())) {
+ assigners.setElementText(noticeConf.getNotice().getAssigners().getViewJson());
+ }
+ noticeToObject.addChildElement(assigners);
+ }
+
+ noticeMessage.addChildElement(noticeToObject);
noticeConfigElement.addChildElement(noticeMessage);
}
@@ -380,6 +539,44 @@ public final class BpmnJsonConverterUtil {
mainProcess.addExtensionElement(noticeConfigElement);
}
+ private static void setProcessApproveConfigs(BpmnApproveConf approveConf, Process mainProcess) {
+ if (Objects.isNull(approveConf)) {
+ return;
+ }
+ ExtensionElement approveConfigElement = new ExtensionElement();
+ approveConfigElement.setName(CONFIG_APPROVE);
+ mainProcess.addExtensionElement(approveConfigElement);
+
+ // 审批相关配置
+ if (Objects.nonNull(approveConf.getSupportBatchOperation())) {
+ ExtensionElement config = new ExtensionElement();
+ config.setName(APPROVE_SUPPORT_BATCH_OPERATION);
+ ExtensionAttribute configAttribute = new ExtensionAttribute();
+ configAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ configAttribute.setValue(Boolean.toString(approveConf.getSupportBatchOperation()));
+ config.addAttribute(configAttribute);
+ approveConfigElement.addChildElement(config);
+ }
+
+ if (Objects.nonNull(approveConf.getUserAgreeSignature())) {
+ ExtensionElement config = new ExtensionElement();
+ config.setName(APPROVE_USER_AGREE_SIGNATURE);
+ ExtensionAttribute configAttribute = new ExtensionAttribute();
+ configAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ configAttribute.setValue(Boolean.toString(approveConf.getUserAgreeSignature()));
+ config.addAttribute(configAttribute);
+ approveConfigElement.addChildElement(config);
+ }
+ if (Objects.nonNull(approveConf.getAutoApprovalType())) {
+ ExtensionElement config = new ExtensionElement();
+ config.setName(AUTO_APPROVAL_TYPE);
+ ExtensionAttribute configAttribute = new ExtensionAttribute();
+ configAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ configAttribute.setValue(approveConf.getAutoApprovalType().getType());
+ config.addAttribute(configAttribute);
+ approveConfigElement.addChildElement(config);
+ }
+ }
public static byte[] transformBytes(BpmnModel bpmnModel) {
return new BpmnXMLConverter().convertToXML(bpmnModel);
@@ -398,13 +595,14 @@ public final class BpmnJsonConverterUtil {
/**
* 创建对应类型节点并保存在 bpmnModel 中
*
- * @param preNodeIds 上级节点的 Id 结合,用于链接当前创建节点
- * @param bpmnJsonNode 前端传入节点数据,不是全数据,而是对应层级
- * @param mainProcess 主 Process 对象
- * @param bpmnModel 最终的 BPMN model
+ * @param preNodeIds 上级节点的 Id 结合,用于链接当前创建节点
+ * @param bpmnJsonNode 前端传入节点数据,不是全数据,而是对应层级
+ * @param mainProcess 主 Process 对象
+ * @param bpmnModel 最终的 BPMN model
+ * @param defaultConditionConnectNode 嵌套网关行为下,缓存的当前网关下的 child,如果当前层级下没有,则是上级网关的 child.
* @return 创建的节点的 ID
*/
- private static List create(BpmnJsonNode bpmnJsonNode, Process mainProcess,
+ private static List create(String formKey, BpmnJsonNode bpmnJsonNode, Process mainProcess,
BpmnModel bpmnModel, BpmnJsonNode defaultConditionConnectNode, String... preNodeIds) {
// 设置来源节点
bpmnJsonNode.setIncoming(Lists.newArrayList(preNodeIds));
@@ -412,10 +610,10 @@ public final class BpmnJsonConverterUtil {
Class extends BaseElement> clz = chooseNodeClass(bpmnJsonNode);
// 根据 BpmnJsonNode 创建节点
- FlowElement flowElement = convertJsonToElement(clz, bpmnJsonNode, mainProcess);
+ FlowElement flowElement = convertJsonToElement(clz, bpmnJsonNode, mainProcess, formKey);
mainProcess.addFlowElement(flowElement);
- connectPreNodes(bpmnJsonNode, mainProcess, preNodeIds);
+ connectPreNodes(formKey, bpmnJsonNode, mainProcess, preNodeIds);
// 只有网关才会涉及到 branch
List branchLastNodeIds = new ArrayList<>();
@@ -457,7 +655,7 @@ public final class BpmnJsonConverterUtil {
nextJsonNode.setPreJsonNode(branch);
}
SequenceFlow sequenceFlow = (SequenceFlow) convertJsonToElement(SequenceFlow.class, nextJsonNode,
- mainProcess);
+ mainProcess, formKey);
mainProcess.addFlowElement(sequenceFlow);
// 设置网关默认流
@@ -469,7 +667,7 @@ public final class BpmnJsonConverterUtil {
if (Objects.nonNull(branch.getChildren()) && StringUtils.hasLength(branch.getChildren().getId())
&& !Objects.equals(NODE_EMPTY, branch.getChildren().getType())) {
- branchLastNodeIds.addAll(create(branch.getChildren(), mainProcess, bpmnModel,
+ branchLastNodeIds.addAll(create(formKey, branch.getChildren(), mainProcess, bpmnModel,
Objects.isNull(defaultConditionConnectNode) ? bpmnJsonNode.getChildren() : defaultConditionConnectNode));
}
@@ -493,25 +691,29 @@ public final class BpmnJsonConverterUtil {
children = children.getChildren();
}
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
- return create(children, mainProcess, bpmnModel, defaultConditionConnectNode, flowElement.getId());
+ //网关分支条件连接到下一节点,children节点不再连接前继网关节点
+ if (bpmnJsonNode.getType() == NODE_EXCLUSIVE_GATEWAY) {
+ return create(formKey, children, mainProcess, bpmnModel, defaultConditionConnectNode);
+ }
+ return create(formKey, children, mainProcess, bpmnModel, defaultConditionConnectNode, flowElement.getId());
}
- return create(children, mainProcess, bpmnModel, defaultConditionConnectNode, branchLastNodeIds.toArray(new String[0]));
+ return create(formKey, children, mainProcess, bpmnModel, defaultConditionConnectNode, branchLastNodeIds.toArray(new String[0]));
}
}
- private static void connectPreNodes(BpmnJsonNode bpmnJsonNode, Process mainProcess, String[] preNodeIds) {
+ private static void connectPreNodes(String formKey, BpmnJsonNode bpmnJsonNode, Process mainProcess, String[] preNodeIds) {
// 连接当前节点与前一个节点
if (Lists.newArrayList(preNodeIds).isEmpty()) {
// first time entrance, do nothing.
} else if (Lists.newArrayList(preNodeIds).size() == 1 && !NODE_CONDITION.equals(bpmnJsonNode.getType())) {
bpmnJsonNode.setPreJsonNode(null);
- mainProcess.addFlowElement(convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess));
+ mainProcess.addFlowElement(convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess, formKey));
} else {
// 将网关分支的最末级节点 ID 关联到网关的 children 节点上,网关协议转换才算闭环
Arrays.stream(preNodeIds).forEach(income -> {
bpmnJsonNode.setIncoming(Lists.newArrayList(income));
bpmnJsonNode.setPreJsonNode(null);
- FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess);
+ FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess, formKey);
mainProcess.addFlowElement(sequenceFlow);
});
}
@@ -544,6 +746,10 @@ public final class BpmnJsonConverterUtil {
clz = UserTask.class;
}
break;
+ case NODE_SIGN:
+ // 签署确认节点
+ clz = UserTask.class;
+ break;
case NODE_TRIGGER:
// 这个类型目前暂不支持
case NODE_CARBON_COPY:
@@ -557,14 +763,14 @@ public final class BpmnJsonConverterUtil {
return clz;
}
- private static FlowElement convertJsonToElement(Class extends BaseElement> clz, Process process) {
- return convertJsonToElement(clz, null, process);
+ private static FlowElement convertJsonToElement(Class extends BaseElement> clz, Process process, String formKey) {
+ return convertJsonToElement(clz, null, process, formKey);
}
private static FlowElement convertJsonToElement(Class extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
- Process process) {
+ Process process, String formKey) {
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
- FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process);
+ FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
if (Objects.nonNull(bpmnJsonNode)) {
converter.addNodeTypeAttribute(flowElement, copy(bpmnJsonNode));
converter.addJsonValueAttribute(flowElement, copy(bpmnJsonNode));
@@ -606,13 +812,20 @@ public final class BpmnJsonConverterUtil {
String content = new String(bytes, StandardCharsets.UTF_8);
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
- BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), "id", "测试", "remark",
+ BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.SIGN, "id", "测试", "test-form", "remark",
+ model.getJsonModel().getApproveConf(),
+ model.getJsonModel().getSignConf(),
model.getJsonModel().getNoticeConf(),
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
"1.3.1-SNAPSHOT");
- convertToJson(bpmnModel);
+ getNoticeConfig(bpmnModel.getMainProcess());
+ getSignConfig(bpmnModel.getMainProcess());
+ BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
+ FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
+ Optional upgradeApprovalConf = getUpgradeApprovalConf(flowElement);
+// Optional signApproverLimit = getSignApproverLimit(flowElement);
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
// Optional> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
// (serviceTask);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
index 4667efaf3..9a6cc1f19 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
@@ -4,8 +4,14 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
+import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.enums.BpmnSignType;
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
+import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
+import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
+import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
@@ -14,8 +20,19 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldOptionConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeProperty;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeReceiver;
import cn.axzo.workflow.common.model.request.bpmn.BpmnPendingProperty;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignPendingProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSmsProperty;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
+import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Table;
+import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.ExtensionElement;
import org.flowable.bpmn.model.FlowElement;
@@ -34,8 +51,15 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.Random;
+import java.util.stream.Collectors;
+import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_SUPPORT_BATCH_OPERATION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_USER_AGREE_SIGNATURE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVAL_METHOD;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
@@ -52,21 +76,42 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DISABLED;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_KEY;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_NAME;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORDER;
+import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORG_LIMIT;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.SUPPORT_BATCH_OPERATION_DEFAULT_VALUE;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
-import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_CONFIG;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ASSIGNERS;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_HISTORIES;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_INITIATOR;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_POSITIONS;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_EVENTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SIGN_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_CONF;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.USER_AGREE_SIGNATURE_DEFAULT_VALUE;
/**
* 协助解析 BPMN 文件中的自定义扩展字段和属性
@@ -82,6 +127,66 @@ public final class BpmnMetaParserHelper {
return Optional.ofNullable(process.getAttributeValue(null, FLOW_SERVER_VERSION));
}
+ public static Optional getProcessApproveConf(Process process) {
+ List elements = process.getExtensionElements().getOrDefault(CONFIG_APPROVE, Collections.emptyList());
+ BpmnApproveConf conf = new BpmnApproveConf();
+ if (CollectionUtils.isEmpty(elements)) {
+ conf.setUserAgreeSignature(USER_AGREE_SIGNATURE_DEFAULT_VALUE);
+ conf.setSupportBatchOperation(SUPPORT_BATCH_OPERATION_DEFAULT_VALUE);
+ conf.setAutoApprovalType(AutoApprovalTypeEnum.NO_AUTO_APPROVAL);
+ } else {
+ elements.get(0).getChildElements().forEach((k, v) -> {
+ if (APPROVE_SUPPORT_BATCH_OPERATION.equals(k)) {
+ String value = v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE);
+ conf.setSupportBatchOperation(Boolean.valueOf(value));
+ } else if (APPROVE_USER_AGREE_SIGNATURE.equals(k)) {
+ String value = v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE);
+ conf.setUserAgreeSignature(Boolean.valueOf(value));
+ } else if (AUTO_APPROVAL_TYPE.equals(k)) {
+ String value = v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE);
+ AutoApprovalTypeEnum typeEnum = AutoApprovalTypeEnum.fromType(value);
+ conf.setAutoApprovalType(typeEnum == null ? AutoApprovalTypeEnum.NO_AUTO_APPROVAL : typeEnum);
+ }
+ });
+ }
+ return Optional.of(conf);
+ }
+
+ public static Optional getSignConfig(Process process) {
+ List elements = process.getExtensionElements().getOrDefault(CONFIG_SIGN, Collections.emptyList());
+ if (CollectionUtils.isEmpty(elements)) {
+ return Optional.empty();
+ }
+ BpmnSignConf conf = new BpmnSignConf();
+ elements.get(0).getChildElements().forEach((k, v) -> {
+ if (CONFIG_SIGN_TYPE.equals(k)) {
+ conf.setSignType(BpmnSignType.valueOfType(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_TYPE)));
+ } else if (TEMPLATE_SIGN_PENDING_MESSAGE_ID.equals(k)) {
+ BpmnSignPendingProperty sign = new BpmnSignPendingProperty();
+ sign.setPendingMessageId(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE));
+ sign.setViewJson(v.get(0).getElementText());
+ conf.setSignPendingProperty(sign);
+ }
+ });
+ return Optional.of(conf);
+ }
+
+ public static Optional getSignApproverLimit(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getSignApproverLimit((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
+ public static Optional getSignApproverLimit(UserTask userTask) {
+ return defaultValid(userTask, CONFIG_SIGN_APPROVER_LIMIT).map(element -> {
+ BpmnSignApproverLimit signApproverLimit = new BpmnSignApproverLimit();
+ signApproverLimit.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(CONFIG_SIGN_APPROVER_ORG_LIMIT).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
+ signApproverLimit.setRoleLimit(SignApproverRoleLimitEnum.valueOfType(element.getChildElements().get(CONFIG_SIGN_APPROVER_ROLE_LIMIT).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
+ return signApproverLimit;
+ });
+ }
+
/**
* 获取流程模型全局兜底的消息模板相关配置
*
@@ -96,10 +201,50 @@ public final class BpmnMetaParserHelper {
}
BpmnNoticeConf conf = new BpmnNoticeConf();
elements.get(0).getChildElements().forEach((k, v) -> {
- if (TEMPLATE_NOTICE_MESSAGE_ID.equals(k)) {
+ if (TEMPLATE_NOTICE_MESSAGE_CONFIG.equals(k)) {
BpmnNoticeProperty notice = new BpmnNoticeProperty();
- notice.setNoticeMessageId(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE));
- notice.setViewJson(v.get(0).getElementText());
+ notice.setSendMessage(Boolean.valueOf(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+
+ String events = v.get(0).getChildElements().getOrDefault(TEMPLATE_NOTICE_MESSAGE_EVENTS, Collections.emptyList())
+ .get(0).getElementText();
+ List resultEnums = JSON.parseArray(events, BpmnProcessInstanceResultEnum.class);
+ //触发时机为Null,设置为空列表
+ notice.setTriggerEvents(resultEnums == null ? Collections.emptyList() : resultEnums);
+
+ v.get(0).getChildElements().getOrDefault(TEMPLATE_NOTICE_MESSAGE_DESTINATION, Collections.emptyList()).get(0).getChildElements()
+ .forEach((a, b) -> {
+ if (Objects.equals(a, TEMPLATE_NOTICE_MESSAGE_DESTINATION_INITIATOR)) {
+ BpmnNoticeReceiver initiator = new BpmnNoticeReceiver();
+ initiator.setSelected(Boolean.valueOf(b.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+ initiator.setViewJson(b.get(0).getElementText());
+ notice.setInitiator(initiator);
+ }
+ if (Objects.equals(a, TEMPLATE_NOTICE_MESSAGE_DESTINATION_HISTORIES)) {
+ BpmnNoticeReceiver histories = new BpmnNoticeReceiver();
+ histories.setSelected(Boolean.valueOf(b.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+ histories.setViewJson(b.get(0).getElementText());
+ notice.setHistories(histories);
+ }
+ if (Objects.equals(a, TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES)) {
+ BpmnNoticeReceiver roles = new BpmnNoticeReceiver();
+ roles.setSelected(Boolean.valueOf(b.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+ roles.setViewJson(b.get(0).getElementText());
+ notice.setRoles(roles);
+ }
+ if (Objects.equals(a, TEMPLATE_NOTICE_MESSAGE_DESTINATION_POSITIONS)) {
+ BpmnNoticeReceiver positions = new BpmnNoticeReceiver();
+ positions.setSelected(Boolean.valueOf(b.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+ positions.setViewJson(b.get(0).getElementText());
+ notice.setPositions(positions);
+ }
+ if (Objects.equals(a, TEMPLATE_NOTICE_MESSAGE_DESTINATION_ASSIGNERS)) {
+ BpmnNoticeReceiver assigners = new BpmnNoticeReceiver();
+ assigners.setSelected(Boolean.valueOf(b.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
+ assigners.setViewJson(b.get(0).getElementText());
+ notice.setAssigners(assigners);
+ }
+ });
+
conf.setNotice(notice);
} else if (TEMPLATE_CARBON_COPY_MESSAGE_ID.equals(k)) {
BpmnCarbonCopyProperty carbonCopy = new BpmnCarbonCopyProperty();
@@ -229,7 +374,10 @@ public final class BpmnMetaParserHelper {
buttonMetaInfo.setBtnKey(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_KEY));
buttonMetaInfo.setBtnName(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_NAME));
buttonMetaInfo.setChecked(Boolean.valueOf(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED)));
- buttonMetaInfo.setOrder(Integer.valueOf(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_ORDER)));
+ buttonMetaInfo.setType(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_TYPE));
+ //如果order不是字符类型或者为空,设置默认值0
+ String order = i.getAttributeValue(null, ELEMENT_ATTRIBUTE_ORDER);
+ buttonMetaInfo.setOrder(org.apache.commons.lang3.StringUtils.isNumeric(order) ? Integer.parseInt(order) : 0);
buttonMetaInfo.setDisabled(Boolean.valueOf(i.getAttributeValue(null, ELEMENT_ATTRIBUTE_DISABLED)));
buttonMetaInfos.add(buttonMetaInfo);
});
@@ -265,6 +413,9 @@ public final class BpmnMetaParserHelper {
}
public static Optional getNodeType(FlowElement flowElement) {
+ if (flowElement == null) {
+ return Optional.empty();
+ }
if (flowElement instanceof UserTask || flowElement instanceof ServiceTask || flowElement instanceof ReceiveTask) {
return defaultValid(flowElement, CONFIG_NODE_TYPE).map(element -> BpmnFlowNodeType.valueOf(element.getElementText()));
}
@@ -275,18 +426,46 @@ public final class BpmnMetaParserHelper {
return defaultValid(flowElement, CONFIG_APPROVAL_METHOD).map(element -> ApprovalMethodEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverScope(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverScope((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverScope(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SCOPE).map(element -> ApproverScopeEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverSpecify(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverSpecify((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverSpecify(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverSpecifyValue(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverSpecifyValue((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverSpecifyValue(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
}
+ public static Optional getApproverEmptyHandleType(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverEmptyHandleType((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverEmptyHandleType(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_EMPTY_HANDLE_TYPE).map(element -> ApproverEmptyHandleTypeEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
@@ -295,6 +474,17 @@ public final class BpmnMetaParserHelper {
return defaultValid(userTask, CONFIG_APPROVER_EMPTY_HANDLE_TYPE).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
}
+ public static Boolean getActivitySignature(FlowElement flowElement) {
+ return defaultValid(flowElement, CONFIG_ACTIVITY_SIGNATURE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))).orElse(false);
+ }
+
+ public static Boolean getSupportInitiatorSpecified(FlowElement flowElement) {
+ ApprovalMethodEnum approvalMethodEnum = getApprovalMethod(flowElement).orElse(null);
+ ApproverSpecifyEnum specifyEnum = getApproverSpecify(flowElement).orElse(null);
+ return Objects.nonNull(specifyEnum)
+ && Objects.equals(approvalMethodEnum, ApprovalMethodEnum.human)
+ && Objects.equals(specifyEnum, ApproverSpecifyEnum.initiatorSpecified);
+ }
private static Optional defaultValid(FlowElement flowElement, String elementName) {
if (Objects.isNull(flowElement)) {
@@ -334,4 +524,115 @@ public final class BpmnMetaParserHelper {
}
return Optional.empty();
}
+
+ public static Optional> getFormFieldPermissionConf(FlowElement flowElement) {
+ return defaultValid(flowElement, CONFIG_FIELD_PERMISSION).map(element -> JSON.parseObject(element.getElementText(), new TypeReference>() {
+ }.getType()));
+ }
+
+ public static Optional> getFormFieldPermissionForCalc(FlowElement flowElement) {
+ List fieldMetaInfos = getFormFieldPermissionConf(flowElement).orElse(new ArrayList<>());
+ return getFormFieldPermissionForModel(fieldMetaInfos);
+ }
+
+ public static Optional> getFormFieldPermissionForModel(List fieldMetaInfos) {
+ if (CollectionUtils.isEmpty(fieldMetaInfos)) {
+ return Optional.empty();
+ }
+ ImmutableTable result = fieldMetaInfos.stream()
+ .collect(ImmutableTable.toImmutableTable(FormPermissionMetaInfo::getFieldId,
+ FormPermissionMetaInfo::getFieldName,
+ FormPermissionMetaInfo::toBinary));
+ return Optional.of(result);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static List mergeAllPermission(List... permissions) {
+ if (permissions.length == 0) {
+ return Collections.emptyList();
+ }
+ if (permissions.length == 1) {
+ return permissions[0];
+ }
+ List> combinedTable = new ArrayList<>();
+ for (List permission : permissions) {
+ combinedTable.add(getFormFieldPermissionForModel(permission).orElse(ImmutableTable.of()));
+ }
+
+ ImmutableTable> resultTable = combinedTable.stream()
+ .flatMap(table -> table.cellSet().stream())
+ .collect(Collectors.collectingAndThen(Collectors.groupingBy(Table.Cell::getRowKey, Collectors.groupingBy(Table.Cell::getColumnKey, Collectors.mapping(Table.Cell::getValue, Collectors.toList()))), rowMap -> {
+ ImmutableTable.Builder> builder = ImmutableTable.builder();
+ rowMap.forEach((rowKey, colMap) -> colMap.forEach((colKey, values) -> builder.put(rowKey, colKey, values)));
+ return builder.build();
+ }));
+
+ List permissionResult = new ArrayList<>();
+ for (Table.Cell> cell : resultTable.cellSet()) {
+ int[] array = ListUtils.emptyIfNull(cell.getValue()).stream().mapToInt(Integer::intValue).toArray();
+ int result = performBitwiseOr(array);
+ permissionResult.add(FormPermissionMetaInfo.fromBinary(cell.getRowKey(), cell.getColumnKey(), result));
+ }
+ return permissionResult;
+ }
+
+ public static Optional getUpgradeApprovalConf(FlowElement flowElement) {
+ if (Objects.isNull(flowElement) || !(flowElement instanceof UserTask)) {
+ return Optional.empty();
+ }
+ return getUpgradeApprovalConf((UserTask) flowElement);
+ }
+
+ public static Optional getUpgradeApprovalConf(UserTask userTask) {
+ return defaultValid(userTask, TEMPLATE_UPGRADE_APPROVAL_CONF).map(element -> {
+ BpmnUpgradeApprovalConf conf = new BpmnUpgradeApprovalConf();
+ Boolean enabled = Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED));
+ conf.setEnabled(enabled);
+ if(Objects.equals(Boolean.TRUE, enabled)) {
+ conf.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_ORG_LIMIT)));
+ conf.setApproverSpecify(ApproverSpecifyEnum.valueOf(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_APPROVER_SPECIFY)));
+ conf.setSpecifyValue(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE).get(0).getElementText());
+ }
+ return conf;
+ });
+ }
+
+ private static int performBitwiseOr(int... numbers) {
+ int result = 0;
+ for (int num : numbers) {
+ result |= num;
+ }
+ return result;
+ }
+
+ // just for testing
+ private static List genericConf(int num) {
+ List fields = new ArrayList<>();
+ Random random = new Random();
+ for (int i = 0; i < num; i++) {
+ String fieldId = "field_" + i;
+ FormPermissionMetaInfo metaInfo = FormPermissionMetaInfo
+ .builder()
+ .fieldId(fieldId)
+ .fieldName(fieldId + "Name")
+ .editable(random.nextBoolean())
+ .required(random.nextBoolean())
+ .readonly(random.nextBoolean())
+ .hidden(random.nextBoolean())
+ .build();
+ fields.add(metaInfo);
+ }
+ return fields;
+ }
+
+ public static void main(String[] args) {
+ List conf1 = genericConf(5);
+ conf1.forEach(e -> System.out.println("conf1 ---> e.fieldId = " + e.getFieldId() + " ,e.getFieldName() = " + e.getFieldName() + " ,e.toBinary() = " + e.toBinary() + " ,e.toBinaryString() = " + e.toBinaryString()));
+ List conf2 = genericConf(5);
+ conf2.forEach(e -> System.out.println("conf2 ---> e.fieldId = " + e.getFieldId() + " ,e.getFieldName() = " + e.getFieldName() + " ,e.toBinary() = " + e.toBinary() + " ,e.toBinaryString() = " + e.toBinaryString()));
+
+ List result = mergeAllPermission(conf1, conf2);
+ result.forEach(e -> System.out.println("result ---> e.fieldId = " + e.getFieldId() + " ,e.getFieldName() = " + e.getFieldName() + " ,e.toBinary() = " + e.toBinary() + " ,e.toBinaryString() = " + e.toBinaryString()));
+ }
+
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnModelUtils.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnModelUtils.java
new file mode 100644
index 000000000..80ace39f9
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnModelUtils.java
@@ -0,0 +1,91 @@
+package cn.axzo.workflow.core.common.utils;
+
+import org.flowable.bpmn.model.EventSubProcess;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.FlowElementsContainer;
+import org.flowable.bpmn.model.FlowNode;
+import org.flowable.bpmn.model.SequenceFlow;
+import org.flowable.bpmn.model.StartEvent;
+import org.flowable.bpmn.model.SubProcess;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class BpmnModelUtils {
+
+ /**
+ * 节点是否可达
+ * @param process
+ * @param sourceElement
+ * @param targetElement
+ * @return
+ */
+ public static boolean isReachable(org.flowable.bpmn.model.Process process, FlowNode sourceElement, FlowNode targetElement) {
+ return isReachable(process, sourceElement, targetElement, new HashSet<>());
+ }
+
+ public static boolean isReachable(org.flowable.bpmn.model.Process process, FlowNode sourceElement, FlowNode targetElement, Set visitedElements) {
+ // Special case: start events in an event subprocess might exist as an execution and are most likely be able to
+ // reach the target
+ // when the target is in the event subprocess, but should be ignored as they are not 'real' runtime executions
+ // (but rather waiting for trigger)
+ if (sourceElement instanceof StartEvent && isInEventSubprocess(sourceElement)) {
+ return false;
+ }
+ // No outgoing seq flow: could be the end of eg . the process or an embedded subprocess
+ if (sourceElement.getOutgoingFlows().isEmpty()) {
+ visitedElements.add(sourceElement.getId());
+ FlowElementsContainer parentElement = process.findParent(sourceElement);
+ if (parentElement instanceof SubProcess) {
+ sourceElement = (SubProcess) parentElement;
+ // 子流程的结束节点,若目标节点在该子流程中,说明无法到达,返回false
+ if (((SubProcess) sourceElement).getFlowElement(targetElement.getId()) != null) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ if (sourceElement.getId().equals(targetElement.getId())) {
+ return true;
+ }
+ // To avoid infinite looping, we must capture every node we visit
+ // and check before going further in the graph if we have already
+ // visited the node.
+ visitedElements.add(sourceElement.getId());
+ // 当前节点能够到达子流程,且目标节点在子流程中,说明可以到达,返回true
+ if (sourceElement instanceof SubProcess && ((SubProcess) sourceElement).getFlowElement(targetElement.getId()) != null) {
+ return true;
+ }
+ List sequenceFlows = sourceElement.getOutgoingFlows();
+ if (sequenceFlows != null && !sequenceFlows.isEmpty()) {
+ for (SequenceFlow sequenceFlow : sequenceFlows) {
+ String targetRef = sequenceFlow.getTargetRef();
+ FlowNode sequenceFlowTarget = (FlowNode) process.getFlowElement(targetRef, true);
+ if (sequenceFlowTarget != null && !visitedElements.contains(sequenceFlowTarget.getId())) {
+ boolean reachable = isReachable(process, sequenceFlowTarget, targetElement, visitedElements);
+ if (reachable) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ protected static boolean isInEventSubprocess(FlowNode flowNode) {
+ FlowElementsContainer flowElementsContainer = flowNode.getParentContainer();
+ while (flowElementsContainer != null) {
+ if (flowElementsContainer instanceof EventSubProcess) {
+ return true;
+ }
+ if (flowElementsContainer instanceof FlowElement) {
+ flowElementsContainer = ((FlowElement) flowElementsContainer).getParentContainer();
+ } else {
+ flowElementsContainer = null;
+ }
+ }
+ return false;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java
new file mode 100644
index 000000000..26d2bc007
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java
@@ -0,0 +1,90 @@
+package cn.axzo.workflow.core.common.utils;
+
+import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
+import cn.axzo.workflow.common.util.ExpressionUtil;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.ListUtils;
+import org.flowable.form.api.FormModel;
+import org.flowable.form.model.FormField;
+import org.flowable.form.model.SimpleFormModel;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_DEFAULT_VALUE;
+import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_EDITABLE;
+import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_HIDDEN;
+import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_READONLY;
+import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_REQUIRED;
+
+/**
+ * 表单处理帮助类
+ *
+ * @author wangli
+ * @since 2024-11-29 15:57
+ */
+public class FormHelper {
+ private FormHelper() {
+ }
+
+ /**
+ * 填充表单模型数据
+ *
+ * @param formModel
+ * @param fieldPermission
+ * @param variables
+ * @param showOriginDefaultValue
+ * @return
+ */
+ public static FormModel populateFormModel(SimpleFormModel formModel,
+ List fieldPermission,
+ Map variables,
+ boolean showOriginDefaultValue) {
+ if (Objects.isNull(formModel)) {
+ return null;
+ }
+ Map fieldMap = ListUtils.emptyIfNull(fieldPermission).stream()
+ .collect(Collectors.toMap(FormPermissionMetaInfo::getFieldId, Function.identity(), (s, t) -> s));
+
+ formModel.allFieldsAsMap().forEach((fieldId, formField) -> {
+ Map oldParams = CollectionUtils.isEmpty(formField.getParams()) ? new HashMap<>() : formField.getParams();
+ FormPermissionMetaInfo defaultPermission = fieldMap.getOrDefault(fieldId, new FormPermissionMetaInfo());
+ oldParams.put(FIELD_PROPERTY_REQUIRED, defaultPermission.getRequired());
+ oldParams.put(FIELD_PROPERTY_EDITABLE, defaultPermission.getEditable());
+ oldParams.put(FIELD_PROPERTY_READONLY, defaultPermission.getReadonly());
+ oldParams.put(FIELD_PROPERTY_HIDDEN, defaultPermission.getHidden());
+ if (oldParams.containsKey(FIELD_PROPERTY_DEFAULT_VALUE)) {
+ String defaultValue = oldParams.getOrDefault(FIELD_PROPERTY_DEFAULT_VALUE, "").toString();
+ if (!showOriginDefaultValue) {
+ defaultValue = ExpressionUtil.parseString(String.valueOf(oldParams.get(FIELD_PROPERTY_DEFAULT_VALUE)),
+ CollectionUtils.isEmpty(variables) ? new HashMap<>() : variables);
+ }
+ oldParams.put(FIELD_PROPERTY_DEFAULT_VALUE, defaultValue);
+ if (injectDefaultValue(formField) && StringUtils.hasText(defaultValue)) {
+ formField.setValue(defaultValue);
+ }
+ }
+ formField.setParams(oldParams);
+ });
+ return formModel;
+ }
+
+ private static boolean injectDefaultValue(FormField field) {
+ if (Objects.isNull(field.getValue())) {
+ return true;
+ }
+
+ if (field.getValue() instanceof String && Objects.equals("", field.getValue())) {
+ return false;
+ }
+
+ return !(field.getValue() instanceof Collection) || CollectionUtils.isEmpty((Collection>) field.getValue());
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/RpcInternalUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/RpcInternalUtil.java
deleted file mode 100644
index 548b96e1c..000000000
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/RpcInternalUtil.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package cn.axzo.workflow.core.common.utils;
-
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-import cn.axzo.basics.common.util.AssertUtil;
-import cn.axzo.framework.domain.ServiceException;
-import cn.axzo.framework.domain.web.BizException;
-import cn.axzo.framework.domain.web.result.ApiPageResult;
-import cn.axzo.framework.domain.web.result.ApiResult;
-import cn.azxo.framework.common.model.CommonResponse;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.http.HttpStatus;
-import cn.hutool.json.JSONUtil;
-import lombok.extern.slf4j.Slf4j;
-
-import static cn.axzo.framework.domain.web.code.BaseCode.BAD_REQUEST;
-
-/**
- * 内部api 使用 服务与 yoke 下游服务 下游服务统一使用 ApiResult
- * @author tanjie@axzo.cn
- * @date 2022/5/23 11:08
- */
-@Slf4j
-public class RpcInternalUtil {
-
- /**
- * 常用的RPC请求返回值解析,如果 被请求方 返回非200会抛出异常
- */
- public static ApiResult rpcProcessor(Supplier> supplier, String operationType, Object... param) {
-
- return rpcProcessorMayThrow(supplier, operationType, (msg) -> {
- throw new ServiceException(msg);
- }, param);
- }
-
- public static ApiResult rpcProcessorMayThrow(Supplier> supplier, String operationType, Consumer throwConsumer, Object... param) {
- AssertUtil.notNull(throwConsumer, "自定义的异常处理不可为空");
- log.info(operationType + "-Param: " + JSONUtil.toJsonStr(param));
- ApiResult result = null;
-
- try {
- result = supplier.get();
- } catch (Throwable e) {
- log.warn("rpc process error:{}", e.getMessage());
- throwConsumer.accept("服务调用异常");
- }
-
- log.info(operationType + "-Result: " + JSONUtil.toJsonStr(result));
- Assert.notNull(result, "服务调用异常");
- // 200自定义处理
- if (HttpStatus.HTTP_OK != result.getCode()) {
- throwConsumer.accept(result.getMsg());
- }
- return result;
- }
-
- /**
- * 常用的RPC请求返回值解析,如果 被请求方 返回非200会抛出异常
- */
- public static ApiPageResult rpcPageProcessor(Supplier> supplier, String operationType, Object... param) {
-
- return rpcPageProcessorMayThrow(supplier, operationType, (msg) -> {
- throw new ServiceException(msg);
- }, param);
- }
-
- public static ApiPageResult rpcPageProcessorMayThrow(Supplier> supplier, String operationType, Consumer throwConsumer, Object... param) {
- AssertUtil.notNull(throwConsumer, "自定义的异常处理不可为空");
- log.info(operationType + "-Param: " + JSONUtil.toJsonStr(param));
- ApiPageResult result = null;
- try {
- result = supplier.get();
- } catch (Throwable t) {
- log.warn("rpc process error:{}", t.getMessage());
- throwConsumer.accept("服务调用异常");
- }
- log.info(operationType + "-Result: " + JSONUtil.toJsonStr(result));
- Assert.notNull(result, "服务调用异常");
- // 200自定义处理
- if (HttpStatus.HTTP_OK != result.getCode()) {
- throwConsumer.accept(result.getMsg());
- }
- return result;
- }
-
- public static T checkAndGetData(ApiResult result) {
- if (result.isError()) {
- throw new BizException(result.getRespCode(), result.getMsg());
- }
- T data = result.getData();
- if (data == null) {
- throw new BizException(BAD_REQUEST, "数据不存在");
- }
- return data;
- }
-
- public static CommonResponse commonRpcProcessor(Supplier> supplier, String operationType, Object... param) {
-
- return commonRpcProcessorMayThrow(supplier, operationType, (msg) -> {
- throw new ServiceException(msg);
- }, param);
- }
-
- public static CommonResponse commonRpcProcessorMayThrow(Supplier