Merge branch 'master-bak'

This commit is contained in:
wangli 2025-08-21 11:11:38 +08:00
commit 885d112cb4
700 changed files with 42654 additions and 5525 deletions

5
.gitignore vendored
View File

@ -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
.flattened-pom.xml
.DS_Store

View File

@ -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

96
pom.xml
View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@ -12,12 +13,13 @@
<artifactId>workflow-engine</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<name>workflow-engine</name>
<name>Workflow Engine</name>
<properties>
<revision>1.3.2-SNAPSHOT</revision>
<revision>1.5.3-SNAPSHOT</revision>
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
<axzo-dependencies.org.version>1.0.0-SNAPSHOT</axzo-dependencies.org.version>
<feign-httpclient.version>11.8</feign-httpclient.version>
<lombok.version>1.18.22</lombok.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
@ -25,6 +27,10 @@
<dingtalk.version>2.0.0</dingtalk.version>
<arthas.version>3.7.1</arthas.version>
<apache-maven.version>3.2.5</apache-maven.version>
<javaparse.version>3.26.0</javaparse.version>
<elasticsearch.version>7.10.2</elasticsearch.version>
<easy-es.version>2.0.0</easy-es.version>
<xxl-job.version>2.5.0</xxl-job.version>
</properties>
<dependencyManagement>
@ -43,6 +49,12 @@
<version>${axzo-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
<exclusion>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
@ -54,21 +66,41 @@
<artifactId>workflow-engine-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.workflow</groupId>
<artifactId>workflow-engine-axzo-ext</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>workflow-engine-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>workflow-engine-form</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>workflow-engine-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>workflow-engine-elasticsearch</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>workflow-engine-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.workflow</groupId>
<artifactId>workflow-engine-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.maokai</groupId>
<artifactId>maokai-api</artifactId>
@ -99,6 +131,53 @@
<artifactId>maven-artifact</artifactId>
<version>${apache-maven.version}</version>
</dependency>
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>${javaparse.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>${easy-es.version}</version>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-annotation</artifactId>
<version>${easy-es.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo</groupId>
<artifactId>riven-api</artifactId>
<version>${axzo-dependencies.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.org</groupId>
<artifactId>org-api</artifactId>
<version>${axzo-dependencies.org.version}</version>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${xxl-job.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.nanopart</groupId>
<artifactId>doc-api</artifactId>
<version>${axzo-dependencies.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -120,6 +199,11 @@
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring.boot.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
@ -135,9 +219,13 @@
</repositories>
<modules>
<module>workflow-engine-api</module>
<module>workflow-engine-axzo-ext</module>
<module>workflow-engine-common</module>
<module>workflow-engine-form</module>
<module>workflow-engine-core</module>
<module>workflow-engine-elasticsearch</module>
<module>workflow-engine-server</module>
<module>workflow-engine-support</module>
<module>workflow-engine-spring-boot-starter</module>
</modules>
</project>

View File

@ -11,7 +11,7 @@
<artifactId>workflow-engine-api</artifactId>
<packaging>jar</packaging>
<name>workflow-engine-api</name>
<name>Workflow Engine Api</name>
<dependencies>
<dependency>

View File

@ -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 {
}

View File

@ -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();
}
}

View File

@ -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("<parent>.*<version>(\\S+)</version>.*</parent>",
Pattern.DOTALL);
@Bean
@Bean("serviceVersion")
public String serviceVersion() {
Map<String, String> 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<String, String> 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<String, String> 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());
}

View File

@ -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

View File

@ -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)} 接口
* <p>
* 当模型中使用了业务节点且设置了不设置审批人模式则当业务监听到 PROCESS_ACTIVITY_START 事件时可通过该接口推动流程继续运行
*/
@Deprecated
@GetMapping("/api/process/activity/trigger")
@InvokeMode(SYNC)
CommonResponse<Boolean> trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
/**
* 业务节点设置审批人
* 业务节点唤醒
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/trigger")
CommonResponse<Boolean> trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
/**
* 业务节点设置审批人, 不支持重复设置
* <p>
* 当模型中使用了业务节点且设置了业务指定审批人模式则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时可通过该接口设置动态设置审批人
* <p>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动中止</strong>
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/assignee/set")
@Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
CommonResponse<Boolean> setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
/**
* 该功能应该利用引擎的 TimerBoundaryEvent 来实现但为了简便先利用引擎的任务调度来实现
*
* @return
*/
@PostMapping("/api/process/activity/timeout/trigger")
@Manageable
@Operation(summary = "设置指定业务节点定时继续往下执行")
CommonResponse<Boolean> setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
/**
* 为指定业务节点设置定时回调
*
* @return
*/
@Manageable
@PostMapping("/api/process/activity/timeout/callback")
@Operation(summary = "设置指定业务节点定时回调")
CommonResponse<Boolean> setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
}

View File

@ -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<BpmPageResult<BpmnProcessDefinitionVO>> getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto);
/**
@ -39,6 +47,7 @@ public interface ProcessDefinitionApi {
* @return
*/
@PutMapping("/api/process/definition/update")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto);
/**
@ -48,6 +57,7 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/get")
@InvokeMode(SYNC)
CommonResponse<BpmnProcessDefinitionVO> getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId);
/**
@ -57,6 +67,7 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/getByDeploymentId")
@InvokeMode(SYNC)
CommonResponse<BpmnProcessDefinitionVO> getProcessDefinitionByDeploymentId(
@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId);
@ -68,7 +79,9 @@ public interface ProcessDefinitionApi {
* @return 流程定义
*/
@GetMapping("/api/process/definition/active/getByKey")
CommonResponse<BpmnProcessDefinitionVO> getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key);
@InvokeMode(SYNC)
CommonResponse<BpmnProcessDefinitionVO> 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<Boolean> 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<String> 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<BpmnModelUpdateDTO> 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<Void> delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId,
@RequestParam(required = false) Boolean cascade);
}

View File

@ -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<BpmPageResult<BpmnProcessInstanceAdminPageItemVO>> getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
/**
* 我发起的审批列表
*/
@PostMapping("/api/process/instance/page/my")
CommonResponse<BpmPageResult<BpmnProcessInstancePageItemVO>> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
@Operation(summary = "创建审批流程前,返回模型节点列表以及节点能否设置审批人")
@PostMapping("/api/process/instance/create/before")
@InvokeMode(SYNC)
CommonResponse<List<NodesByModelVO>> 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<String> createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto);
/**
* 创建审批流程并带上表单
*
* @param dto
* @return
*/
@PostMapping("/api/process/instance/form/create")
CommonResponse<String> createProcessInstanceWith(@Validated @RequestBody BpmnProcessInstanceCreateWithFormDTO dto);
/**
* 发起人主动撤回审核
*
@ -88,25 +101,43 @@ 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<Boolean> cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
@DeleteMapping("/api/process/instance/super/cancel")
@Manageable
CommonResponse<Boolean> superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
/**
* 中止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "中止流程实例")
@DeleteMapping("/api/process/instance/abort")
CommonResponse<Boolean> abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
* 抄送流程实例
* 批量中止流程实例
*
* @param dtos
* @return
*/
@Operation(summary = "批量中止流程实例")
@DeleteMapping("/api/process/instance/batch/abort")
CommonResponse<BatchOperationResultVO> batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);
/**
* 抄送流程实例未实现
*
* @param dto
* @return
*/
@Operation(summary = "抄送流程实例")
@PostMapping("/api/process/instance/carbon-copy")
@Deprecated
CommonResponse<Boolean> carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
/**
@ -115,9 +146,44 @@ public interface ProcessInstanceApi {
* @param dto {@link BpmnProcessInstanceQueryDTO} 可根据 Id,BusinessKey进行查询
* @return 流程实例, 租户Id不必传
*/
@Operation(summary = "获得流程实例")
@GetMapping("/api/process/instance/get")
@InvokeMode(SYNC)
CommonResponse<BpmnProcessInstanceVO> getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
/**
* 获取指定流程实例的流程变量
*
* @param processInstanceId
* @param tenantId
* @return
*/
@Operation(summary = "获取指定流程实例的流程变量")
@GetMapping("/api/process/instance/cooperation-org")
@InvokeMode(SYNC)
CommonResponse<Map<String, Object>> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId);
/**
* 查询所有的审批流
*
* @return
*/
@Operation(summary = "查询所有的审批流")
@PostMapping("/api/process/instance/page/all")
@Manageable
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnProcessInstanceAdminPageItemVO>> getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
/**
* 我发起的审批列表
*/
@Operation(summary = "我发起的审批列表")
@PostMapping("/api/process/instance/page/my")
@Manageable
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnProcessInstancePageItemVO>> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
/**
* 更新流程定义的状态
*
@ -126,6 +192,8 @@ public interface ProcessInstanceApi {
*/
@Operation(summary = "更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例")
@PutMapping("/api/process/instance/status/update")
@Manageable
@InvokeMode(SYNC)
CommonResponse<Boolean> updateProcessStatus(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId,
@NotNull(message = "状态不能为空") @RequestParam Integer status);
@ -136,7 +204,10 @@ public interface ProcessInstanceApi {
* @param tenantId
* @return
*/
@Operation(summary = "获取审批流程实例的运行图")
@GetMapping("/api/process/instance/graphical")
@Manageable
@InvokeMode(SYNC)
CommonResponse<ObjectNode> processInstanceGraphical(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId);
@ -145,7 +216,10 @@ public interface ProcessInstanceApi {
*
* @return
*/
@Operation(summary = "推断指定流程实例的所有节点执行顺序")
@GetMapping("/api/process/instance/node/forecasting")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<ProcessNodeDetailVO>> processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId);
@ -156,23 +230,15 @@ public interface ProcessInstanceApi {
* 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
* @return
*/
@Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序")
@GetMapping("/api/process/instance/node/filter/forecasting")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<ProcessNodeDetailVO>> processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId,
@RequestParam(required = false, defaultValue = "false") Boolean allNode,
@Nullable @RequestParam(required = false) List<String> nodeDefinitionKeys);
/**
* 获取指定流程实例的协作单位
*
* @param processInstanceId
* @param tenantId
* @return
*/
@GetMapping("/api/process/instance/cooperation-org")
CommonResponse<CooperationOrgDTO> getCooperationOrg(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId);
/**
* 查询实例的租户集合
*
@ -180,5 +246,101 @@ public interface ProcessInstanceApi {
*/
@Operation(summary = "查询实例的租户集合")
@GetMapping("/api/process/instance/tenant/ids")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<String>> getTenantIds();
/**
* 校验指定流程实例下,是否存在指定的审批人正处理待审批
*
* @return true 是在当前流程实例中,存在指定的审批人
*/
@Operation(summary = "校验指定流程实例下,是否存在指定的审批人")
@PostMapping("/api/process/instance/check/approver")
@Manageable
@InvokeMode(SYNC)
CommonResponse<Boolean> checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto);
/**
* 获取指定流程的日志
*
* @param dto
* @return
*/
@Operation(summary = "获取指定流程的日志")
@PostMapping("/api/process/instance/logs")
@InvokeMode(SYNC)
CommonResponse<BpmnProcessInstanceLogVO> getProcessInstanceLogs(@Validated @RequestBody BpmnProcessInstanceLogQueryDTO dto);
/**
* 根据任务id查询任务状态按钮详情
*
* @param taskButtonsSearchDTO 请求参数
* @return
*/
@Operation(summary = "根据任务id查询任务状态按钮详情")
@PostMapping("/api/process/instance/task/buttons/find")
@InvokeMode(SYNC)
CommonResponse<BpmnTaskButtonVo> findProcessSingleTaskButtons(@Validated @RequestBody BpmnTaskButtonSearchDTO taskButtonsSearchDTO);
/**
* 更新指定流程表单最后一次编辑的内容
*
* @param dto
* @return
*/
@Operation(summary = "更新指定流程表单最后一次编辑的内容")
@PostMapping("/api/process/instance/form/variable/update")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateInstanceFormVariables(@Validated @RequestBody FormVariablesUpdateDTO dto);
/**
* 签署业务流程实例在审批待办中查询使用的文档列表
*
* @return
*/
@Operation(summary = "签署业务流程实例在审批待办中查询使用的文档列表")
@PostMapping("/api/process/instance/select/doc/list")
@InvokeMode(SYNC)
CommonResponse<List<DocPendingVO>> processInstanceSelectDocs(@Validated @RequestBody ProcessDocQueryDTO dto);
/**
* 获取审批人阅读状态
*
* @return
*/
@Operation(summary = "获取审批人阅读状态")
@PostMapping("/api/process/instance/approver/read/status")
@InvokeMode(SYNC)
CommonResponse<List<SimpleDocDTO>> approverReadStatus(@Validated @RequestBody ApproverReadStatusDTO dto);
/**
* 修改审批人关联文档阅读状态
*/
@Operation(summary = "修改审批人关联文档阅读状态")
@PostMapping("/api/process/instance/approver/read/status/change")
@InvokeMode(SYNC)
CommonResponse<Boolean> approveReadStatusChange(@Validated @RequestBody ChangeApproverReadStatusDTO dto);
/**
* 获取签署业务流程最后替换的文档 fileKey 集合
*
* @return
*/
@Operation(summary = "获取签署业务流程最后替换的文档 fileKey 集合")
@GetMapping("/api/process/instance/final/docs")
@InvokeMode(SYNC)
CommonResponse<List<SignFileDTO>> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId);
/**
* 查询 ExtAxProcessLog 表中审批人的冗余信息
*
* @param dto
* @return
*/
@Operation(summary = "查询 ExtAxProcessLog 表中审批人的冗余信息")
@GetMapping("/api/process/instance/log/approve/ext")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<ExtProcessLogVO>> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto);
}

View File

@ -0,0 +1,45 @@
package cn.axzo.workflow.client.feign.bpmn;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
//@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = CommonFeignConfiguration.class)
@WorkflowEngineFeignClient
public interface ProcessJobApi {
/**
* 将死信队列中的任务转移到正常 JOB 队列中
* <p>
* 入参是二选一当只有 jobId 仅将指定的 JOB 转移到正常的队列中
* 而传入的是具体的实例 ID那么会将这个流程下的所有在死信队列中的任务都转移到正常的队列中
*
* @param jobId 具体的 JOB ID
* @param procInstId 具体的实例 ID
* @return
*/
@GetMapping("/api/process/job/dead-letter/resume")
@Manageable
CommonResponse<Void> executeDeadLetterJobAction(@RequestParam(required = false) String jobId,
@RequestParam(required = false) String procInstId);
/**
* 查询死信消息数据
* @param procInstId 流程实例id
* @return
*/
@GetMapping("/dead-letter/exception/stacktrace")
@Manageable
String getDeadLetterJobExceptionStacktrace(@RequestParam String procInstId);
/**
* 查询死信消息数据
* @param jobId 死信job的id
* @return
*/
@GetMapping("/dead-letter/exception/stacktrace/byId")
@Manageable
String getDeadLetterJobExceptionStacktraceByJobId(@RequestParam String jobId);
}

View File

@ -1,14 +1,30 @@
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.model.BpmnModelCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocByIdDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocOrderDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocResetDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelExtVO;
import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
import cn.azxo.framework.common.model.CommonResponse;
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;
@ -21,13 +37,17 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 流程模型 API
*
* @author wangli
* @since 2023/9/21 15:47
*/
@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 ProcessModelApi {
/**
@ -38,6 +58,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "流程模型列表")
@GetMapping("/api/process/model/page")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnModelDetailVO>> page(@Validated @RequestBody BpmnModelSearchDTO dto);
/**
@ -46,6 +67,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "创建流程模型")
@PostMapping("/api/process/model/create")
@InvokeMode(SYNC)
CommonResponse<String> create(@Validated @RequestBody BpmnModelCreateDTO dto);
/**
@ -53,6 +75,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "通过模型ID查询指定流程模型")
@GetMapping("/api/process/model/get")
@InvokeMode(SYNC)
CommonResponse<BpmnModelDetailVO> getById(@NotBlank(message = "流程模型 ID 不能为空") @RequestParam(required = false) String processModelId,
@RequestParam(required = false) String tenantId);
@ -61,6 +84,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "通过模型KEY查询指定流程模型")
@GetMapping("/api/process/model/getByKey")
@InvokeMode(SYNC)
CommonResponse<BpmnModelDetailVO> getByKey(@NotBlank(message = "流程模型 KEY 不能为空") @RequestParam(required = false) String processModelKey,
@NotBlank(message = "租户不能为空") @RequestParam(required = false) String tenantId);
@ -73,6 +97,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "获取指定模型的扩展属性")
@GetMapping("/api/process/model/ext")
@InvokeMode(SYNC)
CommonResponse<BpmnModelExtVO> getModelExt(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId);
/**
@ -80,6 +105,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "更新流程模型")
@PutMapping("/api/process/model/update")
@InvokeMode(SYNC)
CommonResponse<String> update(@RequestBody BpmnModelUpdateDTO dto);
@ -90,6 +116,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "通过模型 ID 部署流程模型")
@PostMapping("/api/process/model/deploy")
@InvokeMode(SYNC)
CommonResponse<String> deployById(@NotBlank(message = "流程模型 ID 不能为空") @RequestParam(required = false) String processModelId,
@RequestParam(required = false, defaultValue = "") String modelTenantId,
@RequestParam(required = false) String operator);
@ -101,6 +128,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "通过模型 KEY 部署流程模型")
@PostMapping("/api/process/model/deployByKey")
@InvokeMode(SYNC)
CommonResponse<String> deployByKey(@NotBlank(message = "流程模型 KEY 不能为空") @RequestParam(required = false) String processModelKey,
@NotBlank(message = "租户不能为空") @RequestParam(required = false) String modelTenantId,
@RequestParam(required = false) String operator);
@ -115,6 +143,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "通过模型 ID 取消部署流程模型")
@PostMapping("/api/process/model/undeploy")
@InvokeMode(SYNC)
CommonResponse<Void> unDeployById(@NotBlank(message = "流程模型 ID 不能为空") @RequestParam(required = false) String processModelId,
@RequestParam(required = false, defaultValue = "") String tenantId,
@RequestParam(required = false) String operator);
@ -124,6 +153,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "删除指定模型 ID 的流程模型")
@DeleteMapping("/api/process/model/delete")
@InvokeMode(SYNC)
CommonResponse<Void> deleteById(@NotBlank(message = "流程模型 ID 不能为空") @RequestParam String processModelId,
@RequestParam(required = false, defaultValue = "") String tenantId);
@ -136,6 +166,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "删除指定模型 KEY 的流程模型")
@DeleteMapping("/api/process/model/deleteByKey")
@InvokeMode(SYNC)
CommonResponse<Void> deleteByKey(@NotBlank(message = "流程模型 KEY 不能为空") @RequestParam String processModelKey,
@RequestParam(required = false, defaultValue = "") String tenantId);
@ -149,9 +180,25 @@ public interface ProcessModelApi {
*/
@Operation(summary = "修改模型状态")
@PostMapping("/api/process/model/changeStatus")
CommonResponse<Void> changeStatus(@NotBlank(message = "模型 ID 不能为空") @RequestParam String modelId,
@NotNull(message = "状态不能为空") @RequestParam Integer status,
@RequestParam(required = false) String operator);
@InvokeMode(SYNC)
CommonResponse<Boolean> changeStatus(@NotBlank(message = "模型 ID 不能为空") @RequestParam String modelId,
@NotNull(message = "状态不能为空") @RequestParam Integer status,
@RequestParam(required = false) String operator);
/**
* 修改模型打印开关状态
*
* @param modelId
* @param status
* @param operator
* @return
*/
@Operation(summary = "修改模型打印开关状态")
@PostMapping("/api/process/model/print/changeStatus")
@InvokeMode(SYNC)
CommonResponse<Boolean> changePrintStatus(@NotBlank(message = "模型 ID 不能为空") @RequestParam String modelId,
@NotNull(message = "状态不能为空") @RequestParam Integer status,
@RequestParam(required = false) String operator);
/**
* 查询流程模型使用的分类列表
@ -160,6 +207,7 @@ public interface ProcessModelApi {
*/
@Operation(summary = "查询流程模型使用的分类列表")
@GetMapping("/api/process/model/category/ids")
@InvokeMode(SYNC)
CommonResponse<List<String>> getModelCategoryList();
/**
@ -169,5 +217,176 @@ public interface ProcessModelApi {
*/
@Operation(summary = "查询模型的租户集合")
@GetMapping("/api/process/model/tenant/ids")
CommonResponse<List<String>> getTenantIds();
@InvokeMode(SYNC)
CommonResponse<List<String>> getModelTenantIds();
/**
* 打印模板配置内容更新保存
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容更新保存")
@PostMapping("/api/process/model/print/template/upsert")
@InvokeMode(SYNC)
CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
/**
* 获取打印模板配置内容
*
* @param dto
* @return
*/
@Operation(summary = "获取打印模板配置内容")
@PostMapping("/api/process/model/print/template/config/query")
@InvokeMode(SYNC)
CommonResponse<PrintModelDTO> getPrintTemplateConfig(@Validated @RequestBody PrintTemplateConfigQueryDTO dto);
/**
* 代运营充值的打印模板
*
* @param dto
* @return
*/
@Operation(summary = "代运营重置打印模板")
@PostMapping(value = "/api/process/model/print/template/config/reset")
@InvokeMode(SYNC)
CommonResponse<Boolean> resetPrintTemplateConfig(@Validated @RequestBody RestPrintTemplateConfigDTO dto);
/**
* 搜索文档列表
*
* @param dto
* @return
*/
@Operation(summary = "搜索文档列表")
@PostMapping(value = "/api/process/model/doc/page")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<DocBaseVO>> docPage(@Validated @RequestBody DocSearchDTO dto);
/**
* 获取指定 docIds 文档列表
*
* @return
*/
@Operation(summary = "获取指定 docIds 文档列表")
@PostMapping(value = "/api/process/model/doc/ids")
@InvokeMode(SYNC)
CommonResponse<List<DocBaseVO>> docByIds(@Validated @RequestBody DocByIdDTO dto);
/**
* 获取指定模板的原始文档列表
*
* @param dto
* @return
*/
@Operation(summary = "根据业务 ID 获取模型文档列表,自动适配公共模板和代运营")
@PostMapping(value = "/api/process/model/doc/list")
@InvokeMode(SYNC)
CommonResponse<List<DocBaseVO>> docList(@Validated @RequestBody DocQueryDTO dto);
/**
* 获取关联 HiPrint 类型文档模板内容
*
* @param fileRelationId
* @return
*/
@Operation(summary = "获取关联 HiPrint 类型文档模板内容")
@PostMapping(value = "/api/process/model/hi-print/content/get")
@InvokeMode(SYNC)
CommonResponse<String> getHiPrintContent(@RequestParam String fileRelationId);
/**
* 添加关联文档
*
* @return
*/
@Operation(summary = "添加关联文档")
@PutMapping(value = "/api/process/model/doc/create")
@InvokeMode(SYNC)
CommonResponse<Boolean> createDoc(@Validated @RequestBody DocCreateDTO dto);
/**
* 修改关联文档
*
* @return
*/
@Operation(summary = "修改关联文档")
@PostMapping(value = "/api/process/model/doc/update")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateDoc(@Validated @RequestBody DocUpdateDTO dto);
/**
* 克隆关联文档
*
* @param docId
* @return
*/
@Operation(summary = "克隆关联文档")
@PostMapping(value = "/api/process/model/doc/clone")
@InvokeMode(SYNC)
CommonResponse<Boolean> cloneDoc(@RequestParam("id") Long docId);
/**
* 删除关联文档
*
* @return
*/
@Operation(summary = "删除指定文档")
@DeleteMapping(value = "/api/process/model/doc/delete")
@InvokeMode(SYNC)
CommonResponse<Boolean> deleteDoc(@RequestParam("id") Long docId);
/**
* 关联文档配置排序
*
* @param dto
* @return
*/
@Operation(summary = "关联文档配置排序")
@PostMapping(value = "/api/process/model/doc/order")
@InvokeMode(SYNC)
CommonResponse<Boolean> orderDoc(@Validated @RequestBody DocOrderDTO dto);
/**
* 重置关联文档
*
* @param dto
* @return
*/
@Operation(summary = "重置关联文档配置")
@PostMapping(value = "/api/process/model/doc/reset")
@InvokeMode(SYNC)
CommonResponse<Boolean> resetDoc(@Validated @RequestBody DocResetDTO dto);
/**
* 设置关联文档的停启用状态
*
* @param dto
* @return
*/
@Operation(summary = "设置关联文档的停启用状态")
@PostMapping(value = "/api/process/model/doc/status")
@InvokeMode(SYNC)
CommonResponse<Boolean> statusDoc(@Validated @RequestBody DocStatusDTO dto);
/**
* 设置关联文档的必选状态
*
* @return
*/
@Operation(summary = "设置关联文档的必选状态")
@PostMapping(value = "/api/process/model/doc/require")
@InvokeMode(SYNC)
CommonResponse<Boolean> requireDoc(@Validated @RequestBody DocStatusDTO dto);
/**
* 特殊的查询设置过关联过文档的工作台 ID 集合
*
* @return
*/
@Operation(summary = "特殊的查询设置过关联过文档的工作台 ID 集合")
@PostMapping(value = "/api/process/model/has/docs/tenantId")
@InvokeMode(SYNC)
CommonResponse<List<Long>> hasFilesTenantIds(@Validated @RequestBody DocTenantQueryDTO dto);
}

View File

@ -1,15 +1,24 @@
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.task.BpmnNodeBackSystemOperateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
@ -17,7 +26,6 @@ import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
import cn.azxo.framework.common.model.CommonResponse;
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -26,7 +34,11 @@ import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Map;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
@ -35,45 +47,10 @@ 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 ProcessTaskApi {
/**
* 待审核列表
*/
@GetMapping("/api/process/task/page/todo")
CommonResponse<BpmPageResult<BpmnTaskTodoPageItemVO>> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
/**
* 已完成的审批列表
*/
@GetMapping("/api/process/task/page/done")
CommonResponse<BpmPageResult<BpmnTaskDonePageItemVO>> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
/**
* 获取指定流程实例的审批过程信息
* <p>
* 同一层级结构
*/
@GetMapping("/api/process/task/list/flat")
CommonResponse<List<BpmnHistoricTaskInstanceVO>> getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " +
"不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取指定流程实例的审批过程信息
* <p>
* 分组结构
*/
@GetMapping("/api/process/task/list/group")
CommonResponse<List<BpmnHistoricTaskInstanceGroupVO>> getTaskListGroupByProcessInstanceId(@NotBlank(message =
"流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取实例正在审核的人列表
*/
@GetMapping("/api/process/task/active/list")
CommonResponse<List<BpmnTaskInstanceVO>> getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @NotBlank(message = "租户不能为空") @RequestParam String tenantId);
/**
* 同意
*
@ -85,9 +62,60 @@ public interface ProcessTaskApi {
* 2.2. 流程实例正常结束会触发 process-instance-completed 事件
* </pre>
*/
@Operation(summary = "同意MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件2.2. 流程实例正常结束会触发 process-instance-completed 事件")
@PostMapping("/api/process/task/approve")
CommonResponse<Boolean> approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
/**
* 同意时并提交表单数据
*
* @param dto
* @return
*/
@Operation(summary = "同意时并提交表单")
@PostMapping("/api/process/task/form/approve")
CommonResponse<Boolean> approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto);
/**
* 批量同意
*
* @param dtos
* @return
*/
@Operation(summary = "批量同意")
@PostMapping("/api/process/task/batch/approve")
CommonResponse<BatchOperationResultVO> batchApproveTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
/**
* 获取当前节点可回退节点选项列表
*
* @param taskId 当前任务id
* @return 可以回退节点列表
*/
@Operation(summary = "获取当前节点可回退节点选项列表")
@GetMapping("/api/process/task/back/optional/nodes")
CommonResponse<List<BpmnOptionalNodeDTO>> getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId);
/**
* 回退到指定节点
*
* @param dto
* @return
*/
@Operation(summary = "回退")
@PostMapping("/api/process/task/back")
CommonResponse<Boolean> backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto);
/**
* 用于系统内部操作跳转到指定节点
*
* @param dto 请求参数
* @return 是否成功
*/
@Operation(summary = "系统操作回退任务到指定节点")
@PostMapping("/api/process/task/system/back")
CommonResponse<Boolean> systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto);
/**
* 驳回
*
@ -97,9 +125,19 @@ public interface ProcessTaskApi {
* 2. 当前流程实例会触发 process-instance-rejected 事件
* </pre>
*/
@Operation(summary = "驳回MQ 触发规则1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件")
@PostMapping("/api/process/task/reject")
CommonResponse<Boolean> rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
/**
* 批量驳回
*
* @param dtos 批量请求参数
* @return
*/
@PostMapping("/api/process/task/batch/reject")
CommonResponse<BatchOperationResultVO> batchRejectTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
/**
* 转交
*
@ -110,6 +148,16 @@ public interface ProcessTaskApi {
@PostMapping("/api/process/task/transfer")
CommonResponse<Boolean> transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto);
/**
* 批量转交
*
* @param dtos
* @return
*/
@Operation(summary = "批量修改审批任务的审批人")
@PostMapping("/api/process/task/batch/transfer")
CommonResponse<BatchOperationResultVO> batchTransferTask(@Validated @RequestBody List<BpmnTaskTransferDTO> dtos);
/**
* 评论
*
@ -120,16 +168,6 @@ public interface ProcessTaskApi {
@PostMapping("/api/process/task/comment")
CommonResponse<Boolean> commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto);
/**
* 添加附件
*
* @param dto
* @return
*/
@Operation(summary = "添加附件")
@PostMapping("/api/process/task/attachment")
CommonResponse<Void> addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto);
/**
* 加签
*
@ -140,6 +178,16 @@ public interface ProcessTaskApi {
@PostMapping("/api/process/task/countersign")
CommonResponse<Boolean> countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto);
/**
* 重置节点审批人提级审批
*
* @param dto
* @return
*/
@Operation(summary = "重置节点审批人(提级审批)")
@PostMapping("/api/process/task/approvers/reset")
CommonResponse<Boolean> resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto);
/**
* 催办
*
@ -148,6 +196,8 @@ public interface ProcessTaskApi {
*/
@Operation(summary = "审批流程催办")
@PostMapping("/api/process/task/remind")
@Manageable
@InvokeMode(SYNC)
CommonResponse<Boolean> remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto);
/**
@ -170,6 +220,69 @@ public interface ProcessTaskApi {
@PostMapping("/api/process/task/robot/complete")
CommonResponse<Boolean> completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto);
/**
* 添加附件
*
* @param dto
* @return
*/
@Operation(summary = "添加附件")
@PostMapping("/api/process/task/attachment")
@Manageable
CommonResponse<Void> addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto);
/**
* 待审核列表
*/
@Operation(summary = "待审核列表")
@GetMapping("/api/process/task/page/todo")
@Manageable
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnTaskTodoPageItemVO>> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
/**
* 已完成的审批列表
*/
@Operation(summary = "已完成的审批列表")
@GetMapping("/api/process/task/page/done")
@Manageable
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnTaskDonePageItemVO>> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
/**
* 获取指定流程实例的审批过程信息
* <p>
* 同一层级结构
*/
@Operation(summary = "获取指定流程实例的审批过程信息")
@GetMapping("/api/process/task/list/flat")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<BpmnHistoricTaskInstanceVO>> getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " +
"不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取指定流程实例的审批过程信息
* <p>
* 分组结构
*/
@Operation(summary = "获取指定流程实例的审批过程信息")
@GetMapping("/api/process/task/list/group")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<BpmnHistoricTaskInstanceGroupVO>> getTaskListGroupByProcessInstanceId(@NotBlank(message =
"流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取实例正在审核的人列表
*/
@Operation(summary = "获取实例正在审核的人列表")
@GetMapping("/api/process/task/active/list")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<BpmnTaskInstanceVO>> getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@NotBlank(message = "租户不能为空") @RequestParam String tenantId);
/**
* 根据实例 ID 和自然人 ID 查询对应待处理的任务 ID
*
@ -177,6 +290,21 @@ public interface ProcessTaskApi {
*/
@Operation(summary = "根据实例 ID 和自然人 ID 查询对应待处理的任务 ID")
@GetMapping("/api/process/task/find")
@Manageable
@InvokeMode(SYNC)
CommonResponse<String> findTaskIdByInstanceIdAndPersonId(@RequestParam(required = false) @NotBlank(message = "流程实例 ID 不能为空") String processInstanceId,
@RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
/**
* 根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID
*
* @return
*/
@Operation(summary = "根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID")
@GetMapping("/api/process/task/batch/find")
@Manageable
@InvokeMode(SYNC)
CommonResponse<Map<String, String>> findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List<String> processInstanceIds,
@RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
}

View File

@ -0,0 +1,55 @@
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.RestBpmnProcessVariable;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 流程变量api
*/
//@FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = CommonFeignConfiguration.class)
@WorkflowEngineFeignClient
@Manageable
public interface ProcessVariableApi {
/**
* 为指定流程新增变量
*/
@PostMapping("/api/process/variable/create/{executionId}")
@InvokeMode(SYNC)
CommonResponse<Void> createVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId,
@RequestBody @Validated RestBpmnProcessVariable restVariable);
/**
* 仅更新流程已存在的变量
*
* @param executionId
* @param restVariable
* @return
*/
@PostMapping("/api/process/variable/update/{executionId}")
@InvokeMode(SYNC)
CommonResponse<Void> updateVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId,
@RequestBody @Validated RestBpmnProcessVariable restVariable);
/**
* 批量删除流程变量
*/
@DeleteMapping("/api/process/variable/delete/{executionId}")
@InvokeMode(SYNC)
CommonResponse<Void> deleteVariables(@PathVariable("executionId") String executionId,
@RequestParam String variableNames,
@RequestParam(value = "scope", required = false) String scope);
}

View File

@ -0,0 +1,35 @@
package cn.axzo.workflow.client.feign.es;
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.es.InstanceSearchReqDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 操作 ES 的流程实例 API
*
* @author wangli
* @since 2024-10-07 21:12
*/
@WorkflowEngineFeignClient
@Manageable
public interface EsProcessInstanceApi {
/**
* ES 中搜索符合条件的实例纬度数据
*
* @param dto
* @return
*/
@PostMapping("/api/es/instance/search")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<ProcessInstanceDocumentVO>> searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto);
}

View File

@ -0,0 +1,58 @@
package cn.axzo.workflow.client.feign.manage;
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.form.definition.StartFormSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
import cn.axzo.workflow.common.model.response.form.FormVO;
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 表达实例相关 API, 这里主要用于表单与流程的集成所需的 API
* <p>
* 如果想单独创建表单实例建议在 Form 包中单独提供 API
*
* @author wangli
* @since 2024-11-11 20:08
*/
@WorkflowEngineFeignClient
public interface FormAdminApi {
@PostMapping("/api/form/admin/form/page")
@InvokeMode(SYNC)
@Manageable
CommonResponse<List<FormVO>> formPage(@Validated @RequestBody FormSearchDTO dto);
/**
* 获取指定审批业务的流程表单设置
* @param dto
* @return
*/
@PostMapping("/api/form/admin/start/form")
@InvokeMode(SYNC)
CommonResponse<FormDefinitionVO> getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);
/**
* 查询指定审批实例的表单模型和数据
* <p>
* dto 中的 processInstanceId taskId至少有一个属性有值一般建议直接使用实例 ID
* 当传入 taskId 将只查询该任务绑定的表单模型和数据
*
* @param dto
* @return
*/
@PostMapping("/api/form/admin/instance/render")
@InvokeMode(SYNC)
CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto);
}

View File

@ -0,0 +1,45 @@
package cn.axzo.workflow.client.feign.manage;
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.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 打印相关的 API
*
* @author wangli
* @since 2025-01-16 17:35
*/
@WorkflowEngineFeignClient
@Manageable
public interface PrintAdminApi {
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
@GetMapping("/api/print/admin/template/exists")
@InvokeMode(SYNC)
CommonResponse<Boolean> hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
@Operation(summary = "获取打印模板中可打印的字段")
@PostMapping("/api/print/admin/fields")
@InvokeMode(SYNC)
CommonResponse<List<PrintFieldDTO>> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
@Operation(summary = "获取指定流程下用于替换打印的相关变量")
@GetMapping("/api/print/admin/field/variables")
@InvokeMode(SYNC)
CommonResponse<Map<String, Object>> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
}

View File

@ -0,0 +1,86 @@
package cn.axzo.workflow.client.feign.manage;
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.admin.ProcessAdminCreateDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
@WorkflowEngineFeignClient
@Manageable
public interface ProcessAdminApi {
/**
* 查询管理员
* @param dto 管理员数据
* @return 管理员id
*/
@PostMapping("/api/process/admin/query")
@InvokeMode(SYNC)
CommonResponse<List<ProcessAdminVo>> queryProcessAdmins(@RequestBody ProcessAdminQueryDTO dto);
/**
* 查询管理员
* @param dto 管理员数据
* @return 管理员id
*/
@PostMapping("/api/process/admin/query/count")
@InvokeMode(SYNC)
CommonResponse<Integer> queryProcessAdminsCount(@RequestBody ProcessAdminQueryDTO dto);
/**
* 添加管理员
* @param dto 管理员数据
* @return 管理员id
*/
@PostMapping("/api/process/admin/create")
@InvokeMode(SYNC)
CommonResponse<Long> createProcessAdmin(@RequestBody ProcessAdminCreateDTO dto);
/**
* 批量添加管理员
* @param dtos
* @return
*/
@PostMapping("/api/process/admin/batch/create")
@InvokeMode(SYNC)
CommonResponse<Void> batchCreateProcessAdmin(@RequestBody List<ProcessAdminCreateDTO> dtos);
/**
* 删除管理员
* @param id 配置表id
* @return
*/
@DeleteMapping("/api/process/admin/delete")
@InvokeMode(SYNC)
CommonResponse<Integer> deleteCommonProcessAdmin(@RequestParam Long id);
/**
* 根据条件删除管理员
* @param dto 删除条件
* @return
*/
@DeleteMapping("/api/process/admin/delete/criteria")
@InvokeMode(SYNC)
CommonResponse<Integer> deleteProcessAdminCriteria(@RequestBody ProcessAdminDeleteDTO dto);
/**
* 删除管理员
* @param ids 管理员配置id列表
* @return
*/
@DeleteMapping("/api/process/admin/batch/delete")
@InvokeMode(SYNC)
CommonResponse<Integer> batchDeleteProcessAdmin(@RequestBody List<Long> ids);
}

View File

@ -1,26 +1,21 @@
package cn.axzo.workflow.client.feign.manage;
import cn.axzo.workflow.common.model.request.category.CategoryConfigCreateDTO;
import cn.axzo.workflow.common.model.request.category.CategoryConfigSearchDTO;
import cn.axzo.workflow.common.model.request.category.CategoryCreateDTO;
import cn.axzo.workflow.common.model.request.category.CategorySearchDTO;
import cn.axzo.workflow.common.model.request.category.CategoryUpdateDTO;
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.category.*;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
import cn.azxo.framework.common.model.CommonResponse;
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;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
/**
* OMS流程业务管理API
@ -30,7 +25,9 @@ import java.util.List;
* @date 2023/11/6 16:01
*/
@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 ProcessCategoryApi {
/**
@ -39,6 +36,7 @@ public interface ProcessCategoryApi {
* @return
*/
@GetMapping("/api/process/category/get")
@InvokeMode(SYNC)
CommonResponse<CategoryItemVO> get(@RequestParam Long id);
/**
@ -48,6 +46,7 @@ public interface ProcessCategoryApi {
* @return
*/
@GetMapping("/api/process/category/getByIds")
@InvokeMode(SYNC)
CommonResponse<List<CategoryItemVO>> getByIds(@RequestParam List<Long> ids);
/**
@ -57,6 +56,7 @@ public interface ProcessCategoryApi {
* @return
*/
@GetMapping("/api/process/category/getByValues")
@InvokeMode(SYNC)
CommonResponse<List<CategoryItemVO>> getByValues(@RequestParam List<String> values);
/**
@ -65,6 +65,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/create")
@InvokeMode(SYNC)
CommonResponse<CategoryItemVO> create(@Validated @RequestBody CategoryCreateDTO req);
/**
@ -73,6 +74,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PutMapping("/api/process/category/update")
@InvokeMode(SYNC)
CommonResponse<CategoryItemVO> update(@Validated @RequestBody CategoryUpdateDTO dto);
/**
@ -82,6 +84,7 @@ public interface ProcessCategoryApi {
* @return
*/
@DeleteMapping("/api/process/category/delete")
@InvokeMode(SYNC)
CommonResponse<Boolean> delete(@RequestParam Long id);
/**
@ -92,6 +95,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PutMapping("/api/process/category/update/state")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateState(@RequestParam Long id, @RequestParam Boolean state);
/**
@ -100,6 +104,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/list")
@InvokeMode(SYNC)
CommonResponse<List<CategoryItemVO>> list(@RequestBody CategorySearchDTO dto);
/**
@ -108,6 +113,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/page/search")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<CategoryItemVO>> search(@RequestBody CategorySearchDTO dto);
/**
@ -117,6 +123,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/config/create")
@InvokeMode(SYNC)
CommonResponse<Boolean> createConfig(@RequestBody CategoryConfigCreateDTO dto);
/**
@ -126,6 +133,7 @@ public interface ProcessCategoryApi {
* @return
*/
@DeleteMapping("/api/process/category/config/delete/{id}")
@InvokeMode(SYNC)
CommonResponse<Boolean> deleteConfig(@PathVariable Long id);
/**
@ -134,6 +142,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/config/page/search")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<CategoryConfigItemVO>> configSearch(@RequestBody CategoryConfigSearchDTO dto);
/**
@ -144,6 +153,7 @@ public interface ProcessCategoryApi {
* @return
*/
@PostMapping("/api/process/category/config/type/update")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateCategoryConfigType(@RequestParam Long id, @RequestParam String configType);
/**
@ -154,5 +164,23 @@ public interface ProcessCategoryApi {
* @return true: 可以发起创建流程实例, false: 不可用
*/
@GetMapping("/api/process/category/check/status")
@InvokeMode(SYNC)
CommonResponse<Boolean> checkCategoryStatus(@RequestParam Long tenantId, @RequestParam String categoryCode);
/**
* 查询分类对应的分组以及分组下的变量
* @param dto 请求参数
* @return 分组以及分组下的变量
*/
@PostMapping("/api/process/category/group-with-vars/list")
@InvokeMode(SYNC)
CommonResponse<List<CategoryGroupVarItemVo>> searchCategoryGroupAndVars(@Validated @RequestBody CategoryGroupVarSearchDto dto);
/**
* 新增或者更新分组或者变量
* @param dto 请求参数
* @return 是否成功
*/
@PostMapping("/api/process/category/group-with-vars/upsert")
CommonResponse<Boolean> upsertCategoryGroupAndVars(@Validated @RequestBody CategoryGroupVarUpsertDto dto);
}

View File

@ -1,12 +1,16 @@
package cn.axzo.workflow.client.feign.manage;
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.BpmnButtonMetaInfo;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* OMS流程业务管理API
@ -16,7 +20,9 @@ import java.util.List;
* @date 2023/11/6 16:01
*/
@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 ProcessConfigApi {
/**
@ -25,6 +31,7 @@ public interface ProcessConfigApi {
* @return 流程操作按钮列表
*/
@GetMapping("/api/process/config/button/list")
@InvokeMode(SYNC)
CommonResponse<List<BpmnButtonMetaInfo>> getDefaultButtons();

View File

@ -0,0 +1,39 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>workflow-engine</artifactId>
<groupId>cn.axzo.workflow</groupId>
<version>${revision}</version>
</parent>
<artifactId>workflow-engine-axzo-ext</artifactId>
<packaging>jar</packaging>
<name>Workflow Engine Axzo Extension</name>
<dependencies>
<dependency>
<groupId>cn.axzo.workflow</groupId>
<artifactId>workflow-engine-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.basics</groupId>
<artifactId>basics-common</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-processor-spring-boot-starter</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-mybatisplus-spring-boot-starter</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,64 @@
package cn.axzo.workflow.admin.repository.entity;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import cn.axzo.workflow.common.enums.AdminDataSource;
import cn.axzo.workflow.common.enums.AdminRoleType;
import cn.axzo.workflow.common.enums.AdminTypeEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@EqualsAndHashCode(callSuper = true)
@TableName(value = "ext_ax_process_admin", autoResultMap = true)
@Data
@ToString(callSuper = true)
public class ExtAxProcessAdmin extends BaseEntity<ExtAxProcessAdmin> {
private static final long serialVersionUID = 7342715107163876733L;
/**
* 自然人id
*/
private Long personId;
/**
* 单位id
*/
private Long organizationalUnitId;
/**
* 工作台ID
*/
private Long workspaceId;
/**
* 工作台类型1-企业, 2-项目, 3-政务监管平台, 6-oms工作台,参考 WorkspaceType枚举
*/
private Integer workspaceType;
/**
* 管理员类型, SUPER_ADMIN-超级管理员, COMMON_ADMIN-普通管理员
*/
private AdminTypeEnum adminType;
/**
* 角色类型, ORGANIZATION_ADMIN-单位超管, ORG_WORKSPACE_ADMIN-项目内单位负责人, WORKSPACE_ADMIN-项目超管OTHER-其他用户
*/
private AdminRoleType roleType;
/**
* 数据来源, SYSTEM_ENTRY-系统录入, USER_ENTRY-用户手动录入
*/
private AdminDataSource dataSource;
/**
* 创建者
*/
private Long createBy;
/**
* 更新者
*/
private Long updateBy;
}

View File

@ -0,0 +1,9 @@
package cn.axzo.workflow.admin.repository.mapper;
import cn.axzo.workflow.admin.repository.entity.ExtAxProcessAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ExtAxProcessAdminMapper extends BaseMapper<ExtAxProcessAdmin> {
}

View File

@ -0,0 +1,49 @@
package cn.axzo.workflow.admin.service;
import cn.axzo.workflow.admin.repository.entity.ExtAxProcessAdmin;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
import java.util.List;
public interface ExtAxProcessAdminService {
/**
* 新增管理员
* @param processAdmin 流程配置管理员
* @return id
*/
Long insert(ExtAxProcessAdmin processAdmin);
/**
* 批量新增
* @param processAdmins 配置管理员列表
*/
void batchInsert(List<ExtAxProcessAdmin> processAdmins);
/**
* 根据条件查询
* @param queryDTO
* @return
*/
List<ExtAxProcessAdmin> query(ProcessAdminQueryDTO queryDTO);
/**
* 根据条件查询数量
* @param queryDTO
* @return
*/
Integer queryCount(ProcessAdminQueryDTO queryDTO);
/**
* 根据条件删除管理员配置
* @param deleteDTO 删除条件
*/
Integer delete(ProcessAdminDeleteDTO deleteDTO);
/**
* 批量删除管理员
* @param ids 配置表id列表
*/
Integer deleteCommonAdminsByIds(List<Long> ids);
}

View File

@ -0,0 +1,112 @@
package cn.axzo.workflow.admin.service.impl;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.workflow.admin.repository.entity.ExtAxProcessAdmin;
import cn.axzo.workflow.admin.repository.mapper.ExtAxProcessAdminMapper;
import cn.axzo.workflow.admin.service.ExtAxProcessAdminService;
import cn.axzo.workflow.common.enums.AdminDataSource;
import cn.axzo.workflow.common.enums.AdminTypeEnum;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@Service
public class ExtAxProcessAdminServiceImpl implements ExtAxProcessAdminService {
@Resource
private ExtAxProcessAdminMapper extAxProcessAdminMapper;
@Override
public Long insert(ExtAxProcessAdmin processAdmin) {
extAxProcessAdminMapper.insert(processAdmin);
return processAdmin.getId();
}
@Override
public void batchInsert(List<ExtAxProcessAdmin> processAdmins) {
if (CollectionUtils.isEmpty(processAdmins)) {
return;
}
processAdmins.forEach(this::insert);
}
@Override
public List<ExtAxProcessAdmin> query(ProcessAdminQueryDTO queryDTO) {
if (queryDTO == null) {
return Collections.emptyList();
}
return extAxProcessAdminMapper.selectList(getQueryWrapper(queryDTO));
}
@Override
public Integer queryCount(ProcessAdminQueryDTO queryDTO) {
return extAxProcessAdminMapper.selectCount(getQueryWrapper(queryDTO));
}
@Override
public Integer delete(ProcessAdminDeleteDTO deleteDTO) {
if (deleteDTO == null) {
return 0;
}
return extAxProcessAdminMapper.delete(getDeleteWrapper(deleteDTO));
}
@Override
public Integer deleteCommonAdminsByIds(List<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return 0;
}
List<ExtAxProcessAdmin> extAxProcessAdmins = extAxProcessAdminMapper.selectBatchIds(ids);
if (CollectionUtils.isEmpty(extAxProcessAdmins)) {
return 0;
}
validateDeleteCommonAdmins(extAxProcessAdmins);
return extAxProcessAdminMapper.deleteBatchIds(ids);
}
private void validateDeleteCommonAdmins(List<ExtAxProcessAdmin> extAxProcessAdmins) {
if (CollectionUtils.isEmpty(extAxProcessAdmins)) {
return;
}
if (extAxProcessAdmins.stream().anyMatch(ad -> ad.getAdminType() == AdminTypeEnum.SUPER_ADMIN)) {
throw new ServiceException("超级管理员不允许删除");
}
if (extAxProcessAdmins.stream().anyMatch(ad -> ad.getDataSource() == AdminDataSource.SYSTEM_ENTRY)) {
throw new ServiceException("系统数据不允许删除");
}
}
private LambdaQueryWrapper<ExtAxProcessAdmin> getQueryWrapper(ProcessAdminQueryDTO queryDTO) {
return new LambdaQueryWrapper<ExtAxProcessAdmin>()
.in(!CollectionUtils.isEmpty(queryDTO.getProcessAdminIds()), ExtAxProcessAdmin::getId, queryDTO.getProcessAdminIds())
.eq(Objects.nonNull(queryDTO.getWorkspaceId()), ExtAxProcessAdmin::getWorkspaceId, queryDTO.getWorkspaceId())
.eq(queryDTO.getAdminType() != null, ExtAxProcessAdmin::getAdminType, queryDTO.getAdminType())
.eq(Objects.nonNull(queryDTO.getOrganizationalUnitId()), ExtAxProcessAdmin::getOrganizationalUnitId, queryDTO.getOrganizationalUnitId())
.in(!CollectionUtils.isEmpty(queryDTO.getPersonIds()), ExtAxProcessAdmin::getPersonId, queryDTO.getPersonIds())
.eq(Objects.nonNull(queryDTO.getDataSource()), ExtAxProcessAdmin::getDataSource, queryDTO.getDataSource())
.eq(ExtAxProcessAdmin::getIsDelete, TableIsDeleteEnum.NORMAL.value);
}
private LambdaQueryWrapper<ExtAxProcessAdmin> getDeleteWrapper(ProcessAdminDeleteDTO deleteDTO) {
return new LambdaQueryWrapper<ExtAxProcessAdmin>()
.in(!CollectionUtils.isEmpty(deleteDTO.getProcessAdminIds()), ExtAxProcessAdmin::getId, deleteDTO.getProcessAdminIds())
.eq(Objects.nonNull(deleteDTO.getWorkspaceId()), ExtAxProcessAdmin::getWorkspaceId, deleteDTO.getWorkspaceId())
.eq(deleteDTO.getAdminType() != null, ExtAxProcessAdmin::getAdminType, deleteDTO.getAdminType())
.eq(Objects.nonNull(deleteDTO.getOrganizationalUnitId()), ExtAxProcessAdmin::getOrganizationalUnitId, deleteDTO.getOrganizationalUnitId())
.in(!CollectionUtils.isEmpty(deleteDTO.getWorkspaceIds()), ExtAxProcessAdmin::getWorkspaceId, deleteDTO.getWorkspaceIds())
.in(!CollectionUtils.isEmpty(deleteDTO.getOrganizationalUnitIds()), ExtAxProcessAdmin::getOrganizationalUnitId, deleteDTO.getOrganizationalUnitIds())
.in(!CollectionUtils.isEmpty(deleteDTO.getPersonIds()), ExtAxProcessAdmin::getPersonId, deleteDTO.getPersonIds())
.eq(Objects.nonNull(deleteDTO.getDataSource()), ExtAxProcessAdmin::getDataSource, deleteDTO.getDataSource())
.eq(ExtAxProcessAdmin::getIsDelete, TableIsDeleteEnum.NORMAL.value);
}
}

View File

@ -11,7 +11,7 @@
<artifactId>workflow-engine-common</artifactId>
<packaging>jar</packaging>
<name>workflow-engine-common</name>
<name>workflow Engine Common</name>
<dependencies>
<dependency>
@ -29,6 +29,10 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-annotation</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -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;
}

View File

@ -0,0 +1,10 @@
package cn.axzo.workflow.common.annotation;
/**
* 控制接口是否调用受限标记了注解的方法表示受控不允许暴露给客户端使用
*
* @author wangli
* @since 2024/6/7 18:21
*/
public @interface Manageable {
}

View File

@ -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;
@ -14,9 +14,12 @@ import lombok.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 String code;
private String message;
private final String code;
private final String message;
@Override
public String getModuleCode() {
@ -27,13 +30,4 @@ public enum AsyncJobRespCode implements IModuleRespCode {
public String getProjectCode() {
return "998";
}
public void setCode(String code) {
this.code = code;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -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;
@ -26,9 +26,16 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
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() {
@ -40,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;
}
}

View File

@ -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";
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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";
/**
* 用于国内审批节点填写审批建议
* <p>
@ -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_]";
}

View File

@ -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";
}

View File

@ -0,0 +1,6 @@
package cn.axzo.workflow.common.constant;
public interface LogFieldConstants {
String X_REQUEST_ID = "x-request-id";
}

View File

@ -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";
}

View File

@ -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";
}

View File

@ -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 = "电子签名";
}

View File

@ -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<AttachmentValidator, List<AttachmentDTO>> {
private AttachmentTypeValidator[] typeConstraints;
@Override
public void initialize(AttachmentValidator constraintAnnotation) {
this.typeConstraints = constraintAnnotation.types();
}
@Override
public boolean isValid(List<AttachmentDTO> 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<AttachmentDTO> 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();
}
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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"),

View File

@ -15,6 +15,9 @@ public enum ApproverSpecifyEnum {
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管"),
fixedPerson("fixedPerson", "固定人员"),
preNodeSpecified("preNodeSpecified", "上级节点指定"),
initiatorSpecified("initiatorSpecified", "发起时指定"),
// 该枚举目前主要为了区别签署业务与审批业务的不同配法选择该项时意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
signerRelated("signerRelated", "签署人相关组织"),
;
private String type;
private String desc;

View File

@ -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;
}
}

View File

@ -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<BusinessTypeEnum> getSupportBizType() {
return supportBizType;
}
private final int order;
private final String btnKey;
private final String btnName;
private final List<BusinessTypeEnum> supportBizType;
BpmnButtonEnum(int order, String btnKey, String btnName) {
BpmnButtonEnum(int order, String btnKey, String btnName, List<BusinessTypeEnum> supportBizType) {
this.order = order;
this.btnKey = btnKey;
this.btnName = btnName;
this.supportBizType = supportBizType;
}
}

View File

@ -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);
}
}

View File

@ -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))

View File

@ -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, "短信模板"),
;

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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"),

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,11 @@
package cn.axzo.workflow.common.enums;
/**
* 模型扩展表的状态枚举
*
* @author wangli
* @since 2025-01-15 09:46
*/
public enum ExtModelStateFieldEnum {
status, printStatus
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,12 @@
package cn.axzo.workflow.common.enums;
/**
* 顺序操作枚举
*
* @author wangli
* @since 2025-03-31 16:35
*/
public enum OrderEnum {
UP, DOWN
}

View File

@ -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
}

View File

@ -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", "流程活动节点已取消"),
;

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -0,0 +1,12 @@
package cn.axzo.workflow.common.enums;
/**
* PRC 调用模式枚举
*
* @author wangli
* @since 2024/5/29 10:27
*/
public enum RpcInvokeModeEnum {
SYNC,
ASYNC,
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,16 @@
package cn.axzo.workflow.common.enums;
/**
* 时间查询方向
* <p>
* 注意: 该枚举用在查询 flowable 引擎数据时, 都是包含自身时间点的.
* 例如, 使用 Before ,也就是说在某个时间点之前,是包含"某个时间"自身的.
*
* @author wangli
* @since 2024-09-29 09:56
*/
public enum TimeQueryDirection {
BEFORE,
AFTER,
;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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))

View File

@ -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();

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 {
* <p>
* 1 - 企业
* 2 - 项目
* 3 - 政务
* 6 - oms
*/
private Integer workspaceType;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<NodeInfo> nodeInfos;
/**
* 岗位快照信息集合
*/
private List<JobInfo> jobInfos;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<SignDetail> signatures;
@Data
@Accessors(chain = true)
public static class SignDetail implements Serializable {
private static final long serialVersionUID = 1L;
private String signature;
private String advice;
}
}

Some files were not shown because too many files have changed in this diff Show More