upsertCategoryGroupAndVars(@Validated @RequestBody CategoryGroupVarUpsertDto dto);
}
diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/ProcessConfigApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/ProcessConfigApi.java
index 13bf5e8e0..521386f0e 100644
--- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/ProcessConfigApi.java
+++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/ProcessConfigApi.java
@@ -1,12 +1,10 @@
package cn.axzo.workflow.client.feign.manage;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
-import cn.axzo.workflow.client.config.CommonFeignConfiguration;
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;
diff --git a/workflow-engine-axzo-ext/src/main/java/cn/axzo/workflow/admin/repository/entity/ExtAxProcessAdmin.java b/workflow-engine-axzo-ext/src/main/java/cn/axzo/workflow/admin/repository/entity/ExtAxProcessAdmin.java
index 8e4bdd15c..d3f3332b9 100644
--- a/workflow-engine-axzo-ext/src/main/java/cn/axzo/workflow/admin/repository/entity/ExtAxProcessAdmin.java
+++ b/workflow-engine-axzo-ext/src/main/java/cn/axzo/workflow/admin/repository/entity/ExtAxProcessAdmin.java
@@ -4,7 +4,6 @@ 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 cn.axzo.workflow.common.enums.WorkspaceType;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
index ce1bacf93..8d84ed9a8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnInstanceRespCode.java
@@ -26,8 +26,12 @@ 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", "引擎内部异常"),
+ 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", "流程实例【{}】不存在, 不能评论"),
;
private final String code;
private final String message;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java
index 7ba846689..d1881847e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnModelRespCode.java
@@ -18,7 +18,16 @@ public enum BpmnModelRespCode implements IModuleRespCode {
MODEL_KEY_NOT_EXISTS("003", "流程模型KEY【{}】不存在"),
MODEL_NOT_EXISTS("004", "流程模型不存在"),
BPMN_BYTES_NOT_EXISTS("005", "模型定义内容字节码不存在"),
- MODEL_IS_DISABLE("006", "模型已经被停用")
+ 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;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
index 7824ba129..a7889dec2 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnProcessDefinitionRespCode.java
@@ -22,7 +22,8 @@ public enum BpmnProcessDefinitionRespCode implements IModuleRespCode {
PROCESS_DEFINITION_KEY_NOT_MATCH("007", "流程定义的标识不一致, 请修改 BPMN 流程图"),
PROCESS_DEFINITION_NAME_NOT_MATCH("008", "流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图"),
PROCESS_DEFINITION_HAS_DIRTY_DATA("009", "流程定义KEY【{}】存在脏数据,当前模型没有流程定义内容"),
- PROCESS_DEFINITION_IS_INVALID("010", "暂时无法发起,请先配置流程模型")
+ PROCESS_DEFINITION_IS_INVALID("010", "暂时无法发起,请先配置流程模型"),
+ PROCESS_DEFINITION_ID_ILLEGAL("011", "流程定义 ID 数据不合法")
;
private final String code;
private final String message;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
index 7a57b5303..5ef7f0586 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/BpmnTaskRespCode.java
@@ -41,6 +41,7 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
+ REMIND_TASK_TOO_MANY("027", "催办任务数据异常")
;
private final String code;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java
index d77523cab..8b878fffe 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java
@@ -16,6 +16,13 @@ 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;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
index 435901582..8742fc036 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormModelRespCode.java
@@ -13,7 +13,7 @@ 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", "表单模型已存在"),
;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
index 3c58f9e0e..c8d4f93f3 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java
@@ -19,7 +19,9 @@ public enum OtherRespCode implements IModuleRespCode {
CLIENT_VERSION_SUPPORT("004", "客户端 JAR 包版本不支持,请升级到 {} 版本, 当前版本 {}"),
MICRO_SERVER_NEED_REBUILD("005", "微服务 {} 需要重新编译发布, 如果是本地调用,请访问 WebApi 接口,在现有的接口地址前加上“web/v1/”即可"),
MESSAGE_PUSH_EVENT_BUILD_ERROR("006", "不能使用 createEvent 函数创建`发送待办`的事件, 请调用 createPendingPushEvent 函数"),
- ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败")
+ ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"),
+ ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"),
+ MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"),
;
private final String code;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
index c7d2b8406..b74f7a3f3 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java
@@ -9,6 +9,7 @@ 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_]";
@@ -33,6 +34,7 @@ public interface BpmnConstants {
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_]";
// 单任务节点,
@@ -41,6 +43,8 @@ public interface BpmnConstants {
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";
@@ -54,12 +58,14 @@ 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 CONFIG_APPROVE = "approveConfig";
String TEMPLATE_NOTICE_MESSAGE_CONFIG = "noticeMessageConfig";
@@ -71,6 +77,7 @@ public interface BpmnConstants {
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 APPROVE_SUPPORT_BATCH_OPERATION = "supportBatchOperation";
@@ -84,10 +91,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";
@@ -96,6 +107,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";
@@ -112,6 +124,7 @@ public interface BpmnConstants {
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";
/**
* 用于国内审批节点填写审批建议
*
@@ -199,4 +212,28 @@ public interface BpmnConstants {
* 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_]";
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java
index 2b4323bfc..5bbe9334b 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/FormConstants.java
@@ -17,4 +17,13 @@ public interface FormConstants {
String FIELD_PROPERTY_HIDDEN = "hidden";
String FIELD_PROPERTY_DEFAULT_VALUE= "defaultValue";
+
+ String FORM_FIELD_TYPE_INPUT = "input";
+ String FORM_FIELD_TYPE_TEXTAREA = "textarea";
+ String FORM_FIELD_TYPE_IMAGE = "image";
+ String FORM_FIELD_TYPE_CUSTOM_COMPONENT = "customComponent";
+ String FORM_FIELD_TYPE_TASK_ORDER = "taskOrder";
+ String FORM_FIELD_TYPE_RECTIFY_ORDER = "rectifyOrder";
+ String FORM_FIELD_TYPE_CHANGE_SIGNATURE_ORDER = "changeSignatureOrder";
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java
new file mode 100644
index 000000000..6e2d7a1ac
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/TaskListenerExtConstants.java
@@ -0,0 +1,12 @@
+package cn.axzo.workflow.common.constant;
+
+/**
+ * 自定义的流程回退及转发事件常亮
+ *
+ * @author wangli
+ * @since 2025-01-20 14:06
+ */
+public interface TaskListenerExtConstants {
+ String EVENTNAME_TRANSFER = "process-task-transfer";
+ String EVENTNAME_FALLBACK = "process-task-fallback";
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
index e525d91f9..b0ae9caa8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/VariableConstants.java
@@ -25,4 +25,40 @@ public interface VariableConstants {
String VAR_PROCESS_RESULT = "processResult";
String VAR_OPERATOR_TYPE = "operatorType";
String VAR_USER_AGREE_SIGNATURE = "userAgreeSignature";
+
+
+ //=============== 打印时的变量集合中 key 的命名 =================
+ String VAR_PREFIX = "业务变量";
+ String PRINT_VAR_PROCESS_DEFINITION_KEY = "processDefinitionKey";
+ String PRINT_VAR_PROCESS_DEFINITION_KEY_DESC = "业务名称";
+ String PRINT_VAR_PROCESS_INSTANCE_ID = "processInstanceId";
+ String PRINT_VAR_PROCESS_INSTANCE_ID_DESC = "审批编号";
+ String PRINT_VAR_PROCESS_START_TIME = "startTime";
+ String PRINT_VAR_PROCESS_START_TIME_DESC = "发起时间";
+ String PRINT_VAR_PROCESS_END_TIME = "endTime";
+ String PRINT_VAR_PROCESS_END_TIME_DESC = "审批结束时间";
+ String PRINT_VAR_PROCESS_INITIATOR = "initiator";
+ String PRINT_VAR_PROCESS_INITIATOR_DESC = "发起者";
+ String PRINT_VAR_PROCESS_INITIATOR_NAME = "initiatorName";
+ String PRINT_VAR_PROCESS_INITIATOR_NAME_DESC = "发起人姓名";
+ String PRINT_VAR_PROCESS_INITIATOR_POSITION = "initiatorPosition";
+ String PRINT_VAR_PROCESS_INITIATOR_POSITION_DESC = "发起人岗位";
+ String PRINT_VAR_PROCESS_INITIATOR_PHONE = "initiatorPhone";
+ String PRINT_VAR_PROCESS_INITIATOR_PHONE_DESC = "发起人联系方式";
+ String PRINT_VAR_PROCESS_LOGS = "processLogs";
+ String PRINT_VAR_PROCESS_LOGS_DESC = "审批日志";
+ String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME = "activityName";
+ String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC = "节点名称";
+ String PRINT_VAR_PROCESS_LOG_APPROVER_NAME = "approverName";
+ String PRINT_VAR_PROCESS_LOG_APPROVER_NAME_DESC = "审批人";
+ String PRINT_VAR_PROCESS_LOG_UNIT = "unit";
+ String PRINT_VAR_PROCESS_LOG_UNIT_DESC = "单位";
+ String PRINT_VAR_PROCESS_LOG_POSITION = "position";
+ String PRINT_VAR_PROCESS_LOG_POSITION_DESC = "岗位";
+ String PRINT_VAR_PROCESS_LOG_ADVICE = "advice";
+ String PRINT_VAR_PROCESS_LOG_ADVICE_DESC = "审批意见";
+ String PRINT_VAR_PROCESS_LOG_OPERATION_TIME = "operationTime";
+ String PRINT_VAR_PROCESS_LOG_OPERATION_TIME_DESC = "审批时间";
+ String PRINT_VAR_PROCESS_LOG_SIGNATURE = "signature";
+ String PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC = "电子签名";
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
index 2d6451b8e..5b8ab0b5e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApprovalMethodEnum.java
@@ -13,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;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
index 85dbab935..8b18cd082 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
@@ -15,6 +15,9 @@ public enum ApproverSpecifyEnum {
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管"),
fixedPerson("fixedPerson", "固定人员"),
preNodeSpecified("preNodeSpecified", "上级节点指定"),
+ initiatorSpecified("initiatorSpecified", "发起时指定"),
+ // 该枚举,目前主要为了区别签署业务与审批业务的不同配法,选择该项时,意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
+ signerRelated("signerRelated", "签署人相关组织"),
;
private String type;
private String desc;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
index 1e391dc38..dae4550d9 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnButtonEnum.java
@@ -1,6 +1,13 @@
package cn.axzo.workflow.common.enums;
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+import static cn.axzo.workflow.common.enums.BusinessTypeEnum.APPROVAL;
+import static cn.axzo.workflow.common.enums.BusinessTypeEnum.SIGN;
+
/**
* Flowable Event Enum For RocketMQ
*
@@ -11,39 +18,51 @@ 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_REMIND(11, "BPMN_REMIND", "催办", Lists.newArrayList(APPROVAL, SIGN)),
/**
* 管理员转交按钮
*/
- BPMN_ADMIN_TRANSFER(9, "BPMN_ADMIN_TRANSFER", "管理员转交");
+ BPMN_ADMIN_TRANSFER(90, "BPMN_ADMIN_TRANSFER", "管理员转交", Lists.newArrayList());
public int getOrder() {
@@ -58,15 +77,21 @@ public enum BpmnButtonEnum {
return btnName;
}
+ public List getSupportBizType() {
+ return supportBizType;
+ }
+
private final int order;
private final String btnKey;
private final String btnName;
+ private final List supportBizType;
- BpmnButtonEnum(int order, String btnKey, String btnName) {
+ BpmnButtonEnum(int order, String btnKey, String btnName, List supportBizType) {
this.order = order;
this.btnKey = btnKey;
this.btnName = btnName;
+ this.supportBizType = supportBizType;
}
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java
index 4f97157da..dfc36e971 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java
@@ -16,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", "机器人节点"),
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java
index 150ecbc35..eaa621a2e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java
@@ -44,7 +44,7 @@ public enum BpmnProcessInstanceResultEnum {
* @param result 结果
* @return 是否
*/
- public static boolean isEndResult(Integer result) {
+ public static boolean isEndResult(String result) {
return Arrays.asList(PROCESSING.getStatus(), APPROVED.getStatus(), REJECTED.getStatus(),
CANCELLED.getStatus()).contains(result);
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java
new file mode 100644
index 000000000..456dba759
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessTaskResultEnum.java
@@ -0,0 +1,29 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum BpmnProcessTaskResultEnum {
+ PENDING("PENDING", "待处理"),
+ APPROVED("APPROVED", "已同意"),
+ REJECTED("REJECTED", "已驳回"),
+ DELETED("DELETED", "已删除"),
+ CANCELED("CANCELED", "已撤销"),
+ TRANSFERRED("TRANSFERRED", "已转交"),
+ NONE("NONE", "没有执行动作,例如 抄送"),
+ ;
+ /**
+ * 结果
+ */
+ private final String status;
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ BpmnProcessTaskResultEnum(String status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java
new file mode 100644
index 000000000..fe46981d7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnSignType.java
@@ -0,0 +1,42 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 签署方式
+ *
+ * @author wangli
+ * @since 2025-03-25 17:00
+ */
+public enum BpmnSignType {
+
+ SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"),
+ MULTI("MULTI", "指定人群,每人签署一份文件"),
+ ;
+
+ private final String type;
+ private final String desc;
+
+ BpmnSignType(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static BpmnSignType valueOfType(String type) {
+ return Arrays.stream(BpmnSignType.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java
new file mode 100644
index 000000000..c44af52b2
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BusinessTypeEnum.java
@@ -0,0 +1,18 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum BusinessTypeEnum {
+
+ SIGN("sign", "签署业务"),
+
+ APPROVAL("approval", "审批业务");
+
+ private String type;
+ private String desc;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java
new file mode 100644
index 000000000..3f7dbdbbd
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ButtonVisibleScopeEnum.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ButtonVisibleScopeEnum {
+
+ INITIATOR("INITIATOR", "发起人"),
+
+ EXECUTOR("EXECUTOR", "当前操作人"),
+ ;
+
+ /**
+ * 结果
+ */
+ private final String status;
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ ButtonVisibleScopeEnum(String status, String desc) {
+ this.status = status;
+ this.desc = desc;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java
new file mode 100644
index 000000000..c8eab6afe
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/DocChangeEventEnum.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.enums;
+
+import cn.axzo.framework.rocketmq.Event;
+
+/**
+ * 流程模型关联的文档变更 MQ 事件枚举定义
+ *
+ * @author wangli
+ * @since 2025-04-07 16:46
+ */
+public enum DocChangeEventEnum {
+ DOC_CHANGE("doc", "doc-change", "模型关联文档变更"),
+ ;
+
+ private final String module;
+ private final String tag;
+ private final String desc;
+ private Event.EventCode eventCode;
+
+ DocChangeEventEnum(String module, String tag, String desc) {
+ this.eventCode = Event.EventCode.builder()
+ .module(module)
+ .name(tag)
+ .build();
+ this.module = module;
+ this.tag = tag;
+ this.desc = desc;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public String getTag() {
+ return tag;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Event.EventCode getEventCode() {
+ return eventCode;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java
new file mode 100644
index 000000000..f170a4a50
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ExtModelStateFieldEnum.java
@@ -0,0 +1,11 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 模型扩展表的状态枚举
+ *
+ * @author wangli
+ * @since 2025-01-15 09:46
+ */
+public enum ExtModelStateFieldEnum {
+ status, printStatus
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java
new file mode 100644
index 000000000..ae3c22c02
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FileTypeEnum.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 文档类型枚举
+ *
+ * @author wangli
+ * @since 2025-03-27 09:55
+ */
+public enum FileTypeEnum {
+ WORD("word", "文本", ".docx"),
+ EXCEL("excel", "表格", ".xlsx"),
+ HIPRINT("hiprint", "智能文档", ""),
+ PDF("pdf", "PDF", ".pdf"),
+ ;
+ private final String type;
+ private final String desc;
+ private final String suffix;
+
+ FileTypeEnum(String type, String desc, String suffix) {
+ this.type = type;
+ this.desc = desc;
+ this.suffix = suffix;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public String getSuffix() {
+ return suffix;
+ }
+
+ public static FileTypeEnum valueOfType(String type) {
+ return Arrays.stream(FileTypeEnum.values())
+ .filter(i -> Objects.equals(i.getType().toUpperCase(), type.toUpperCase()))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java
new file mode 100644
index 000000000..a4d5c1bee
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ModelBizTypeEnum.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 模型业务类型枚举
+ *
+ * @author wangli
+ * @since 2025-03-26 11:49
+ */
+public enum ModelBizTypeEnum {
+
+ SIGN("SIGN", "签署业务"),
+ FLOWABLE("FLOWABLE", "审批业务"),
+ ;
+ private final String type;
+ private final String desc;
+
+ ModelBizTypeEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static ModelBizTypeEnum valueOfType(String type) {
+ return Arrays.stream(ModelBizTypeEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java
new file mode 100644
index 000000000..805b79ded
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/OrderEnum.java
@@ -0,0 +1,12 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 顺序操作枚举
+ *
+ * @author wangli
+ * @since 2025-03-31 16:35
+ */
+public enum OrderEnum {
+
+ UP, DOWN
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java
new file mode 100644
index 000000000..1a29b3e16
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java
@@ -0,0 +1,19 @@
+package cn.axzo.workflow.common.enums;
+
+/**
+ * 打印字段的类型枚举
+ *
+ * @author wangli
+ * @since 2025-01-16 18:19
+ */
+public enum PrintFieldCategoryEnum {
+
+ // 表单变量
+ form,
+ // 流程内系统变量
+ system,
+ // 电子签名变量
+ signature,
+ // 签署业务自定义变量
+ sign
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
index f8885dadd..6d3300170 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessMessagePushEventEnum.java
@@ -17,6 +17,7 @@ public enum ProcessMessagePushEventEnum {
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 推送"),
;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
index cfe9b8531..cd205223c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ProcessTaskEventEnum.java
@@ -2,6 +2,9 @@ package cn.axzo.workflow.common.enums;
import cn.axzo.framework.rocketmq.Event;
+import static cn.axzo.workflow.common.constant.TaskListenerExtConstants.EVENTNAME_FALLBACK;
+import static cn.axzo.workflow.common.constant.TaskListenerExtConstants.EVENTNAME_TRANSFER;
+
/**
* 流程任务节点相关的 MQ 事件枚举定义
*
@@ -12,6 +15,8 @@ public enum ProcessTaskEventEnum {
PROCESS_TASK_ASSIGNED("process-task", "process-task-assigned", "流程任务已分配"),
PROCESS_TASK_CREATED("process-task", "process-task-created", "流程任务已创建"),
+ PROCESS_TASK_TRANSFER("process-task", EVENTNAME_TRANSFER, "流程任务已转交"),
+ PROCESS_TASK_FALLBACK("process-task", EVENTNAME_FALLBACK, "流程任务已回退"),
PROCESS_TASK_COMPLETED("process-task", "process-task-completed", "流程任务已结束"),
PROCESS_TASK_DELETED("process-task", "process-task-deleted", "流程任务已删除"),
;
@@ -45,4 +50,5 @@ public enum ProcessTaskEventEnum {
public Event.EventCode getEventCode() {
return eventCode;
}
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java
new file mode 100644
index 000000000..922a108ea
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverOrgLimitEnum.java
@@ -0,0 +1,51 @@
+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),
+ ;
+
+ private final String type;
+
+ private final String desc;
+
+ private final Integer code;
+
+ SignApproverOrgLimitEnum(String type, String desc, Integer code) {
+ this.type = type;
+ this.desc = desc;
+ this.code = code;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public static SignApproverOrgLimitEnum valueOfType(String type) {
+ return Arrays.stream(SignApproverOrgLimitEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java
new file mode 100644
index 000000000..2323fda54
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/SignApproverRoleLimitEnum.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 签署确认节点的审批人层级范围限制
+ *
+ * @author wangli
+ * @since 2025-03-26 14:30
+ */
+public enum SignApproverRoleLimitEnum {
+ LEADER("LEADER", "负责人"),
+ ;
+
+ private final String type;
+
+ private final String desc;
+
+ SignApproverRoleLimitEnum(String type, String desc) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public static SignApproverRoleLimitEnum valueOfType(String type) {
+ return Arrays.stream(SignApproverRoleLimitEnum.values())
+ .filter(i -> Objects.equals(i.getType(), type))
+ .findAny()
+ .orElse(null);
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java
new file mode 100644
index 000000000..bbfd8227f
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/VarTypeEnum.java
@@ -0,0 +1,21 @@
+package cn.axzo.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * 模版上变量字段类型
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum VarTypeEnum {
+
+ TEXT("text", "文本"),
+
+ PICTURE("picture", "图片");
+
+ private String type;
+ private String desc;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
index 57b915fd1..9a5e1f918 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/exception/WorkflowEngineException.java
@@ -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;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java
new file mode 100644
index 000000000..d51003baf
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/AmountFieldDTO.java
@@ -0,0 +1,33 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 金额字段值类型
+ *
+ * @author wangli
+ * @since 2025-05-16 17:21
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class AmountFieldDTO implements Serializable {
+ private static final long serialVersionUID = -3519991080707599177L;
+
+ /**
+ * 小写
+ */
+ private BigDecimal standardNumerals;
+
+ /**
+ * 大写
+ */
+ private String uppercaseNumerals;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java
new file mode 100644
index 000000000..1a110eaad
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/BizDocDTO.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 模型关联文档变更事件内部传输对象
+ *
+ * @author wangli
+ * @since 2025-04-07 16:53
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BizDocDTO implements Serializable {
+
+ private String archiveName;
+
+ private String archiveCode;
+
+ private Boolean enabled;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java
new file mode 100644
index 000000000..2ff8b1e85
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/ContactsPersonDTO.java
@@ -0,0 +1,69 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 通讯录组件返回的人员信息模型
+ *
+ * @author wangli
+ * @since 2025-05-15 14:04
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ContactsPersonDTO {
+ /**
+ * xx:xx:xx
+ */
+ private String nodeId;
+
+ /**
+ * 身份 ID
+ */
+ private Long identityId;
+
+ /**
+ * 身份类型
+ */
+ private Integer identityType;
+
+ /**
+ * 真实姓名
+ */
+ private String realName;
+
+ /**
+ * 自然人 ID
+ */
+ private Long personId;
+
+ /**
+ * 人员所在的节点 ID
+ */
+ private Long orgNodeId;
+
+ /**
+ * 人员所在的单位 ID
+ */
+ private Long ouId;
+
+ /**
+ * 人员所在的单位名称
+ */
+ private String ouName;
+
+ /**
+ * 人员所在的工作台 ID
+ */
+ private Long workspaceId;
+
+ /**
+ * 人员所在的工作台类型
+ */
+ private Integer workspaceType;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java
new file mode 100644
index 000000000..852f91181
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignFileDTO.java
@@ -0,0 +1,60 @@
+package cn.axzo.workflow.common.model.dto;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 签署文件记录信息
+ *
+ * @author wangli
+ * @since 2025-04-03 11:21
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SignFileDTO implements Serializable {
+
+ private static final long serialVersionUID = -8709597975507074853L;
+ /**
+ * 文件模板主键 ID
+ */
+ private Long id;
+
+ /**
+ * 文件名称,可能会包含变量
+ */
+ private String fileName;
+
+ /**
+ * 模板名称
+ */
+ private String templateName;
+
+ /**
+ * 文件的标签
+ */
+ private String fileTag;
+
+ /**
+ * 文件 code
+ */
+ private String fileCode;
+
+ /**
+ * 文件的类型
+ */
+ private FileTypeEnum fileType;
+
+ /**
+ * 替换变量后的文件 fileKey
+ */
+ private String fileKey;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java
new file mode 100644
index 000000000..183722818
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SignatureDTO.java
@@ -0,0 +1,45 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 节点的电子签名数据
+ *
+ * @author wangli
+ * @since 2025-01-15 20:11
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SignatureDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ * 节点 ID
+ */
+ private String activityId;
+ /**
+ * 节点名称
+ */
+ private String activityName;
+ /**
+ * 签名图片数据有序集合
+ */
+ private List signatures;
+
+ @Data
+ @Accessors(chain = true)
+ public static class SignDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private String signature;
+ private String advice;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java
new file mode 100644
index 000000000..0210c2a47
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleDocDTO.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 审批人在不同任务下,关联文档的阅读状态
+ *
+ * @author wangli
+ * @since 2025-04-08 13:59
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SimpleDocDTO implements Serializable {
+ /**
+ * 关联的文档 ID
+ */
+ private Long id;
+
+ /**
+ * 关联的文档业务标签
+ */
+ private String tag;
+
+ /**
+ * 阅读状态: true 已读
+ */
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java
new file mode 100644
index 000000000..d075b7194
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 业务节点添加定时任务的模型
+ *
+ * @author wangli
+ * @since 2025-03-19 16:33
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TermNodeAddTimerJobDTO implements Serializable {
+ private String processInstanceId;
+ private String activityId;
+ private String timeCycle;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java
index 5093f46db..1eeede655 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/UploadFieldDTO.java
@@ -1,10 +1,12 @@
package cn.axzo.workflow.common.model.dto;
-import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.io.Serializable;
+
/**
* 上传附件字段类型
*
@@ -14,9 +16,10 @@ import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
-@Deprecated // 这个类型不应该产生,建议后面迭代替换为 AttachmentDTO
-public class UploadFieldDTO {
+@Builder
+public class UploadFieldDTO implements Serializable {
+ private static final long serialVersionUID = -1L;
/**
* 文件名称
*/
@@ -25,24 +28,11 @@ public class UploadFieldDTO {
/**
* 文件类型
*/
- private String fileType;
+ private String fileUrl;
/**
* 文件 oss 的 key
*/
private String fileKey;
- public String toString() {
- return JSON.toJSONString(this);
- }
-
- public String toSpecString() {
- return this.toString().replaceAll(",", "|");
- }
-
- public static UploadFieldDTO toObject(String str) {
- str = str.trim().replaceAll("\\|",",");
- return JSON.parseObject(str, UploadFieldDTO.class);
- }
-
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java
new file mode 100644
index 000000000..4523937f7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/VariableObjectDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 从流程实例中获取变量,携带数据类型的对象
+ *
+ * @author wangli
+ * @since 2025-04-09 11:46
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class VariableObjectDTO {
+
+ public enum Type {
+ img, text, obj, signatureAndAdvice
+ }
+
+ /**
+ * 变量 key
+ */
+ private String key;
+
+ /**
+ * 变量中文名
+ */
+ private String desc;
+
+ /**
+ * 变量值
+ */
+ private Object value;
+
+ /**
+ * 变量类型
+ */
+ @Builder.Default
+ private Type type = Type.text;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java
index 9afc03396..d0e0cc31d 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/es/HistoricProcessInstanceSearchForEsDTO.java
@@ -68,6 +68,7 @@ public class HistoricProcessInstanceSearchForEsDTO {
*
* 默认是查询开始时间之后
*/
+ @Builder.Default
private TimeQueryDirection startTimeDirection = TimeQueryDirection.AFTER;
/**
@@ -80,16 +81,19 @@ public class HistoricProcessInstanceSearchForEsDTO {
*
* 默认是查询结束时间点之前
*/
+ @Builder.Default
private TimeQueryDirection endTimeDirection = TimeQueryDirection.BEFORE;
/**
* 是否包含流程变量
*/
+ @Builder.Default
private Boolean hasVariables = false;
/**
* 用于覆盖同步逻辑中的PageSize,一般不需要传
*/
+ @Builder.Default
private Integer overPageSize = 50;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java
new file mode 100644
index 000000000..0c1052145
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/FieldAttributeDTO.java
@@ -0,0 +1,31 @@
+package cn.axzo.workflow.common.model.dto.print;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 字段属性
+ *
+ * @author wangli
+ * @since 2025-01-16 17:31
+ */
+@Data
+@ApiModel("打印时的字段的扩展属性模型")
+@NoArgsConstructor
+@Accessors(chain = true)
+public class FieldAttributeDTO {
+
+ /**
+ * 属性 code
+ */
+ private String code;
+
+ /**
+ * 属性名称
+ */
+ private String name;
+
+ private String fieldFormType;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java
new file mode 100644
index 000000000..078b9c544
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/print/PrintFieldDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.dto.print;
+
+import cn.axzo.workflow.common.enums.PrintFieldCategoryEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 打印时的字段模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:09
+ */
+@ApiModel("打印时的字段模型")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class PrintFieldDTO {
+ /**
+ * 字段中文名称
+ */
+ private String name;
+ /**
+ * 字段类型(表单字段、系统字段)
+ */
+ private PrintFieldCategoryEnum fieldCategoryType;
+
+ /**
+ * 用于替换是变量名
+ */
+ private String code;
+
+ /**
+ * 字段的表单的类型
+ */
+ private String fieldFormType;
+
+ /**
+ * 复杂组件的扩展字段,例如“自定义组件”,“审批日志”组件等
+ */
+ private List attributes;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
index 91a566e5c..640809192 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/BpmPageParam.java
@@ -10,6 +10,7 @@ import java.io.Serializable;
@ApiModel("分页参数")
public class BpmPageParam implements Serializable {
+ private static final long serialVersionUID = -7002013785995706695L;
private static final Integer PAGE_NO = 1;
private static final Integer PAGE_SIZE = 10;
@ApiModelProperty(value = "页码,从 1 开始", required = true, example = "1")
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
index 3bd00b61d..2b7ea5f75 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnButtonMetaInfo.java
@@ -1,9 +1,12 @@
package cn.axzo.workflow.common.model.request.bpmn;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
/**
* 按钮元数据
@@ -15,6 +18,11 @@ import java.io.Serializable;
@Accessors(chain = true)
public class BpmnButtonMetaInfo implements Serializable {
+ public static final String BUTTON_TYPE_SYSTEM = "SYSTEM";
+ public static final String BUTTON_TYPE_CUSTOM = "CUSTOM";
+
+ private static final long serialVersionUID = -5224316166904752829L;
+
/**
* 按钮顺序
*/
@@ -45,4 +53,9 @@ public class BpmnButtonMetaInfo implements Serializable {
*/
private String type;
+ /**
+ * 按钮支持的业务类型
+ */
+ private List supportBizType = new ArrayList<>();
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
index 492adcf71..0c511be70 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonModel.java
@@ -27,6 +27,11 @@ public class BpmnJsonModel implements Serializable {
@ApiModelProperty(value = "流程的 Json 结构")
private BpmnJsonNode node;
+ /**
+ * 签署配置, 可为空,只有签署业务才有该配置
+ */
+ @ApiModelProperty(value = "签署配置")
+ private BpmnSignConf signConf;
/**
* 通知管理配置
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
index 6b0681ba6..c9eeb68ef 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNodeProperty.java
@@ -45,13 +45,19 @@ public class BpmnJsonNodeProperty {
//************* 审批人指定Start **************//
/**
* 审批人指定: position(指定岗位), role(指定角色), identity(指定身份), initiatorLeader(发起人主管), initiatorLeaderRecursion(发起人多级主管),
- * fixedPerson(固定人员)
+ * fixedPerson(固定人员) initiatorSpecified(发起人自选) signerRelated(签署人相关组织)
*/
@ApiModelProperty(value = "任务节点: 审批人指定", notes = "position: 指定岗位, role: 指定角色, identity: 指定身份, initiatorLeader: " +
- "发起人主管, initiatorLeaderRecursion: 发起人多级主管, fixedPerson: 固定人员")
+ "发起人主管, initiatorLeaderRecursion: 发起人多级主管, fixedPerson: 固定人员, initiatorSpecified: 发起人自选, signerRelated: 签署人相关组织")
@NotBlank(message = "审批人指定不能为空")
private ApproverSpecifyEnum approverSpecify;
+ /**
+ * 签署确认节点的审批人限定规则
+ */
+ @ApiModelProperty(value = "签署确认节点的审批人限定规则")
+ private BpmnSignApproverLimit signApproverLimit;
+
/**
* 具体的配置值
*
@@ -94,6 +100,11 @@ public class BpmnJsonNodeProperty {
private String emptyApproverSpecify;
//************* 审批人为空时的策略End **************//
+ /**
+ * 电子签名开关
+ */
+ @ApiModelProperty(value = "电子签名")
+ private Boolean signature;
/**
* 按钮权限
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java
new file mode 100644
index 000000000..d49918167
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignApproverLimit.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
+import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * JSON 版本的 BPMN 协议模型中的确认人限定规则
+ *
+ * @author wangli
+ * @since 2025-03-26 20:05
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的确认人限定规则")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignApproverLimit {
+
+ /**
+ * 签署确认节点下人的组织限定规则
+ *
+ * LV_0("LV_0", "当前组织"),
+ * LV_1("LV_1", "上1级组织"),
+ * LV_2("LV_2", "上2级组织"),
+ * LV_3("LV_3", "上3级组织"),
+ * LV_4("LV_4", "上4级组织"),
+ * LV_5("LV_5", "上5级组织"),
+ */
+ @ApiModelProperty(value = "签署确认节点下人的组织限定规则")
+ private SignApproverOrgLimitEnum orgLimit;
+
+ /**
+ * 签署确认节点下人的角色限定规则
+ *
+ * INITIATOR_SPECIFIED("INITIATOR_SPECIFIED", "发起人自选"),
+ * LEADER("LEADER", "负责人"),
+ */
+ @ApiModelProperty(value = "签署确认节点下人的角色限定规则")
+ private SignApproverRoleLimitEnum roleLimit;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java
new file mode 100644
index 000000000..f88d150ba
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignConf.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import cn.axzo.workflow.common.enums.BpmnSignType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 流程定义中的签署配置
+ *
+ * @author wangli
+ * @since 2025-03-25 16:56
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的签署管理")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignConf implements Serializable {
+
+ private static final long serialVersionUID = -6015492451455020117L;
+
+ /**
+ * 签署方式
+ *
+ * SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"),
+ * MULTI("MULTI", "指定人群,每人签署一份文件"),
+ */
+ @ApiModelProperty(value = "签署方式")
+ private BpmnSignType signType;
+
+ /**
+ * 签署业务待办模板
+ */
+ @ApiModelProperty(value = "签署业务待办模板")
+ private BpmnSignPendingProperty signPendingProperty;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java
new file mode 100644
index 000000000..89da2289b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnSignPendingProperty.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.common.model.request.bpmn;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * JSON 版本的 BPMN 协议模型中的签署的待办
+ *
+ * @author wangli
+ * @since 2025-03-25 17:09
+ */
+@ApiModel("JSON 版本的 BPMN 协议模型中的签署的待办")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class BpmnSignPendingProperty implements Serializable {
+ private static final long serialVersionUID = -6015492451455020117L;
+
+ /**
+ * 待办消息模板 ID
+ */
+ @ApiModelProperty(value = "待办消息模板 ID")
+ @NotBlank(message = "待办消息模板 ID 不能为空")
+ private String pendingMessageId;
+
+ /**
+ * 用于前端回显数据, 服务端不解析
+ */
+ @ApiModelProperty(value = "用于前端回显数据, 服务端不解析")
+ private String viewJson;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
index 91c8e401f..e2833ef2f 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelCreateDTO.java
@@ -20,6 +20,8 @@ import java.io.Serializable;
@Accessors(chain = true)
public class BpmnModelCreateDTO implements Serializable {
+ private static final long serialVersionUID = 1383240088010310865L;
+
@ApiModelProperty(value = "流程模型标识", example = "process_key", hidden = true)
@Length(max = 255, message = "流程标识最长只支持255个字符")
private String key;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
index f7826dd46..7e5e7d735 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/BpmnModelUpdateDTO.java
@@ -16,6 +16,8 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
public class BpmnModelUpdateDTO extends BpmnModelCreateDTO {
+ private static final long serialVersionUID = 3661214238064751897L;
+
@ApiModelProperty(value = "流程模型 ID", required = true)
private String processModelId;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java
new file mode 100644
index 000000000..c1603a14c
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocByIdDTO.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 获取文档
+ *
+ * @author wangli
+ * @since 2025-04-16 20:18
+ */
+@ApiModel("获取文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocByIdDTO {
+
+ private List ids;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java
new file mode 100644
index 000000000..0ba48428d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCloneDTO.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 克隆文档
+ *
+ * @author wangli
+ * @since 2025-04-18 11:30
+ */
+@ApiModel("克隆文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocCloneDTO {
+ /**
+ * 文档 ID
+ */
+ private Long docId;
+ /**
+ * 克隆好的文档归属模型 ID
+ */
+ private String targetModelId;
+ /**
+ * 克隆好的文档归属租户
+ */
+ private String targetTenantId;
+
+ /**
+ * 克隆好的文档的 tag
+ */
+ private String targetFileTag;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java
new file mode 100644
index 000000000..ad264818b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocCreateDTO.java
@@ -0,0 +1,121 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 创建模型关联的文档
+ *
+ * @author wangli
+ * @since 2025-03-27 14:50
+ */
+@ApiModel("创建模型关联的文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocCreateDTO implements Serializable {
+
+ /**
+ * 关联到的模型 ID
+ */
+ @ApiModelProperty(value = "文档被关联到的模型 ID")
+ @NotBlank(message = "模型 ID 不能为空")
+ private String modelId;
+
+ /**
+ * 模型对应业务 KEY
+ */
+ @ApiModelProperty(value = "模型对应的业务 ID")
+ @NotBlank(message = "模型 KEY 不能为空")
+ private String modelKey;
+ /**
+ * 文档关联ID
+ *
+ * word/excel 对应 wps 的 Id,
+ * hp 对应是content 表的主键(前端新建时不回传)
+ * pdf 对应 oss 中的 fileKey
+ */
+ @ApiModelProperty(value = "底层文件关联标识")
+ private String fileRelationId;
+
+ /**
+ * 文件名称
+ */
+ @ApiModelProperty(value = "文件名称")
+ private String fileName;
+
+ /**
+ * 模板名称
+ */
+ @ApiModelProperty(value = "模板名称")
+ private String templateName;
+
+ /**
+ * 自动归档位置(本期不实现)
+ */
+ private String location;
+
+ /**
+ * 文档类型
+ *
+ * WORD("word", "文本"),
+ * EXCEL("excel", "表格"),
+ * HIPRINT("hiprint", "智能文档"),
+ * PDF("pdf", "PDF"),
+ */
+ @ApiModelProperty(value = "文件类型")
+ private FileTypeEnum fileType;
+
+ /**
+ * 业务标签
+ */
+ @ApiModelProperty(value = "业务标签")
+ private String tag;
+
+ /**
+ * 启用状态
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "启用状态")
+ private Boolean status = true;
+
+ /**
+ * 是否是临时文件
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "是否是临时文件,默认 false")
+ private Boolean tempFile = false;
+ /**
+ * 是否必选
+ */
+ @Builder.Default
+ @ApiModelProperty(value = "是否必选")
+ private Boolean require = false;
+
+ /**
+ * HiPrint文件类型,需要回传
+ */
+ @ApiModelProperty(value = "HiPrint文件类型,需要回传,其他类型无视该字段")
+ private String content;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ @Builder.Default
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java
new file mode 100644
index 000000000..ae24e1c55
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocOrderDTO.java
@@ -0,0 +1,36 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.OrderEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 模型关联的文档排序
+ *
+ * @author wangli
+ * @since 2025-03-31 16:32
+ */
+@ApiModel("模型关联的文档排序")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocOrderDTO implements Serializable {
+ private static final long serialVersionUID = -4783444148609103421L;
+ /**
+ * 文档主键 ID
+ */
+ private Long id;
+
+ /**
+ * 操作顺序
+ */
+ private OrderEnum order;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java
new file mode 100644
index 000000000..a709c868a
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocQueryDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 流程关联文档搜索入参模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:46
+ */
+@ApiModel("流程关联文档搜索入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocQueryDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ private String processInstanceId;
+
+ /**
+ * 流程定义 KEY(业务 ID)
+ */
+ @ApiModelProperty(value = "流程定义 KEY(业务 ID)")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID,对应工作台 ID
+ */
+ @ApiModelProperty(value = "租户 ID,对应工作台 ID")
+ private String tenantId;
+
+ @ApiModelProperty(value = "是否包含临时文档")
+ @Builder.Default
+ private Boolean tempFile = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java
new file mode 100644
index 000000000..08b571111
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocResetDTO.java
@@ -0,0 +1,29 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@ApiModel("流程关联文档重置入参模型")
+@Data
+public class DocResetDTO {
+
+ /**
+ * 业务 ID
+ */
+ @NotBlank(message = "业务 ID 不能为空")
+ private String category;
+
+ /**
+ * 代运营模型 ID
+ */
+ @NotBlank(message = "模型 ID 不能为空")
+ private String modelId;
+
+ /**
+ * 代运营的单位或租户ID
+ */
+ @NotBlank(message = "工作台 ID 不能为空")
+ private String workspaceId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java
new file mode 100644
index 000000000..8eece5314
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocSearchDTO.java
@@ -0,0 +1,34 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import cn.axzo.workflow.common.model.request.BpmPageParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 流程关联文档搜索入参模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:46
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("流程关联文档搜索入参模型")
+@Data
+public class DocSearchDTO extends BpmPageParam {
+
+ private static final long serialVersionUID = -308388315001754954L;
+ /**
+ * 流程模型 ID
+ */
+ @ApiModelProperty(value = "模型 ID")
+ private String modelId;
+
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+
+ @ApiModelProperty(value = "是否包含临时文档")
+ private Boolean tempFile = false;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java
new file mode 100644
index 000000000..ba091cf13
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocStatusDTO.java
@@ -0,0 +1,32 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 流程关联文档状态变更入参模型
+ *
+ * @author wangli
+ * @since 2025-04-07 11:44
+ */
+@ApiModel("流程关联文档状态变更入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocStatusDTO {
+ /**
+ * 文档 ID
+ */
+ @ApiModelProperty(value = "文档 ID")
+ private Long id;
+
+ /**
+ * 状态 true 启用, false 停用
+ */
+ private Boolean status;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java
new file mode 100644
index 000000000..3a3cb16b7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocTenantQueryDTO.java
@@ -0,0 +1,30 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 查询指定业务下设置过关联文档的代运营项目集合入参
+ *
+ * @author wangli
+ * @since 2025-04-10 17:57
+ */
+@ApiModel("查询指定业务下设置过关联文档的代运营项目集合入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DocTenantQueryDTO {
+
+ /**
+ * 业务ID
+ */
+ @NotBlank(message = "业务 ID 不能为空")
+ private String processDefinitionKey;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java
new file mode 100644
index 000000000..ef270fa99
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/model/doc/DocUpdateDTO.java
@@ -0,0 +1,30 @@
+package cn.axzo.workflow.common.model.request.bpmn.model.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 创建模型关联的文档
+ *
+ * @author wangli
+ * @since 2025-03-27 14:50
+ */
+@ApiModel("创建模型关联的文档")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class DocUpdateDTO extends DocCreateDTO implements Serializable {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java
new file mode 100644
index 000000000..3775f63e5
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintFieldQueryDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 获取指定打印模板可打印的字段集合的查询入参模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:42
+ */
+@ApiModel("获取指定打印模板可打印的字段集合的查询入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintFieldQueryDTO {
+
+ /**
+ * 模板定义 KEY
+ */
+ @ApiModelProperty(value = "流程模板 KEY")
+ @NotBlank(message = "流程模板 KEY 不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+
+ /**
+ * 是否抛出内部异常
+ */
+ @ApiModelProperty(value = "是否报错内部异常")
+ @Builder.Default
+ private Boolean throwException = true;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java
new file mode 100644
index 000000000..c5e4503b6
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigQueryDTO.java
@@ -0,0 +1,48 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
+
+/**
+ * 获取打印模板配置内容入参模型
+ *
+ * @author wangli
+ * @since 2025-01-20 16:53
+ */
+@ApiModel("获取打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintTemplateConfigQueryDTO {
+
+ /**
+ * 审批模型 ID
+ */
+ @ApiModelProperty(value = "审批模型 ID")
+ private String modelId;
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ private String processInstanceId;
+
+ /**
+ * 业务 ID
+ */
+ @ApiModelProperty(value = "业务 ID")
+ private String processDefinitionKey;
+
+ /**
+ * 租户 ID,配置 processDefinitionKey 使用
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId = NO_TENANT_ID;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java
new file mode 100644
index 000000000..432d33d31
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintTemplateConfigUpsertDTO.java
@@ -0,0 +1,46 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 打印模板配置内容入参模型
+ *
+ * @author wangli
+ * @since 2025-01-20 16:44
+ */
+@ApiModel("打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PrintTemplateConfigUpsertDTO {
+
+ /**
+ * 审批模型 ID
+ */
+ @ApiModelProperty("审批模型 ID")
+ private String modelId;
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板配置内容
+ */
+ @ApiModelProperty(value = "打印模板配置内容")
+ private String printTemplateConfig;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java
new file mode 100644
index 000000000..d05f50c1e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/RestPrintTemplateConfigDTO.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.model.request.bpmn.print;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 重置打印模型(代运营专用)
+ *
+ * @author wangli
+ * @since 2025-01-20 19:55
+ */
+@ApiModel("打印模板配置内容入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RestPrintTemplateConfigDTO {
+
+ /**
+ * 模板的定义 ID
+ */
+ @ApiModelProperty(value = "模板的定义 ID")
+ @NotBlank(message = "模型定义 ID 不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 代运营模型 ID
+ */
+ @ApiModelProperty(value = "代运营模型 ID")
+ @NotBlank(message = "代运营模板 ID不能为空")
+ private String modelId;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java
new file mode 100644
index 000000000..f5e5a90f8
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BeforeProcessInstanceCreateDTO.java
@@ -0,0 +1,68 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 创建审批流程前的入参模型
+ *
+ * @author wangli
+ * @since 2025-01-15 10:21
+ */
+@ApiModel("创建流程实例前的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BeforeProcessInstanceCreateDTO {
+ /**
+ * 流程定义的标识
+ *
+ * [对应 OMS 系统中审批业务的业务 ID]
+ */
+ @ApiModelProperty(value = "业务 ID")
+ @NotEmpty(message = "流程定义的标识不能为空")
+ private String processDefinitionKey;
+
+ /**
+ * 发起流程实例归属租户 ID
+ *
+ * 为空时,默认是编辑公共流程模型, 如果是代运营创建,则必填
+ *
建议都传值,在安心筑中对应工作台 ID
+ */
+ @ApiModelProperty(value = "发起的审批是属于哪个租户")
+ @NotBlank(message = "工作台 ID 不能为空")
+ private String tenantId;
+
+ /**
+ * 组织关系
+ *
+ * 用于流程引擎计算对应节点的审批人, 例如第一个审批节点配置的是劳务分包的岗位,第二个审批节点配置的专业分包的角色,
+ * 那么, 组织关系就需要传入劳务分包的信息以及专业分包的信息,如果还有更多的审批节点配置,以此类推.
+ * 同时,该属性还会用于计算抄送人,以及消息通知的目标接收人
+ */
+ @ApiModelProperty(value = "组织关系")
+ private CooperationOrgDTO cooperationOrg;
+
+ @ApiModelProperty(value = "发起人信息")
+ @Valid
+ private BpmnTaskDelegateAssigner initiator;
+
+ /**
+ * 最后响应的结果中,过滤出需要的类型
+ */
+ @ApiModelProperty(value = "流程节点过滤类型")
+ private List filter;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
index a98fcdebf..474fdf003 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAbortDTO.java
@@ -98,5 +98,6 @@ public class BpmnProcessInstanceAbortDTO {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
index bfc30538a..09f65b23c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceAdminPageReqVO.java
@@ -4,6 +4,7 @@ import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@@ -15,11 +16,13 @@ import java.util.List;
* @author wangli
* @since 06/03/2024 2:35 pm
*/
+@EqualsAndHashCode(callSuper = true)
@ApiModel("用于超管查询所有的流程实例入参模型")
@Data
@ToString(callSuper = true)
public class BpmnProcessInstanceAdminPageReqVO extends BpmPageParam {
+ private static final long serialVersionUID = 5051264217867881829L;
/**
* 流程实例 ID
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
index e8234cf80..0296fc6b8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java
@@ -5,12 +5,13 @@ import cn.axzo.workflow.common.constraint.AttachmentValidator;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import cn.axzo.workflow.common.valid.group.ValidGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
-import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
@@ -28,21 +29,21 @@ import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
-@Builder
+@SuperBuilder
public class BpmnProcessInstanceCancelDTO {
/**
* 流程实例的编号
*/
@ApiModelProperty(value = "流程实例编号", example = "11")
- @NotBlank(message = "流程实例编号不能为空")
+ @NotBlank(message = "流程实例编号不能为空", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
private String processInstanceId;
/**
* 工作台 ID
*/
@ApiModelProperty(value = "工作台 ID")
- @NotBlank(message = "工作台不能为空")
+ @NotBlank(message = "工作台不能为空", groups = ValidGroup.Insert.class)
private String tenantId;
/**
@@ -55,12 +56,12 @@ public class BpmnProcessInstanceCancelDTO {
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
- @Size(max = 11, message = "附件数量超过限制")
+ @Size(max = 11, message = "附件数量超过限制", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
@AttachmentValidator(types = {
@AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
@AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
@AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
- )
+ , groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
private List attachmentList;
/**
@@ -75,7 +76,7 @@ public class BpmnProcessInstanceCancelDTO {
*/
@ApiModelProperty(value = "审批流程发起人信息")
@Valid
- @NotNull(message = "审批流程的发起人不能为空")
+ @NotNull(message = "审批流程的发起人不能为空", groups = {ValidGroup.Insert.class, ValidGroup.Update.class})
private BpmnTaskDelegateAssigner initiator;
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
index b92ae5fe7..2c1a7e542 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.constant.BpmnConstants;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
@@ -14,6 +15,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -50,14 +52,28 @@ public class BpmnProcessInstanceCreateDTO extends BpmnProcessInstanceCreateWithF
@NotBlank(message = "工作台 ID 不能为空")
private String tenantId;
+ /**
+ * 流程在发起时指定审批人
+ */
+ @ApiModelProperty(value = "发起时指定节点的审批人")
+ private Map*节点标识*/String, List> specifyAssignerMap;
+
/**
* 流程实例关联的变量
*/
+ @Builder.Default
private Map variables = new HashMap<>();
+ /**
+ * 业务管理中定义变量的入参
+ */
+ @Builder.Default
+ private Map bizCustomVariables = new HashMap<>();
+
/**
* 待办相关的变量,如路由参数, 模板参数等等
*/
+ @Builder.Default
private Map pendingVariables = new HashMap<>();
/**
@@ -94,6 +110,19 @@ public class BpmnProcessInstanceCreateDTO extends BpmnProcessInstanceCreateWithF
* 是否异步执行,该异步是引擎的一种运行模式
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
+ /**
+ * 签署业务,发起时,可基于模型启用的模板,再勾选使用本次发起时选择的文档标签
+ */
+ @ApiModelProperty(value = "签署业务发起时,选择的文档")
+ private List docIds;
+
+ /**
+ * 仅针对签署业务,设置审批完成后的最终签署人列表,该属性仅为透传,业务消费时,请从 MQ 广播事件中的 variables 中通过 key= {@link BpmnConstants#SIGNATORIES } 获取
+ */
+ @ApiModelProperty(value = "签署业务,最终签署人")
+ private List signatories;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
index c3bd147bb..c983e8d45 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateWithFormDTO.java
@@ -1,12 +1,10 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
+import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import lombok.EqualsAndHashCode;
-import javax.validation.constraints.NotBlank;
-import java.util.HashMap;
import java.util.Map;
/**
@@ -17,10 +15,23 @@ import java.util.Map;
*/
@ApiModel("创建工作流实例同时携带表单的入参模型")
@Data
-public class BpmnProcessInstanceCreateWithFormDTO {
+public class BpmnProcessInstanceCreateWithFormDTO {
+ /**
+ * 审批使用了表单,请一定注意传参
+ *
+ * 图片类型和附件类型组件:请用 @see {@link UploadFieldDTO} 对象集合传入
+ *
+ * // form_image 为表单项的 key, value 为 UploadFileDTO 对象集合,如果前端使用了组件,一般建议回传所有属性;特殊情况下可以只传 fileUrl
+ * "form_image": [{
+ * "fileName": "",
+ * "fileUrl": "http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960",
+ * "fileKey": 123
+ * }]
+ *
+ */
@ApiModelProperty(value = "通过表单创建流程时传入的初始表单数据")
- private Map startFormVariables = new HashMap<>();
+ private Map startFormVariables;
/**
* 工作流实例集成表单后,可以通过表单 key 组装成的变量存入该变量的值,可用于后续流程的流转
*
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java
index 17e7ad583..e0a4841d7 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java
@@ -44,6 +44,7 @@ public class BpmnProcessInstanceLogQueryDTO {
* 返回结果中是否包含按钮
*/
@ApiModelProperty(value = "返回结果中是否包含按钮", notes = "如果访问者为空,该属性为 true 时,同样也不会返回按钮")
+ @Builder.Default
private Boolean hasButton = false;
/**
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java
new file mode 100644
index 000000000..80ba346d2
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceVariablesDTO.java
@@ -0,0 +1,24 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 获取流程实例中变量集合的入参模型
+ *
+ * @author wangli
+ * @since 2025-01-16 17:05
+ */
+@ApiModel("获取流程实例中变量集合的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnProcessInstanceVariablesDTO {
+
+ private String processInstanceId;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java
new file mode 100644
index 000000000..7773be65e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/SuperBpmnProcessInstanceCancelDTO.java
@@ -0,0 +1,26 @@
+package cn.axzo.workflow.common.model.request.bpmn.process;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 取消流程实例的入参模型
+ *
+ * @author wangli
+ * @since 2023/7/17 09:34
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("取消流程实例的入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class SuperBpmnProcessInstanceCancelDTO extends BpmnProcessInstanceCancelDTO {
+
+ private Boolean superAdmin;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java
new file mode 100644
index 000000000..3c7d1b9f5
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ApproverReadStatusDTO.java
@@ -0,0 +1,40 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 签署业务流程实例,查询审批的关联文档阅读状态入参
+ *
+ * @author wangli
+ * @since 2025-04-08 11:27
+ */
+@ApiModel("签署业务流程实例,查询审批的关联文档阅读状态入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class ApproverReadStatusDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 访问人
+ */
+ @ApiModelProperty(value = "访问人")
+ @NotNull(message = "访问人信息不能为空")
+ private BpmnTaskDelegateAssigner assigner;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java
new file mode 100644
index 000000000..3d04bbbde
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ChangeApproverReadStatusDTO.java
@@ -0,0 +1,36 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 签署业务流程实例,更新审批的关联文档阅读状态入参
+ *
+ * @author wangli
+ * @since 2025-04-08 14:50
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("签署业务流程实例,更新审批的关联文档阅读状态入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class ChangeApproverReadStatusDTO extends ApproverReadStatusDTO {
+ /**
+ * 文档ID
+ */
+ @ApiModelProperty(value = "文档 ID")
+ @NotNull(message = "文档 ID 不能为空")
+ private Long docId;
+
+ @ApiModelProperty(value = "阅读状态")
+ @NotNull(message = "阅读状态不能为空")
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java
new file mode 100644
index 000000000..6d6a21d06
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/doc/ProcessDocQueryDTO.java
@@ -0,0 +1,39 @@
+package cn.axzo.workflow.common.model.request.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 签署业务流程实例,在审批待办中查询文档列表的入参
+ *
+ * @author wangli
+ * @since 2025-04-03 16:30
+ */
+@ApiModel("签署业务流程实例,在审批待办中查询文档列表的入参")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ProcessDocQueryDTO {
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例 ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ * 只有当该属性传值后,响应模型中才会返回阅读状态信息
+ */
+ @ApiModelProperty(value = "访问者")
+ private BpmnTaskDelegateAssigner assigner;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
index 0aa49fac4..e0995aed8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java
@@ -65,4 +65,10 @@ public class AttachmentDTO implements Serializable {
@IndexField(fieldType = FieldType.KEYWORD)
private String url;
+ /**
+ * 文件 OSS 的 fileKey
+ */
+ @ApiModelProperty(value = "附件 oss 的 fileKey")
+ private String fileKey;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
index 0fbf1924c..baa69fe44 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java
@@ -7,7 +7,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
@@ -62,12 +61,14 @@ public class BpmnActivitySetAssigneeDTO {
*
* 如果业务不能接受,请自己主动去重后提交.
*/
+ @Builder.Default
private Boolean serverSideDeduplication = false;
/**
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java
index bc7356233..be10451a9 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivityTriggerDTO.java
@@ -36,6 +36,7 @@ public class BpmnActivityTriggerDTO implements Serializable {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
/**
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java
new file mode 100644
index 000000000..c01572e98
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnNodeBackSystemOperateDTO.java
@@ -0,0 +1,67 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import cn.axzo.workflow.common.constraint.AttachmentTypeValidator;
+import cn.axzo.workflow.common.constraint.AttachmentValidator;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 审批节点退回模型
+ *
+ */
+@ApiModel("审批节点退回模型")
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class BpmnNodeBackSystemOperateDTO implements Serializable {
+
+ private static final long serialVersionUID = -4160538355403179298L;
+
+ @ApiModelProperty(value = "流程实例id", required = true)
+ @NotBlank(message = "流程实例id不能为空")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "当前流程节点id", required = true)
+ @NotBlank(message = "当前节点id不能为空")
+ private String currentActivityId;
+
+ @ApiModelProperty(value = "目标流程节点id", required = true)
+ @NotBlank(message = "目标流程节点id不能为空")
+ private String toActivityId;
+
+ @ApiModelProperty(value = "可以指定任务处理", required = true)
+ private List targetTaskIds;
+
+ @ApiModelProperty(value = "意见")
+ private String advice;
+
+ @ApiModelProperty(value = "操作描述")
+ private String operationDesc;
+
+ @ApiModelProperty(value = "操作人")
+ private BpmnTaskDelegateAssigner operator;
+
+ /**
+ * 附件列表
+ */
+ @ApiModelProperty(value = "附件列表")
+ @Size(max = 11, message = "附件数量超过限制")
+ @AttachmentValidator(types = {
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.image, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.file, max = 5),
+ @AttachmentTypeValidator(type = AttachmentTypeEnum.signature, max = 1)}
+ )
+ private List attachmentList;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
index cc1b5c404..905c68fe4 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCompleteDTO.java
@@ -71,5 +71,6 @@ public class BpmnRobotTaskCompleteDTO {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
index 67a3e5068..f84e15c7c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnRobotTaskCreateDTO.java
@@ -51,5 +51,6 @@ public class BpmnRobotTaskCreateDTO {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
index 91fedef41..64f01c435 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java
@@ -78,6 +78,7 @@ public class BpmnTaskAuditDTO {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
/**
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java
index 0f324007c..89c35023c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditWithFormDTO.java
@@ -20,12 +20,14 @@ public class BpmnTaskAuditWithFormDTO extends BpmnTaskAuditDTO {
/**
* 表单数据
+ *
+ * 必须为全量表单数据,不能只提交部分表单数据
*/
@ApiModelProperty(value = "表单数据")
private Map formVariables;
/**
- * 暂对不对
+ * 暂对不用
*/
private String outcome;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java
new file mode 100644
index 000000000..dc32d16c7
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskButtonSearchDTO.java
@@ -0,0 +1,27 @@
+package cn.axzo.workflow.common.model.request.bpmn.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+@ApiModel("获取审批任务按钮,状态入参模型")
+public class BpmnTaskButtonSearchDTO implements Serializable {
+
+ private static final long serialVersionUID = -3220083731019329293L;
+
+ @ApiModelProperty(value = "流程实例id", required = true)
+ @NotBlank(message = "流程实例id不能为空")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "审批任务id", required = true)
+ @NotBlank(message = "审批任务id不能为空")
+ private String taskId;
+
+ private Long initiatorPersonId;
+
+ private Long executorPersonId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
index 665a5af86..4d5be875d 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCommentDTO.java
@@ -77,6 +77,7 @@ public class BpmnTaskCommentDTO implements Serializable {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = false;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
index 3b67b9860..9bdc7c69b 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskCountersignDTO.java
@@ -89,6 +89,7 @@ public class BpmnTaskCountersignDTO implements Serializable {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
index 4316baeeb..286bf2b1f 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java
@@ -1,6 +1,7 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -108,6 +109,18 @@ public class BpmnTaskDelegateAssigner implements Serializable {
@IndexField(exist = false)
private String avatar;
+ /**
+ * 人员对应的 nodeId,如果在审批模板中对应节点未使用流程自主查询审批人的功能(如指定岗位/身份/角色之类),则需要业务方主动传入
+ */
+ private String nodeId;
+
+ /**
+ * 扩展字段, 业务无需关系
+ *
+ * 仅用于日志展示人的一些状态信息
+ */
+ private JSONObject ext;
+
public final String buildAssigneeId_1_2_1() {
if (StringUtils.hasLength(assigneeType)) {
return tenantId + "|" + assignee + "|" + assigneeType;
@@ -136,6 +149,12 @@ public class BpmnTaskDelegateAssigner implements Serializable {
this.tenantId = tenantId;
}
+ public BpmnTaskDelegateAssigner(String assignee, String assigneeType, String assignerName, String personId, String tenantId, String ouId, String avatar, String nodeId) {
+ this.assignerName = assignerName;
+ this.personId = personId;
+ this.tenantId = tenantId;
+ }
+
public final boolean comparePersonIdToOther(BpmnTaskDelegateAssigner other) {
return Objects.equals(personId, other.getPersonId());
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
index 7f51ba85b..806bd51b1 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskRemindDTO.java
@@ -2,10 +2,13 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
@@ -16,8 +19,16 @@ import java.util.List;
*/
@ApiModel("催办功能入参模型")
@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class BpmnTaskRemindDTO {
-
+ /**
+ * 操作催办时的终端类型,管理端cmp、工人端cm
+ */
+ @NotBlank(message = "终端类型不能为空")
+ private String terminalType;
/**
* 审批节点唯一标识
*/
@@ -27,9 +38,9 @@ public class BpmnTaskRemindDTO {
/**
* 催办方式
*
- * 站内信:notice 短信:sms
+ * IM, 如果为空,默认是 IM
*/
- @NotEmpty(message = "催办方式不能为空")
+ @ApiModelProperty(value = "催办方式", example = "im")
private List remindTypes;
/**
@@ -40,8 +51,9 @@ public class BpmnTaskRemindDTO {
private String processInstanceId;
/**
- * 租户 ID
+ * 是否异步执行
*/
- @ApiModelProperty("租户 ID")
- private String tenantId;
+ @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
+ private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
index 9a4a64877..dc4c0f7c8 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskTransferDTO.java
@@ -79,6 +79,7 @@ public class BpmnTaskTransferDTO implements Serializable {
* 是否异步执行
*/
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
+ @Builder.Default
private Boolean async = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
index e88d62a65..a16d170dc 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/ExtHiTaskSearchDTO.java
@@ -3,7 +3,12 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
/**
* 扩展的历史任务表搜索入参模型
@@ -13,6 +18,9 @@ import lombok.Data;
*/
@ApiModel("扩展的历史任务表搜索入参模型")
@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class ExtHiTaskSearchDTO {
@ApiModelProperty("流程实例 ID")
@@ -29,4 +37,7 @@ public class ExtHiTaskSearchDTO {
@ApiModelProperty("任务状态")
private BpmnProcessInstanceResultEnum status;
+
+ @ApiModelProperty("需要排除的id列表")
+ private List excludeIds;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
index a8042344c..d80e8f178 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
@@ -68,4 +69,22 @@ public class CategoryCreateDTO {
@ApiModelProperty(value = "租户", example = "1")
private String tenantId = "";
+ /**
+ * 业务类型
+ */
+ @ApiModelProperty(value = "业务类型,SIGN-签署业务,APPROVAL-审批业务")
+ private BusinessTypeEnum businessType;
+
+ /**
+ * 图标
+ */
+ @ApiModelProperty(value = "图标")
+ private String icon;
+
+ /**
+ * 是否展示在发起工作台
+ */
+ @ApiModelProperty(value = "是否展示在发起工作台,默认为false")
+ private Boolean displayInitiateMenu = false;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java
new file mode 100644
index 000000000..e0862cc54
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarSearchDto.java
@@ -0,0 +1,28 @@
+package cn.axzo.workflow.common.model.request.category;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Min;
+
+@ApiModel("业务分类分组和变量搜索入参模型")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarSearchDto {
+
+ @Min(value = 1, message = "字典ID必须大于0")
+ @ApiModelProperty(value = "字典 ID")
+ private Long dictId;
+
+ /**
+ * 所属业务code
+ */
+ @ApiModelProperty(value = "所属业务")
+ private String category;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java
new file mode 100644
index 000000000..24fde2c59
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryGroupVarUpsertDto.java
@@ -0,0 +1,104 @@
+package cn.axzo.workflow.common.model.request.category;
+
+import cn.axzo.workflow.common.enums.VarTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarUpsertDto {
+
+ @ApiModelProperty(value = "字典id")
+ @Min(value = 1, message = "字典id值必须大于等1")
+ @NotNull(message = "字典id不能为空")
+ private Long dictId;
+
+ @Valid
+ private List groupVos;
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryGroupUpsertVo implements Serializable {
+ private static final long serialVersionUID = 5406711143425155649L;
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 上级分组id
+ */
+ private Long parentGroupId;
+
+ /**
+ * 分组名
+ */
+ @NotBlank(message = "分组名称不能为空")
+ @Length(max = 50, message = "字典标签最长只支持50个字符")
+ private String groupName;
+
+ @NotNull(message = "序号不能为空")
+ private Integer ordinal;
+
+ @Valid
+ private List vars;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryVarUpsertVo implements Serializable {
+
+ private static final long serialVersionUID = -1918203166603971593L;
+
+ private Long id;
+
+ /**
+ * 分组id
+ */
+ private Long groupId;
+
+ /**
+ * 变量类型,文本/图片
+ */
+ @NotNull(message = "变量类型不能为空")
+ private VarTypeEnum type;
+
+ /**
+ * 变量code
+ */
+ @NotBlank(message = "变量编码不能为空")
+ @Length(max = 50, message = "变量编码最长只支持50个字符")
+ @Pattern(regexp = "^[a-zA-Z]+$", message = "变量编码仅限英文字符")
+ private String code;
+
+ /**
+ * 变量名称
+ */
+ @NotBlank(message = "变量名称不能为空")
+ @Length(max = 50, message = "变量名称最长只支持50个字符")
+ private String name;
+
+ @NotNull(message = "序号不能为空")
+ private Integer ordinal;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
index 27dd6c794..2e2738eae 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategorySearchDTO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.request.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -48,4 +49,13 @@ public class CategorySearchDTO extends BpmPageParam {
*/
@ApiModelProperty(value = "租户 ID", example = "1")
private String tenantId = "";
+
+ /**
+ * 业务类型
+ */
+ @ApiModelProperty(value = "业务类型")
+ private BusinessTypeEnum businessType;
+
+ @ApiModelProperty(value = "根据创建时间排序")
+ private String orderCreateAt;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java
index a8dc5d5b1..0a8cd715e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/FormPermissionMetaInfo.java
@@ -4,7 +4,6 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
import java.io.Serializable;
@@ -34,22 +33,26 @@ public class FormPermissionMetaInfo implements Serializable {
/**
* 可编辑必填
*/
+ @Builder.Default
private Boolean required = false;
/**
* 可编辑非必填
*/
+ @Builder.Default
private Boolean editable = false;
/**
* 只读
*/
- private Boolean readonly = false;
+ @Builder.Default
+ private Boolean readonly = true;
/**
* 隐藏
*/
- private Boolean hidden = true;
+ @Builder.Default
+ private Boolean hidden = false;
/**
* 前端回显字段,后端不做任何消费逻辑
*/
@@ -58,10 +61,10 @@ public class FormPermissionMetaInfo implements Serializable {
// 将对象的属性转换为对应的整数表示
public int toBinary() {
int binaryValue = 0;
- binaryValue |= (required? 1 : 0) << 3;
- binaryValue |= (editable? 1 : 0) << 2;
- binaryValue |= (readonly? 1 : 0) << 1;
- binaryValue |= (hidden? 1 : 0);
+ binaryValue |= (required ? 1 : 0) << 3;
+ binaryValue |= (editable ? 1 : 0) << 2;
+ binaryValue |= (readonly ? 1 : 0) << 1;
+ binaryValue |= (hidden ? 1 : 0);
return binaryValue;
}
@@ -73,8 +76,9 @@ public class FormPermissionMetaInfo implements Serializable {
boolean hidden = (binaryValue & 1) == 1;
return new FormPermissionMetaInfo(fieldId, fieldName, required, editable, readonly, hidden, null);
}
+
public FormPermissionMetaInfo toReadonly() {
- if(required || editable || readonly) {
+ if (required || editable || readonly) {
setRequired(false);
setEditable(false);
setReadonly(true);
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java
index 593e4811e..4a07d8a8c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java
@@ -30,6 +30,17 @@ public class FormFieldDTO {
/**
* 前端组件类型
+ *
+ * { label: "文本", value: "input" },
+ * { label: "多行文本", value: "textarea" },
+ * { label: "附件", value: "upload" },
+ * { label: "图片", value: "image" },
+ * { label: "自定义组件", value: "customComponent" },
+ * { label: "任务单", value: "taskOrder" },
+ * { label: "整改单", value: "rectifyOrder" },
+ * { label: "变洽签单", value: "changeSignatureOrder" },
+ * { label: "通讯录", value: "contacts" },
+ * { label: "金额", value: "amount" },
*/
@ApiModelProperty(value = "前端的组件类型")
private String type;
@@ -51,7 +62,7 @@ public class FormFieldDTO {
* 部分组件是多值,比如日期区间,多选, 多附件
*/
@ApiModelProperty(value = "表单字段默认值", example = "account")
- private List value;
+ private Object value;
/**
* 表单占位提示
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java
index 27a7698ff..62f4eac0e 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/StartFormSearchDTO.java
@@ -35,4 +35,7 @@ public class StartFormSearchDTO {
*/
@ApiModelProperty(value = "是否显示原始的默认值", hidden = true, notes = "如果为 true 则将默认值中的 ${} 变量不进行替换")
private Boolean showOriginDefaultValue = false;
+
+ @ApiModelProperty(value = "是否抛出内部异常")
+ private Boolean throwException = true;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java
new file mode 100644
index 000000000..b35a1674b
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/instance/FormVariablesUpdateDTO.java
@@ -0,0 +1,44 @@
+package cn.axzo.workflow.common.model.request.form.instance;
+
+import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 更新指定流程表单最后一次操作的表单内容的入参模型
+ *
+ * @author wangli
+ * @since 2025-02-08 10:04
+ */
+@ApiModel("更新指定流程表单最后一次操作的表单内容")
+@Data
+public class FormVariablesUpdateDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 流程实例 ID
+ */
+ @ApiModelProperty(value = "流程实例ID")
+ @NotBlank(message = "流程实例 ID 不能为空")
+ private String processInstanceId;
+
+ /**
+ *
+ * 图片类型和附件类型组件:请用 @see {@link UploadFieldDTO} 对象集合传入
+ *
+ * // form_image 为表单项的 key, value 为 UploadFileDTO 对象集合,如果前端使用了组件,一般建议回传所有属性;特殊情况下可以只传 fileUrl
+ * "form_image": [{
+ * "fileName": "",
+ * "fileUrl": "http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960",
+ * "fileKey": 123
+ * }]
+ *
+ */
+ @ApiModelProperty(value = "通过表单创建流程时传入的初始表单数据")
+ private Map formVariables;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
index ce2a09c4e..2d6df8e43 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/BpmnModelDetailVO.java
@@ -1,6 +1,7 @@
package cn.axzo.workflow.common.model.response.bpmn.model;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
+import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -28,6 +29,30 @@ public class BpmnModelDetailVO extends BpmnModelBaseVO {
@ApiModelProperty(value = "启用状态")
private Integer status;
+ /**
+ * 打印开关
+ */
+ @ApiModelProperty(value = "打印状态")
+ private Integer printStatus;
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板配置内容
+ */
+ @ApiModelProperty(value = "打印模板配置内容")
+ private String printTemplateConfig;
+
/**
* 描述
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java
new file mode 100644
index 000000000..7fc298914
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/model/doc/DocBaseVO.java
@@ -0,0 +1,97 @@
+package cn.axzo.workflow.common.model.response.bpmn.model.doc;
+
+import cn.axzo.workflow.common.enums.FileTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 基础的流程关联文档的响应模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:49
+ */
+@ApiModel("基础的流程关联文档的响应模型")
+@Data
+@NoArgsConstructor
+public class DocBaseVO {
+
+ private Long id;
+
+ /**
+ * 模型 ID
+ */
+ @ApiModelProperty(value = "模型 ID")
+ private String modelId;
+
+ /**
+ * 模型 KEY
+ */
+ @ApiModelProperty(value = "模型 KEY")
+ private String modelKey;
+
+ /**
+ * 文档对应文件的检索信息
+ * word/excel 对应 wps 的 Id,
+ * hp 对应是
+ * pdf 对应 oss 中的 fileKey
+ */
+ @ApiModelProperty(value = "文档对应文件检索信息")
+ private String fileRelationId;
+
+ /**
+ * 文档名称(用于归档)
+ */
+ @ApiModelProperty(value = "文档名称")
+ private String fileName;
+
+ /**
+ * 文档模板名称
+ */
+ @ApiModelProperty(value = "模板名称")
+ private String templateName;
+
+ /**
+ * 归档位置
+ */
+ private String location;
+
+ /**
+ * 文档类型
+ */
+ @ApiModelProperty(value = "文档类型")
+ private FileTypeEnum fileType;
+
+ /**
+ * 文档业务类型
+ */
+ @ApiModelProperty(value = "业务类型")
+ private String tag;
+
+ /**
+ * 文档状态
+ */
+ @ApiModelProperty(value = "文档状态")
+ private Boolean status;
+
+ @ApiModelProperty(value = "是否是临时文档")
+ private Boolean tempFile;
+ /**
+ * 文档是否必选
+ */
+ @ApiModelProperty(value = "是否必选")
+ private Boolean require;
+
+ /**
+ * 排序号
+ */
+ @ApiModelProperty(value = "排序号")
+ private Integer order;
+
+ /**
+ * 租户 ID
+ */
+ @ApiModelProperty(value = "租户 ID")
+ private String tenantId;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java
new file mode 100644
index 000000000..e329c2c14
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnNodeConfigVO.java
@@ -0,0 +1,88 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
+import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
+import cn.axzo.workflow.common.enums.ApproverScopeEnum;
+import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 发起流程前的节点列表中每个节点的模型配置信息
+ *
+ * @author wangli
+ * @since 2025-03-26 09:40
+ */
+@ApiModel("发起流程前的节点列表中每个节点的模型配置信息")
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class BpmnNodeConfigVO {
+ /**
+ * 审批方式, 审批节点与业务节点会有不同
+ *
+ * human("human", "人工审批", ""),
+ * autoPassed("autoPassed", "自动通过", "[仅审批节点可能选该值]"),
+ * autoRejection("autoRejection", "自动驳回", "[仅审批节点可能选该值]"),
+ * nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"),
+ * bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"),
+ */
+ @ApiModelProperty(value = "审批方式")
+ private ApprovalMethodEnum approvalMethodEnum;
+
+ /**
+ * 审批人所在范围
+ *
+ * entWorkspace("entWorkspace", "企业工作台", "entWorkspaceProcessor"),
+ * govWorkspace("govWorkspace", "政务工作台", "govWorkspaceProcessor"),
+ * projectWorkspace("projectWorkspace", "项目工作台","projectWorkspaceProcessor"),
+ * preTaskUser("preTaskUser", "上节点审批人所在单位","preTaskUserProcessor"),
+ * preTaskSpecified("preTaskSpecified", "上节点审批人指定","preTaskUserProcessor"),
+ */
+ @ApiModelProperty(value = "审批人所在范围")
+ private ApproverScopeEnum approverScopeEnum;
+
+ /**
+ * 审批人指定
+ *
+ * position("position", "指定岗位"),
+ * role("role", "指定角色"),
+ * identity("identity", "指定身份"),
+ * fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型,则该节点下的人,会默认回显至该上级模型属性中
+ * initiatorLeader("initiatorLeader", "发起人主管"),
+ * initiatorSpecified("initiatorSpecified", "发起人自选"),
+ */
+ @ApiModelProperty(value = "审批人指定")
+ private ApproverSpecifyEnum approverSpecifyEnum;
+
+ /**
+ * 审批人为空时的处理方式
+ *
+ * autoPassed("autoPassed", "自动通过"),
+ * autoRejection("autoRejection", "自动驳回"),
+ * autoSkipped("autoSkipped", "自动跳过"),
+ * transferToAdmin("transferToAdmin", "转交给管理员"),
+ * specifyAssignee("specifyAssignee", "指定审批人"),
+ */
+ @ApiModelProperty(value = "审批人为空时的处理方式")
+ private ApproverEmptyHandleTypeEnum approverEmptyHandleTypeEnum;
+
+ /**
+ * 是否开启电子签名
+ */
+ @ApiModelProperty(value = "是否开启电子签名")
+ private Boolean signature;
+
+ /**
+ * 签署确认节点审批人限制规则
+ */
+ @ApiModelProperty(value = "签署确认节点审批人限制规则")
+ private BpmnSignApproverLimit signApproverLimit;
+
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java
index 8ddcb835b..8c9689523 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceLogVO.java
@@ -154,6 +154,12 @@ public class BpmnProcessInstanceLogVO {
@ApiModelProperty(value = "工作台类型")
private WorkspaceType workspaceType;
+ /**
+ * 当前审批能否打印
+ */
+ @ApiModelProperty(value = "能否打印")
+ private Boolean catPrint;
+
@ApiModelProperty(value = "程序计算按钮使用,非对外使用", hidden = true)
private transient BpmnButtonConf calculatingButtonConf;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java
new file mode 100644
index 000000000..7e9cdde46
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/NodesByModelVO.java
@@ -0,0 +1,69 @@
+package cn.axzo.workflow.common.model.response.bpmn.process;
+
+import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
+import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 模型节点集合响应模型
+ *
+ * @author wangli
+ * @since 2025-01-15 10:40
+ */
+@ApiModel("模型节点集合响应模型")
+@Data
+@Accessors(chain = true)
+public class NodesByModelVO {
+
+ /**
+ * 节点 ID
+ */
+ @ApiModelProperty(value = "节点 ID")
+ private String activityId;
+
+ /**
+ * 节点名称
+ */
+ @ApiModelProperty(value = "节点名称")
+ private String activityName;
+
+ /**
+ * 是否支持发起人自选人
+ */
+ @ApiModelProperty(value = "是否支持发起自选人")
+ private Boolean supportSpecify;
+
+ /**
+ * 节点的人
+ */
+ private List assigners;
+ /**
+ * 节点模式(会、或签,普通节点)
+ */
+ @ApiModelProperty(value = "节点模式(会、或签,普通节点)")
+ private BpmnFlowNodeMode nodeModel;
+
+ /**
+ * 节点类型, 只要是以下类型
+ *
+ * NODE_STARTER("NODE_STARTER", "发起人节点"),
+ * NODE_TASK("NODE_TASK", "审核节点"),
+ * NODE_BUSINESS("NODE_BUSINESS", "业务节点"),
+ * NODE_SIGN("NODE_SIGN", "签署确认节点"),
+ * NODE_CARBON_COPY("NODE_CARBON_COPY", "抄送节点"),
+ */
+ @ApiModelProperty(value = "节点类型")
+ private BpmnFlowNodeType nodeType;
+
+ /**
+ * 节点原始配置信息
+ */
+ @ApiModelProperty(value = "节点原始配置")
+ private BpmnNodeConfigVO nodeConfig;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java
new file mode 100644
index 000000000..78d5ac6bf
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/doc/DocPendingVO.java
@@ -0,0 +1,47 @@
+package cn.axzo.workflow.common.model.response.bpmn.process.doc;
+
+import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 基础的流程关联文档待办中的响应模型
+ *
+ * @author wangli
+ * @since 2025-03-31 09:49
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("基础的流程关联文档待办中的响应模型")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocPendingVO extends DocBaseVO {
+
+ /**
+ * oss 的 fileKey
+ */
+ @ApiModelProperty(value = "oss 的 fileKey")
+ private String fileKey;
+
+ /**
+ * 文件 OBS 地址
+ */
+ @ApiModelProperty(value = "文件 OBS 地址")
+ private String ossUrl;
+
+ /**
+ * 文件大小,单位 Byte
+ */
+ @ApiModelProperty(value = "文件大小,单位 byte")
+ private Long storageSize;
+
+ /**
+ * 文档已读状态,true:已读
+ */
+ @ApiModelProperty(value = "文档已读状态,true:已读")
+ private Boolean readStatus;
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java
new file mode 100644
index 000000000..42d2f722d
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskButtonVo.java
@@ -0,0 +1,60 @@
+package cn.axzo.workflow.common.model.response.bpmn.task;
+
+import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum;
+import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class BpmnTaskButtonVo implements Serializable {
+
+ private static final long serialVersionUID = -2701890396246979758L;
+
+ /**
+ * 执行人任务状态
+ */
+ @ApiModelProperty(value = "执行人任务执行状态")
+ private BpmnProcessTaskResultEnum executorTaskResult;
+
+ /**
+ * 发起人执行状态
+ */
+ @ApiModelProperty(value = "发起人任务执行状态")
+ private BpmnProcessTaskResultEnum initiatorTaskResult;
+
+ /**
+ * 当前任务执行人以及发起人全量按钮
+ */
+ @ApiModelProperty(value = "当前任务相关以及发起人的全量按钮")
+ private List buttons;
+
+ /**
+ * 需要隐藏的按钮
+ */
+ @ApiModelProperty(value = "需要隐藏的自定义按钮")
+ private List customHiddenButtons;
+
+ /**
+ * 全量的配置按钮
+ */
+ @ApiModelProperty(value = "全量的配置按钮")
+ private List allConfigButtons;
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static final class BpmnButtonMetaInfoWithVisibleScope extends BpmnButtonMetaInfo {
+
+ private static final long serialVersionUID = 5758633314769798044L;
+
+ private List visibleScopes;
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java
index 2c191b8d4..6671f6e11 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceLogVO.java
@@ -107,6 +107,12 @@ public class BpmnTaskInstanceLogVO {
*/
@ApiModelProperty(value = "手写签名地址")
private String signatureUrl;
+
+ /**
+ * 电子签名开关
+ */
+ @ApiModelProperty(value = "电子签名开关")
+ private Boolean signature;
/**
* 审批人快照信息
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java
new file mode 100644
index 000000000..128c52c51
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryGroupVarItemVo.java
@@ -0,0 +1,75 @@
+package cn.axzo.workflow.common.model.response.category;
+
+
+import cn.axzo.workflow.common.enums.VarTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CategoryGroupVarItemVo implements Serializable {
+
+ private static final long serialVersionUID = -3349551294678140220L;
+
+ /**
+ * 分组id
+ */
+ private Long id;
+
+ /**
+ * 上级分组id
+ */
+ private Long parentGroupId;
+
+ /**
+ * 分组名
+ */
+ private String groupName;
+
+ /**
+ * 当前分组对应的变量
+ */
+ private List vars;
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static class CategoryVarItemVo implements Serializable {
+
+ private static final long serialVersionUID = -1918203166603971593L;
+
+ /**
+ * 变量id
+ */
+ private Long id;
+
+ /**
+ * 分组id
+ */
+ private Long groupId;
+
+ /**
+ * 变量类型,文本/图片
+ */
+ private VarTypeEnum type;
+
+ /**
+ * 变量code
+ */
+ private String code;
+
+ /**
+ * 变量名称
+ */
+ private String name;
+
+ }
+}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
index b106432aa..63c39692c 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java
@@ -1,5 +1,6 @@
package cn.axzo.workflow.common.model.response.category;
+import cn.axzo.workflow.common.enums.BusinessTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -34,6 +35,15 @@ public class CategoryItemVO {
@ApiModelProperty(value = "工作台类型值")
private String workspaceTypeCode;
+ @ApiModelProperty(value = "图标")
+ private String icon;
+
+ @ApiModelProperty(value = "业务类型")
+ private BusinessTypeEnum businessType;
+
+ @ApiModelProperty(value = "是否展示在发起工作台")
+ private Boolean displayInitiateMenu;
+
@ApiModelProperty(value = "更新时间")
private Date updateAt;
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
index 04a5e0d79..184614bf7 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/MessagePushDTO.java
@@ -31,6 +31,11 @@ public class MessagePushDTO implements Serializable {
*/
private String processInstanceId;
+ /**
+ * 流程归属的租户 ID
+ */
+ private String adscriptionTenantId;
+
/**
* 业务 ID
*/
@@ -66,4 +71,13 @@ public class MessagePushDTO implements Serializable {
*/
private BpmnApproveConf processApproveConf;
+ /**
+ * 节点电子签开关
+ */
+ private Boolean activitySignature;
+ /**
+ * 催办专用属性,催办时的终端类型(管理端、工人端)
+ */
+ private String terminalType;
+
}
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java
index 4911cfbe7..b36007eca 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java
@@ -2,6 +2,7 @@ package cn.axzo.workflow.common.model.response.mq;
import cn.axzo.workflow.common.enums.ProcessInstanceEventEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -85,9 +86,14 @@ public class ProcessInstanceDTO implements Serializable {
*/
private BpmnTaskDelegateAssigner initiator;
+ /**
+ * 关闭审批实例前最后一个操作人
+ */
+ private BpmnTaskDelegateAssigner lastOperationAssigner;
+
/**
* 对流程实例做否定操作时的原因
- *
+ *
* 如: 中止/驳回/撤回功能
*/
private String reason;
@@ -97,6 +103,11 @@ public class ProcessInstanceDTO implements Serializable {
*/
private BpmnNoticeConf noticeConf;
+ /**
+ * 模型中的签署配置
+ */
+ private BpmnSignConf signConf;
+
/**
* 当前数据的流程引擎版本
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
index 2822419c5..d356f394a 100644
--- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessTaskDTO.java
@@ -94,6 +94,16 @@ public class ProcessTaskDTO implements Serializable {
*/
private BpmnTaskDelegateAssigner approver;
+ /**
+ * 被转交人信息
+ */
+ private BpmnTaskDelegateAssigner transferTargetApprover;
+
+ /**
+ * 转交意见
+ */
+ private String transferAdvice;
+
/**
* 通知方式
*/
diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java
new file mode 100644
index 000000000..6bdbc1f2e
--- /dev/null
+++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/print/PrintModelDTO.java
@@ -0,0 +1,38 @@
+package cn.axzo.workflow.common.model.response.print;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 打印模板响应模型
+ *
+ * @author wangli
+ * @since 2025-02-11 10:41
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PrintModelDTO {
+
+ /**
+ * 打印文件名称
+ */
+ @ApiModelProperty(value = "打印文件名称")
+ private String printFileName;
+
+ /**
+ * 打印模板名称
+ */
+ @ApiModelProperty(value = "打印模板名称")
+ private String printTemplateName;
+
+ /**
+ * 打印模板内容(前端打印组件的生成的完全数据)
+ */
+ @ApiModelProperty(value = "打印模板内容")
+ private String printTemplateConfig;
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java
index 49cba93f3..02eeb6713 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/CommonContext.java
@@ -26,6 +26,7 @@ public abstract class CommonContext implements OperationContext {
private BpmnProcessInstanceVO instanceVO;
private BpmnProcessDefinitionVO definitionVO;
private String processInstanceVersion;
+ private BpmnTaskDelegateAssigner lastOperationAssigner;
public ProcessInstance getProcessInstance(Supplier supplier) {
if (Objects.isNull(processInstance)) {
@@ -69,6 +70,13 @@ public abstract class CommonContext implements OperationContext {
return initiator;
}
+ public BpmnTaskDelegateAssigner getLastOperationAssigner(Supplier supplier) {
+ if (Objects.isNull(lastOperationAssigner)) {
+ lastOperationAssigner = supplier.get();
+ }
+ return lastOperationAssigner;
+ }
+
public String getProcessInstanceVersion(Supplier supplier) {
if (!StringUtils.hasText(processInstanceVersion)) {
processInstanceVersion = supplier.get();
@@ -77,10 +85,12 @@ public abstract class CommonContext implements OperationContext {
}
@Override
+ @SuppressWarnings("unchecked")
public void setContext(OperationContext context) {
this.context = (T) context;
}
+ @SuppressWarnings("unchecked")
@Override
public T getContext() {
return context;
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java
index cb06e6e89..9342cd93b 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/context/ProcessOperationContext.java
@@ -1,5 +1,12 @@
package cn.axzo.workflow.core.common.context;
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+
/**
* 流程相关操作上下文
*
@@ -8,5 +15,20 @@ package cn.axzo.workflow.core.common.context;
*/
public class ProcessOperationContext extends CommonContext {
+ private List processFileTags;
+ private ProcessEngineConfiguration processEngineConfiguration;
+ public List getProcessFileTags(Supplier> supplier) {
+ if (CollectionUtils.isEmpty(processFileTags)) {
+ processFileTags = supplier.get();
+ }
+ return processFileTags;
+ }
+
+ public ProcessEngineConfiguration getProcessEngineConfiguration(Supplier supplier) {
+ if (Objects.isNull(processEngineConfiguration)) {
+ return supplier.get();
+ }
+ return processEngineConfiguration;
+ }
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
index 23eadcd0f..06400d673 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessTaskResultEnum.java
@@ -9,6 +9,7 @@ import java.util.Arrays;
* @since 2023/9/18 17:11
*/
public enum BpmnProcessTaskResultEnum {
+ HANDLING("HANDLING", "审批中"), // 修改这里
PENDING("PENDING", "待处理"),
PROCESSED("PROCESSED", "已处理"),
AUTO_SKIP("AUTO_SKIP", "任务自动跳过"),
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
index f446ef005..1d98e44cb 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/event/ApiLogListener.java
@@ -5,15 +5,12 @@ import cn.axzo.workflow.core.repository.entity.ExtAxApiLog;
import cn.axzo.workflow.core.service.ExtAxApiLogService;
import cn.hutool.json.JSONUtil;
import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
-import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
index 10a6f22e9..d5fc06b04 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java
@@ -1,6 +1,7 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
+import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
@@ -9,8 +10,9 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
-import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
import cn.axzo.workflow.core.converter.json.EndEventJsonConverter;
@@ -86,6 +88,8 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DISABLED;
@@ -95,6 +99,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.SEQUENCE_FLOW_ID;
@@ -109,6 +114,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MES
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_EVENTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SIGN_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
@@ -117,6 +123,8 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonC
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
+import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
/**
* BPMN json 格式转换工具
@@ -165,6 +173,7 @@ public final class BpmnJsonConverterUtil {
getNoticeConfig(mainProcess).ifPresent(model::setNoticeConf);
getButtonConfig(mainProcess).ifPresent(model::setButtonConf);
getFieldConfig(mainProcess).ifPresent(model::setFieldConf);
+ getSignConfig(mainProcess).ifPresent(model::setSignConf);
return model;
}
@@ -178,9 +187,11 @@ public final class BpmnJsonConverterUtil {
* @param fieldConf
* @return {@link BpmnModel}
*/
- public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, String id, String name, String formKey,
+ public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
+ String id, String name, String formKey,
String documentation,
BpmnApproveConf approveConf,
+ BpmnSignConf signConf,
BpmnNoticeConf noticeConf,
BpmnButtonConf buttonConf,
List fieldConf,
@@ -190,7 +201,9 @@ public final class BpmnJsonConverterUtil {
}
// 提交的 BpmnJsonNode 全部都是任务是可执行节点, 这里的转换是全局都会增加开始和结束节点. 因为前段的提交的数据是不包含开始和结束
BpmnModel bpmnModel = new BpmnModel();
-
+ ExtensionAttribute modelType = new ExtensionAttribute();
+ modelType.setName(FLOW_MODEL_BIZ_TYPE);
+ modelType.setValue(Objects.nonNull(modelBizType) ? modelBizType.getType() : ModelBizTypeEnum.FLOWABLE.getType());
ExtensionAttribute serverVersion = new ExtensionAttribute();
serverVersion.setName(FLOW_SERVER_VERSION);
serverVersion.setValue(serverVersionStr);
@@ -202,11 +215,14 @@ public final class BpmnJsonConverterUtil {
mainProcess.setId(id);
mainProcess.setName(name);
mainProcess.setDocumentation(documentation);
+ mainProcess.addAttribute(modelType);
mainProcess.addAttribute(serverVersion);
mainProcess.addAttribute(jsonMetaValue);
//设置流程审批相关高级配置
setProcessApproveConfigs(approveConf, mainProcess);
+ // 设置签署配置
+ setSignConfig(signConf, mainProcess);
// 设置流程的通知管理配置
setProcessNoticeConfig(noticeConf, mainProcess);
// 设置流程的默认的按钮配置
@@ -223,7 +239,10 @@ public final class BpmnJsonConverterUtil {
mainProcess.addFlowElement(convertJsonToElement(EndEvent.class, mainProcess, formKey));
// 解析前端传入的模型设计 json
- List lastNodeIds = create(formKey, bpmnJsonNode, mainProcess, bpmnModel, null, START_EVENT_ID);
+ List lastNodeIds = Lists.newArrayList(START_EVENT_ID);
+ if (StringUtils.hasText(bpmnJsonNode.getId())) {
+ lastNodeIds = create(formKey, bpmnJsonNode, mainProcess, bpmnModel, null, START_EVENT_ID);
+ }
if (CollectionUtils.isEmpty(lastNodeIds)) {
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "未找到链接结束节点的节点数据");
@@ -240,6 +259,39 @@ public final class BpmnJsonConverterUtil {
return bpmnModel;
}
+ private static void setSignConfig(BpmnSignConf signConf, Process mainProcess) {
+ if (Objects.isNull(signConf)) {
+ return;
+ }
+ ExtensionElement signConfigElement = new ExtensionElement();
+ signConfigElement.setName(CONFIG_SIGN);
+
+ if (Objects.nonNull(signConf.getSignType())) {
+ ExtensionElement signType = new ExtensionElement();
+ signType.setName(CONFIG_SIGN_TYPE);
+ ExtensionAttribute signTypeAttr = new ExtensionAttribute();
+ signTypeAttr.setName(ELEMENT_ATTRIBUTE_TYPE);
+ signTypeAttr.setValue(signConf.getSignType().getType());
+ signType.addAttribute(signTypeAttr);
+ signType.setElementText(signConf.getSignType().getDesc());
+ signConfigElement.addChildElement(signType);
+ }
+
+ // 签署待办消息模板配置
+ if (Objects.nonNull(signConf.getSignPendingProperty()) && Objects.nonNull(signConf.getSignPendingProperty().getPendingMessageId())) {
+ ExtensionElement signPendingMessage = new ExtensionElement();
+ signPendingMessage.setName(TEMPLATE_SIGN_PENDING_MESSAGE_ID);
+ ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
+ pendingMessageAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ pendingMessageAttribute.setValue(signConf.getSignPendingProperty().getPendingMessageId());
+ signPendingMessage.addAttribute(pendingMessageAttribute);
+ signPendingMessage.setElementText(StringUtils.hasText(signConf.getSignPendingProperty().getViewJson()) ?
+ signConf.getSignPendingProperty().getViewJson() : "");
+ signConfigElement.addChildElement(signPendingMessage);
+ }
+ mainProcess.addExtensionElement(signConfigElement);
+ }
+
private static void setProcessFieldConfig(List fieldConf, Process mainProcess) {
if (CollectionUtils.isEmpty(fieldConf)) {
return;
@@ -692,6 +744,10 @@ public final class BpmnJsonConverterUtil {
clz = UserTask.class;
}
break;
+ case NODE_SIGN:
+ // 签署确认节点
+ clz = UserTask.class;
+ break;
case NODE_TRIGGER:
// 这个类型目前暂不支持
case NODE_CARBON_COPY:
@@ -710,7 +766,7 @@ public final class BpmnJsonConverterUtil {
}
private static FlowElement convertJsonToElement(Class extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
- Process process, String formKey) {
+ Process process, String formKey) {
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
if (Objects.nonNull(bpmnJsonNode)) {
@@ -754,19 +810,19 @@ public final class BpmnJsonConverterUtil {
String content = new String(bytes, StandardCharsets.UTF_8);
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
- BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), "id", "测试", "test-form", "remark",
+ BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.SIGN, "id", "测试", "test-form", "remark",
model.getJsonModel().getApproveConf(),
+ model.getJsonModel().getSignConf(),
model.getJsonModel().getNoticeConf(),
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
"1.3.1-SNAPSHOT");
getNoticeConfig(bpmnModel.getMainProcess());
+ getSignConfig(bpmnModel.getMainProcess());
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
-// FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
- FlowElement flowElement = bpmnModel.getFlowElement("node_429076682717");
- Optional> formFieldPermissionConf
- = BpmnMetaParserHelper.getFormFieldPermissionConf(flowElement);
+ FlowElement flowElement = bpmnModel.getFlowElement("node_350811186561");
+ Optional signApproverLimit = getSignApproverLimit(flowElement);
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
// Optional> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
// (serviceTask);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
index cf03ea19f..379805f64 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMetaParserHelper.java
@@ -7,7 +7,10 @@ import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.enums.BpmnSignType;
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
+import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
+import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
@@ -19,6 +22,9 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeReceiver;
import cn.axzo.workflow.common.model.request.bpmn.BpmnPendingProperty;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
+import cn.axzo.workflow.common.model.request.bpmn.BpmnSignPendingProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSmsProperty;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import com.alibaba.fastjson.JSON;
@@ -50,6 +56,7 @@ import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_SUPPORT_BATCH_OPERATION;
import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_USER_AGREE_SIGNATURE;
import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVAL_METHOD;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
@@ -71,6 +78,11 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DISABLED;
@@ -91,6 +103,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MES
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_DESTINATION_ROLES;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_EVENTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SIGN_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.USER_AGREE_SIGNATURE_DEFAULT_VALUE;
@@ -133,6 +146,41 @@ public final class BpmnMetaParserHelper {
return Optional.of(conf);
}
+ public static Optional getSignConfig(Process process) {
+ List elements = process.getExtensionElements().getOrDefault(CONFIG_SIGN, Collections.emptyList());
+ if (CollectionUtils.isEmpty(elements)) {
+ return Optional.empty();
+ }
+ BpmnSignConf conf = new BpmnSignConf();
+ elements.get(0).getChildElements().forEach((k, v) -> {
+ if (CONFIG_SIGN_TYPE.equals(k)) {
+ conf.setSignType(BpmnSignType.valueOfType(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_TYPE)));
+ } else if (TEMPLATE_SIGN_PENDING_MESSAGE_ID.equals(k)) {
+ BpmnSignPendingProperty sign = new BpmnSignPendingProperty();
+ sign.setPendingMessageId(v.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE));
+ sign.setViewJson(v.get(0).getElementText());
+ conf.setSignPendingProperty(sign);
+ }
+ });
+ return Optional.of(conf);
+ }
+
+ public static Optional getSignApproverLimit(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getSignApproverLimit((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
+ public static Optional getSignApproverLimit(UserTask userTask) {
+ return defaultValid(userTask, CONFIG_SIGN_APPROVER_LIMIT).map(element -> {
+ BpmnSignApproverLimit signApproverLimit = new BpmnSignApproverLimit();
+ signApproverLimit.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(CONFIG_SIGN_APPROVER_ORG_LIMIT).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
+ signApproverLimit.setRoleLimit(SignApproverRoleLimitEnum.valueOfType(element.getChildElements().get(CONFIG_SIGN_APPROVER_ROLE_LIMIT).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
+ return signApproverLimit;
+ });
+ }
+
/**
* 获取流程模型全局兜底的消息模板相关配置
*
@@ -372,18 +420,46 @@ public final class BpmnMetaParserHelper {
return defaultValid(flowElement, CONFIG_APPROVAL_METHOD).map(element -> ApprovalMethodEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverScope(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverScope((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverScope(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SCOPE).map(element -> ApproverScopeEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverSpecify(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverSpecify((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverSpecify(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
+ public static Optional getApproverSpecifyValue(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverSpecifyValue((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverSpecifyValue(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
}
+ public static Optional getApproverEmptyHandleType(FlowElement flowElement) {
+ if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
+ return getApproverEmptyHandleType((UserTask) flowElement);
+ }
+ return Optional.empty();
+ }
+
public static Optional getApproverEmptyHandleType(UserTask userTask) {
return defaultValid(userTask, CONFIG_APPROVER_EMPTY_HANDLE_TYPE).map(element -> ApproverEmptyHandleTypeEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
@@ -392,6 +468,18 @@ public final class BpmnMetaParserHelper {
return defaultValid(userTask, CONFIG_APPROVER_EMPTY_HANDLE_TYPE).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
}
+ public static Boolean getActivitySignature(FlowElement flowElement) {
+ return defaultValid(flowElement, CONFIG_ACTIVITY_SIGNATURE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))).orElse(false);
+ }
+
+ public static Boolean getSupportInitiatorSpecified(FlowElement flowElement) {
+ ApprovalMethodEnum approvalMethodEnum = getApprovalMethod(flowElement).orElse(null);
+ ApproverSpecifyEnum specifyEnum = getApproverSpecify(flowElement).orElse(null);
+ return Objects.nonNull(specifyEnum)
+ && Objects.equals(approvalMethodEnum, ApprovalMethodEnum.human)
+ && Objects.equals(specifyEnum, ApproverSpecifyEnum.initiatorSpecified);
+ }
+
private static Optional defaultValid(FlowElement flowElement, String elementName) {
if (Objects.isNull(flowElement)) {
return Optional.empty();
@@ -511,7 +599,6 @@ public final class BpmnMetaParserHelper {
return fields;
}
-
public static void main(String[] args) {
List conf1 = genericConf(5);
conf1.forEach(e -> System.out.println("conf1 ---> e.fieldId = " + e.getFieldId() + " ,e.getFieldName() = " + e.getFieldName() + " ,e.toBinary() = " + e.toBinary() + " ,e.toBinaryString() = " + e.toBinaryString()));
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java
index 9c9017dd3..26d2bc007 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/FormHelper.java
@@ -68,7 +68,7 @@ public class FormHelper {
}
oldParams.put(FIELD_PROPERTY_DEFAULT_VALUE, defaultValue);
if (injectDefaultValue(formField) && StringUtils.hasText(defaultValue)) {
- formField.setValue(Lists.newArrayList(defaultValue));
+ formField.setValue(defaultValue);
}
}
formField.setParams(oldParams);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomEventManager.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomEventManager.java
new file mode 100644
index 000000000..141dbc520
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomEventManager.java
@@ -0,0 +1,49 @@
+package cn.axzo.workflow.core.conf;
+
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationEventPublisherAware;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Spring event 优雅关闭处理器
+ *
+ * @author wangli
+ * @since 2025-04-07 17:10
+ */
+@Component
+public class CustomEventManager implements ApplicationEventPublisherAware {
+
+ private ApplicationEventPublisher publisher;
+ private final BlockingQueue eventQueue = new LinkedBlockingQueue<>();
+ private int eventCount = 0;
+
+ @Override
+ public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
+ this.publisher = publisher;
+ }
+
+ public synchronized void publishEvent(ApplicationEvent event) {
+ eventQueue.add(event);
+ eventCount++;
+ publisher.publishEvent(event);
+ }
+
+ public synchronized void eventProcessed() {
+ eventQueue.poll();
+ eventCount--;
+ }
+
+ public synchronized boolean isAllEventsProcessed() {
+ return eventCount == 0;
+ }
+
+ public synchronized void waitForEventsToBeProcessed() throws InterruptedException {
+ while (!isAllEventsProcessed()) {
+ Thread.sleep(100);
+ }
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomJobServiceConfiguration.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomJobServiceConfiguration.java
new file mode 100644
index 000000000..3aae96886
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/CustomJobServiceConfiguration.java
@@ -0,0 +1,37 @@
+package cn.axzo.workflow.core.conf;
+
+import cn.axzo.workflow.core.engine.job.service.CustomTimerJobEntityManagerImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.common.engine.impl.AbstractEngineConfiguration;
+import org.flowable.common.engine.impl.EngineConfigurator;
+import org.flowable.job.service.JobServiceConfiguration;
+import org.flowable.spring.SpringProcessEngineConfiguration;
+
+/**
+ * 自定义的任务服务的配置类
+ *
+ * @author wangli
+ * @since 2025-03-12 14:18
+ */
+@Slf4j
+public class CustomJobServiceConfiguration implements EngineConfigurator {
+
+ @Override
+ public void beforeInit(AbstractEngineConfiguration engineConfiguration) {
+
+ }
+
+ @Override
+ public void configure(AbstractEngineConfiguration engineConfiguration) {
+ if (!(engineConfiguration instanceof SpringProcessEngineConfiguration)) {
+ return;
+ }
+ JobServiceConfiguration jobServiceConfiguration = ((SpringProcessEngineConfiguration) engineConfiguration).getJobServiceConfiguration();
+ jobServiceConfiguration.setTimerJobEntityManager(new CustomTimerJobEntityManagerImpl(jobServiceConfiguration, jobServiceConfiguration.getTimerJobDataManager()));
+ }
+
+ @Override
+ public int getPriority() {
+ return 0;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java
index 17bb138fa..46cbff211 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java
@@ -3,6 +3,7 @@ package cn.axzo.workflow.core.conf;
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
import cn.axzo.workflow.core.engine.behavior.CustomActivityBehaviorFactory;
import cn.axzo.workflow.core.engine.cmd.CustomCommandContextFactory;
+import cn.axzo.workflow.core.engine.formhandler.CustomFormFieldHandler;
import cn.axzo.workflow.core.engine.id.BasedNacosSnowflakeIdGenerator;
import cn.axzo.workflow.core.engine.interceptor.CustomRetryInterceptor;
import cn.axzo.workflow.core.engine.job.AsyncAbortProcessInstanceJobHandler;
@@ -17,6 +18,7 @@ import cn.axzo.workflow.core.engine.job.AsyncCancelProcessInstanceJobHandler;
import cn.axzo.workflow.core.engine.job.AsyncCountersignUserTaskJobHandler;
import cn.axzo.workflow.core.engine.job.AsyncExtTaskInstJobHandler;
import cn.axzo.workflow.core.engine.job.AsyncRejectTaskJobHandler;
+import cn.axzo.workflow.core.engine.job.AsyncRemindTaskJobHandler;
import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler;
import cn.axzo.workflow.core.engine.job.AsyncTransferUserTaskJobHandler;
import cn.axzo.workflow.core.engine.job.exception.handle.CustomAsyncJobLogClearTraceExceptionHandler;
@@ -36,7 +38,6 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.common.engine.impl.history.HistoryLevel;
-import org.flowable.form.engine.configurator.FormEngineConfigurator;
import org.flowable.job.service.JobProcessor;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
@@ -68,6 +69,7 @@ import static org.flowable.common.engine.impl.AbstractEngineConfiguration.DB_SCH
* @author wangli
* @since 2023/7/13 11:18
*/
+@Slf4j
@Configuration
public class FlowableConfiguration {
@@ -115,6 +117,7 @@ public class FlowableConfiguration {
configuration.addCustomJobHandler(new AsyncActivityLeaveJobHandler(bpmnProcessActivityService));
configuration.addCustomJobHandler(new AsyncActivityCallbackJobHandler());
configuration.addCustomJobHandler(new AsyncApproveTaskWithFormJobHandler());
+ configuration.addCustomJobHandler(new AsyncRemindTaskJobHandler(refreshProperties));
configurers.forEach(i -> configuration.addCustomJobHandler(i.getJobHandler()));
// 异步任务异常重试时间间隔
configuration.setDefaultFailedJobWaitTime(30);
@@ -132,6 +135,10 @@ public class FlowableConfiguration {
configuration.setCustomPreCommandInterceptors(Lists.newArrayList(
new CustomRetryInterceptor()
));
+ // form configuration
+ configuration.setFormFieldValidationEnabled(true);
+ configuration.setFormFieldHandler(new CustomFormFieldHandler());
+ configuration.setConfigurators(Lists.newArrayList(new CustomJobServiceConfiguration()));
};
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java
index 58f1a6a43..3cd9f1903 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java
@@ -1,6 +1,5 @@
package cn.axzo.workflow.core.conf;
-import com.alibaba.nacos.api.config.annotation.NacosValue;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@@ -44,31 +43,41 @@ public class SupportRefreshProperties {
@Value(value = "${workflow.alter.enable:false}")
private Boolean alterEnable;
/**
- * 节点卡住多久才告警
+ * 节点卡住多久才告警,单位分钟
*/
- @Value("${workflow.alter.delay:10}")
+ @Value("${workflow.alter.pauseDelay:30}")
private Integer pauseDelay;
/**
- * 业务节点暂停告警的次数,该值不建议改小
+ * 业务节点暂停告警的次数, 0代表无限制
*/
- @Value(value = "${workflow.alter.retries:1000}")
+ @Value(value = "${workflow.alter.retries:1}")
private Integer alterRetries;
/**
- * 业务节点暂停告警次数间的间隔
+ * 业务节点任务执行间隔
*/
- @Value(value = "${workflow.alter.interval:10}")
+ @Value(value = "${workflow.alter.interval:60}")
private Integer alterInterval;
/**
- * 业务节点暂停告警次数间隔的时间单位
+ * 业务节点任务执行间隔的时间单位
+ * SECONDS/HOURS/MINUTES 支持的几种单位
*/
- @Value(value = "${workflow.alter.intervalUnit:minutes}")
+ @Value(value = "${workflow.alter.intervalUnit:seconds}")
private TimeUnit alterIntervalUnit;
@Value(value = "${workflow.alter.mobiles:}")
private List alterMobiles;
+ /**
+ * 是否允许重复告警
+ */
+ @Value(value = "${workflow.alter.repeat:false}")
+ private Boolean repeatAlter;
+
+ @Value(value = "${workflow.alter.sendDingTalk:true}")
+ private Boolean alterSendDingTalk;
+
/**
* 用于控制转交管理员的 API
*/
@@ -80,4 +89,7 @@ public class SupportRefreshProperties {
@Value("${workflow.esSyncBatchSize:10}")
private Integer esSyncBatchSize;
+
+ @Value("${workflow.imTemplateCode:}")
+ private String imTemplateCode;
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ButtonConfTypeHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ButtonConfTypeHandler.java
index c235e42c9..f411169db 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ButtonConfTypeHandler.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ButtonConfTypeHandler.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
@@ -26,6 +27,10 @@ import java.util.List;
public class ButtonConfTypeHandler extends AbstractJsonTypeHandler {
private static ObjectMapper objectMapper = new ObjectMapper();
+ static {
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
public ButtonConfTypeHandler(Class> type) {
if (log.isTraceEnabled()) {
log.trace("JacksonTypeHandler(" + type + ")");
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListAssigneeTypeHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListAssigneeTypeHandler.java
index cd54a7f40..587ca9a57 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListAssigneeTypeHandler.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListAssigneeTypeHandler.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
@@ -26,6 +27,10 @@ import java.util.List;
public class ListAssigneeTypeHandler extends AbstractJsonTypeHandler> {
private static ObjectMapper objectMapper = new ObjectMapper();
+ static {
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
public ListAssigneeTypeHandler(Class> type) {
if (log.isTraceEnabled()) {
log.trace("JacksonTypeHandler(" + type + ")");
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListFormFieldPermissionTypeHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListFormFieldPermissionTypeHandler.java
index 705f30244..476b96057 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListFormFieldPermissionTypeHandler.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListFormFieldPermissionTypeHandler.java
@@ -1,11 +1,11 @@
package cn.axzo.workflow.core.conf.handler;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
@@ -27,6 +27,10 @@ import java.util.List;
public class ListFormFieldPermissionTypeHandler extends AbstractJsonTypeHandler> {
private static ObjectMapper objectMapper = new ObjectMapper();
+ static {
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
public ListFormFieldPermissionTypeHandler(Class> type) {
if (log.isTraceEnabled()) {
log.trace("JacksonTypeHandler(" + type + ")");
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSignFileDTOHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSignFileDTOHandler.java
new file mode 100644
index 000000000..92455d355
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSignFileDTOHandler.java
@@ -0,0 +1,64 @@
+package cn.axzo.workflow.core.conf.handler;
+
+import cn.axzo.workflow.common.model.dto.SignFileDTO;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 签署业务文件数据映射转换
+ *
+ * @author wangli
+ * @since 2025-04-03 11:24
+ */
+@Slf4j
+@MappedTypes({List.class})
+@MappedJdbcTypes({JdbcType.VARCHAR})
+public class ListSignFileDTOHandler extends AbstractJsonTypeHandler> {
+ private static ObjectMapper objectMapper = new ObjectMapper();
+
+ static {
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ public ListSignFileDTOHandler(Class> type) {
+ if (log.isTraceEnabled()) {
+ log.trace("JacksonTypeHandler(" + type + ")");
+ }
+ Assert.notNull(type, "Type argument cannot be null", new Object[0]);
+ }
+
+ @Override
+ protected List parse(String json) {
+ try {
+ // 这里进行了json解析,同样在这里也可以进行字段查询后的处理,如对象内部的手机号字段的加密展示等
+ return objectMapper.readValue(json, new TypeReference>() {
+ });
+ } catch (IOException var3) {
+ throw new RuntimeException(var3);
+ }
+ }
+
+ @Override
+ protected String toJson(List obj) {
+ try {
+ return objectMapper.writeValueAsString(obj);
+ } catch (JsonProcessingException var3) {
+ throw new RuntimeException(var3);
+ }
+ }
+
+ public static void setObjectMapper(ObjectMapper om) {
+ objectMapper = om;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSimpleDocDTOHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSimpleDocDTOHandler.java
new file mode 100644
index 000000000..3cd20f5a0
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/handler/ListSimpleDocDTOHandler.java
@@ -0,0 +1,64 @@
+package cn.axzo.workflow.core.conf.handler;
+
+import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 签署业务文件数据映射转换
+ *
+ * @author wangli
+ * @since 2025-04-03 11:24
+ */
+@Slf4j
+@MappedTypes({List.class})
+@MappedJdbcTypes({JdbcType.VARCHAR})
+public class ListSimpleDocDTOHandler extends AbstractJsonTypeHandler> {
+ private static ObjectMapper objectMapper = new ObjectMapper();
+
+ static {
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ public ListSimpleDocDTOHandler(Class> type) {
+ if (log.isTraceEnabled()) {
+ log.trace("JacksonTypeHandler(" + type + ")");
+ }
+ Assert.notNull(type, "Type argument cannot be null", new Object[0]);
+ }
+
+ @Override
+ protected List parse(String json) {
+ try {
+ // 这里进行了json解析,同样在这里也可以进行字段查询后的处理,如对象内部的手机号字段的加密展示等
+ return objectMapper.readValue(json, new TypeReference>() {
+ });
+ } catch (IOException var3) {
+ throw new RuntimeException(var3);
+ }
+ }
+
+ @Override
+ protected String toJson(List obj) {
+ try {
+ return objectMapper.writeValueAsString(obj);
+ } catch (JsonProcessingException var3) {
+ throw new RuntimeException(var3);
+ }
+ }
+
+ public static void setObjectMapper(ObjectMapper om) {
+ objectMapper = om;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java
index d0906e27d..993bb9877 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java
@@ -18,6 +18,7 @@ public class EndEventJsonConverter extends AbstractBpmnJsonConverter {
public EndEvent convertJsonToElement(BpmnJsonNode node, Process process, String formKey) {
EndEvent endEvent = new EndEvent();
endEvent.setId(END_EVENT_ID);
+ endEvent.setName("结束");
return endEvent;
}
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java
index a68b6f18d..7e7f5d9a2 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java
@@ -5,13 +5,10 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
import org.flowable.bpmn.model.ExtensionAttribute;
import org.flowable.bpmn.model.ExtensionElement;
-import org.flowable.bpmn.model.FlowableListener;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.ServiceTask;
-import org.flowable.bpmn.model.UserTask;
import org.springframework.util.CollectionUtils;
-import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java
index 683aec44b..80d9be308 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java
@@ -19,6 +19,7 @@ public class StartEventJsonConverter extends AbstractBpmnJsonConverter {
private static void setMultiInstance(BpmnJsonNode node, UserTask userTask) {
if (Objects.isNull(node.getProperty()) || Objects.equals(NODE_STARTER.getType(), userTask.getId())
- ||Objects.equals(Boolean.FALSE, node.getProperty().getIsMultiTask())) {
+ || Objects.equals(Boolean.FALSE, node.getProperty().getIsMultiTask())) {
return;
}
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics =
@@ -189,6 +194,46 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter {
// 业务节点有一种不设置审批人的选项, 除"审批方式"外都是空配置, 所以在此直接中断后续的扩展属性配置
return;
}
+
+ // 签署确认节点特有的配置
+ BpmnSignApproverLimit signApproverLimit = property.getSignApproverLimit();
+ if (Objects.equals(NODE_SIGN, node.getType()) && Objects.nonNull(signApproverLimit)
+ && Objects.nonNull(signApproverLimit.getOrgLimit()) && Objects.nonNull(signApproverLimit.getRoleLimit())) {
+ ExtensionElement signApproveElement = new ExtensionElement();
+ signApproveElement.setName(CONFIG_SIGN_APPROVER_LIMIT);
+
+ ExtensionElement signApproverOrgLimitElement = new ExtensionElement();
+ signApproverOrgLimitElement.setName(CONFIG_SIGN_APPROVER_ORG_LIMIT);
+ ExtensionAttribute signApproverOrgLimitValueAttribute = new ExtensionAttribute();
+ signApproverOrgLimitValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ signApproverOrgLimitValueAttribute.setValue(signApproverLimit.getOrgLimit().getType());
+ ExtensionAttribute signApproverOrgLimitDescAttribute = new ExtensionAttribute();
+ signApproverOrgLimitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
+ signApproverOrgLimitDescAttribute.setValue(signApproverLimit.getOrgLimit().getDesc());
+ signApproverOrgLimitElement.addAttribute(signApproverOrgLimitValueAttribute);
+ signApproverOrgLimitElement.addAttribute(signApproverOrgLimitDescAttribute);
+ signApproveElement.addChildElement(signApproverOrgLimitElement);
+
+ ExtensionElement signApproverRoleLimitElement = new ExtensionElement();
+ signApproverRoleLimitElement.setName(CONFIG_SIGN_APPROVER_ROLE_LIMIT);
+ ExtensionAttribute signApproverRoleLimitValueAttribute = new ExtensionAttribute();
+ signApproverRoleLimitValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ signApproverRoleLimitValueAttribute.setValue(signApproverLimit.getRoleLimit().getType());
+ ExtensionAttribute signApproverRoleLimitDescAttribute = new ExtensionAttribute();
+ signApproverRoleLimitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
+ signApproverRoleLimitDescAttribute.setValue(signApproverLimit.getRoleLimit().getDesc());
+ signApproverRoleLimitElement.addAttribute(signApproverRoleLimitValueAttribute);
+ signApproverRoleLimitElement.addAttribute(signApproverRoleLimitDescAttribute);
+ signApproveElement.addChildElement(signApproverRoleLimitElement);
+
+ userTask.addExtensionElement(signApproveElement);
+
+ if (Objects.isNull(property.getApproverSpecify())) {
+ property.setApproverSpecify(ApproverSpecifyEnum.signerRelated);
+ }
+ }
+
+ // TODO 签署确认节点的一些额外配置,需要在此处处理。
if (Objects.nonNull(property.getApproverScope())) {
// 审批人所在范围
ExtensionElement approverScopeElement = new ExtensionElement();
@@ -260,6 +305,24 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter {
approverEmptyHandleTypeElement.addAttribute(approverEmptyHandleTypeDescAttribute);
userTask.addExtensionElement(approverEmptyHandleTypeElement);
}
+
+ if (Objects.equals(Boolean.TRUE, property.getSignature())) {
+ // 电子签名开关
+ ExtensionElement signatureElement = new ExtensionElement();
+ signatureElement.setName(CONFIG_ACTIVITY_SIGNATURE);
+
+ ExtensionAttribute approverSignatureValueAttribute = new ExtensionAttribute();
+ approverSignatureValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
+ approverSignatureValueAttribute.setValue(property.getSignature().toString());
+ signatureElement.addAttribute(approverSignatureValueAttribute);
+
+ ExtensionAttribute approverSignatureDescAttribute = new ExtensionAttribute();
+ approverSignatureDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
+ approverSignatureDescAttribute.setValue("电子签名");
+ signatureElement.addAttribute(approverSignatureDescAttribute);
+
+ userTask.addExtensionElement(signatureElement);
+ }
}
/**
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/approverscope/PreTaskUserProcessor.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/approverscope/PreTaskUserProcessor.java
index abbec1663..2afcf7d78 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/approverscope/PreTaskUserProcessor.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/approverscope/PreTaskUserProcessor.java
@@ -38,6 +38,7 @@ public class PreTaskUserProcessor implements ApproverScopeProcessor {
// 上级节点
String preActivityId = preUserTaskOpt.get().getId();
// 获取上一级节点
+ @SuppressWarnings("unchecked")
List assigners = (List) execution
.getVariableLocal(INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + preActivityId);
List entOrg = CollectionUtils.emptyIfNull(assigners).stream()
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomReceiveTaskActivityBehavior.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomReceiveTaskActivityBehavior.java
index 61d24aa2d..db15327e2 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomReceiveTaskActivityBehavior.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomReceiveTaskActivityBehavior.java
@@ -77,7 +77,7 @@ public class CustomReceiveTaskActivityBehavior extends ReceiveTaskActivityBehavi
processEngineConfiguration.getEngineCfgKey());
// 解决两个业务节点相邻时,无法正确的往下流转的问题
- TaskHelper.deleteTask(task, null, true, true, true);
+ TaskHelper.deleteTask(task, "complete business node", false, true, true);
} else {
log.warn("ReceiveTask is null, executionId: {}, activityId: {}", execution.getId(),
execution.getCurrentActivityId());
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java
index f8ba27868..85513cf84 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java
@@ -2,6 +2,7 @@ package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
@@ -13,6 +14,7 @@ import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.ENGINE_EXEC_EXCE
* @author wangli
* @since 2024/7/1 13:59
*/
+@Slf4j
public abstract class AbstractCommand implements Command {
public abstract String paramToJsonString();
@@ -24,7 +26,8 @@ public abstract class AbstractCommand implements Command {
} catch (WorkflowEngineException e) {
throw e;
} catch (Exception e) {
- throw new WorkflowEngineException(ENGINE_EXEC_EXCEPTION);
+ log.warn(e.getMessage(), e);
+ throw new WorkflowEngineException(ENGINE_EXEC_EXCEPTION, e, e.getMessage());
}
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java
index e78406f28..45a2eef3c 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java
@@ -103,9 +103,9 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand impleme
Map variables = new HashMap<>();
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_ABORT);
variables.put(INTERNAL_PROCESS_DELETE_REASON, reason);
- variables.put(INTERNAL_END_TENANT_ID, assigner.getTenantId());
- variables.put(INTERNAL_END_USER_ID, assigner.buildAssigneeId());
- variables.put(INTERNAL_END_USER_NAME, assigner.getAssignerName());
+// variables.put(INTERNAL_END_TENANT_ID, assigner.getTenantId());
+// variables.put(INTERNAL_END_USER_ID, assigner.buildAssigneeId());
+// variables.put(INTERNAL_END_USER_NAME, assigner.getAssignerName());
runtimeService.setVariables(instance.getId(), variables);
CommandContextUtil.getAgenda(commandContext).planOperation(new DeleteProcessInstanceOperation(commandContext,
@@ -118,6 +118,8 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand impleme
batchAddAttachment(commandContext, task.getProcessInstanceId(), task, attachmentList, assigner);
completeVirtualTask(commandContext, task);
+
+ runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner);
return null;
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java
index cf0b1d48b..df374ad18 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java
@@ -52,7 +52,7 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S
if (Objects.isNull(task)) {
throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId());
}
- addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已处理");
+ addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意");
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
runtimeService.trigger(dto.getTriggerId());
return null;
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java
new file mode 100644
index 000000000..31cae5f7b
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java
@@ -0,0 +1,77 @@
+package cn.axzo.workflow.core.engine.cmd;
+
+import cn.axzo.workflow.common.model.dto.TermNodeAddTimerJobDTO;
+import cn.axzo.workflow.core.converter.json.NotSupportConverter;
+import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.bpmn.model.TimerEventDefinition;
+import org.flowable.common.engine.impl.interceptor.CommandContext;
+import org.flowable.engine.ManagementService;
+import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.flowable.engine.impl.jobexecutor.TimerEventHandler;
+import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
+import org.flowable.engine.impl.util.CommandContextUtil;
+import org.flowable.engine.impl.util.TimerUtil;
+import org.flowable.engine.runtime.Execution;
+import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
+import org.springframework.util.CollectionUtils;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 自定义添加定时任务的逻辑
+ *
+ * @author wangli
+ * @since 2025-03-19 18:24
+ */
+@Slf4j
+public class CustomAddTimerJobCmd extends AbstractCommand implements Serializable {
+ private final TermNodeAddTimerJobDTO dto;
+
+ public CustomAddTimerJobCmd(TermNodeAddTimerJobDTO dto) {
+ this.dto = dto;
+ }
+
+ @Override
+ public String paramToJsonString() {
+ return JSON.toJSONString(dto);
+ }
+
+ @Override
+ public Void executeInternal(CommandContext commandContext) {
+ log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, timeCycle: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getTimeCycle());
+ ProcessEngineConfigurationImpl processEngineConfiguration =
+ CommandContextUtil.getProcessEngineConfiguration(commandContext);
+
+ ManagementService managementService = processEngineConfiguration.getManagementService();
+ String tableName = managementService.getTableName(Execution.class);
+ List list = processEngineConfiguration.getRuntimeService()
+ .createNativeExecutionQuery()
+ .sql("SELECT * FROM " + tableName + " WHERE PROC_INST_ID_ = #{instanceId} AND ACT_ID_ = #{activityId} AND IS_ACTIVE_ = 1 AND TASK_COUNT_ = 1")
+ .parameter("instanceId", dto.getProcessInstanceId())
+ .parameter("activityId", dto.getActivityId())
+ .list();
+ if (CollectionUtils.isEmpty(list)) {
+ return null;
+ }
+
+ if (list.get(list.size() - 1) instanceof ExecutionEntity) {
+ ExecutionEntity executionEntity = (ExecutionEntity) list.get(list.size() - 1);
+ TimerEventDefinition timerEventDefinition = new TimerEventDefinition();
+ timerEventDefinition.setTimeCycle(dto.getTimeCycle());
+ TimerJobEntity timerJob = TimerUtil.createTimerEntityForTimerEventDefinition(timerEventDefinition,
+ new NotSupportConverter.NotSupportFlowElement(),
+ false, executionEntity, AsyncTermNodeAlterJobHandler.TYPE,
+ TimerEventHandler.createConfiguration(executionEntity.getCurrentActivityId(), null,
+ timerEventDefinition.getCalendarName()));
+ if (timerJob != null) {
+ CommandContextUtil.getTimerJobService().scheduleTimerJob(timerJob);
+ }
+ } else {
+ log.warn("未找到 execution entity");
+ }
+ return null;
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java
index f04a60914..c727eb2a5 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java
@@ -1,10 +1,13 @@
package cn.axzo.workflow.core.engine.cmd;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
+import cn.axzo.workflow.common.model.dto.SignatureDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import com.alibaba.fastjson.JSON;
+import org.apache.commons.collections4.ListUtils;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService;
@@ -17,17 +20,22 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER;
+import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
@@ -101,11 +109,14 @@ public class CustomApproveTaskCmd extends AbstractCommand implements Seria
if (Objects.nonNull(operationDesc)) {
this.operationDesc = operationDesc;
} else {
- this.operationDesc = "(已通过)";
+ this.operationDesc = "已同意";
}
}
@Override
+ /**
+ * TODO 重要说明,该类与 CustomApproveTaskWithFormCmd 作用等同,当逻辑有调整时,需同步调整
+ */
public Void execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
@@ -140,10 +151,43 @@ public class CustomApproveTaskCmd extends AbstractCommand implements Seria
nextApprover);
}
task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus());
+
+ // 记录电子签名的图片
+ recordSignature(task, runtimeService);
+
executeSynchronous(task, taskService, runtimeService);
+
+ runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
return null;
}
+ private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
+ List signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
+ if (Objects.isNull(signatures)) {
+ signatures = new ArrayList<>();
+ }
+ Optional any = signatures.stream()
+ .filter(i -> Objects.equals(i.getActivityId(), task.getTaskDefinitionKey())).findAny();
+ SignatureDTO dto = any.orElse(new SignatureDTO()
+ .setActivityId(task.getTaskDefinitionKey())
+ .setActivityName(task.getName())
+ .setSignatures(new ArrayList<>()));
+ ListUtils.emptyIfNull(attachmentList).stream()
+ .filter(i -> Objects.equals(i.getType(), AttachmentTypeEnum.signature))
+ .findFirst()
+ .ifPresent(attachment -> dto.getSignatures().add(0,
+ new SignatureDTO.SignDetail()
+ .setSignature(attachment.getUrl())
+ .setAdvice(advice)));
+ if (!any.isPresent()) {
+ signatures.add(dto);
+ }
+
+ if (!CollectionUtils.isEmpty(signatures)) {
+ runtimeService.setVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, signatures);
+ }
+ }
+
private void executeSynchronous(Task task, TaskService taskService, RuntimeService runtimeService) {
if (StringUtils.hasText(task.getExecutionId())) {
// 正常完成流程任务,审批通过
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java
index f2f355f6a..c33bc5473 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java
@@ -1,8 +1,9 @@
package cn.axzo.workflow.core.engine.cmd;
+import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
-import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
+import cn.axzo.workflow.common.model.dto.SignatureDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
@@ -13,7 +14,7 @@ import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import com.alibaba.fastjson.JSON;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.collections4.ListUtils;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService;
@@ -33,11 +34,12 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
-import java.util.Collection;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -45,7 +47,9 @@ import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_FIELD_VALID
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER;
+import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_SUBMIT_FORM_VARIABLE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
@@ -59,6 +63,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask
*/
public class CustomApproveTaskWithFormCmd extends AbstractCommand implements Serializable {
+ private static final long serialVersionUID = 2366844598166684546L;
private static final Logger log = LoggerFactory.getLogger(CustomApproveTaskWithFormCmd.class);
private final String taskId;
/**
@@ -85,12 +90,12 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
/**
* 指定节点类型
*/
- private List nodeTypes;
+ private final List nodeTypes;
/**
* 表单数据
*/
- private Map formVariables;
+ private final Map formVariables;
@Override
public String paramToJsonString() {
@@ -125,11 +130,14 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
if (Objects.nonNull(operationDesc)) {
this.operationDesc = operationDesc;
} else {
- this.operationDesc = "(已通过)";
+ this.operationDesc = "已同意";
}
}
@Override
+ /**
+ * TODO 重要说明,该类与 CustomApproveTaskCmd 作用等同,当逻辑有调整时,需同步调整
+ */
public Void execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
@@ -165,6 +173,10 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
nextApprover);
}
task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus());
+
+ // 记录电子签名的图片
+ recordSignature(task, runtimeService);
+
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
return null;
}
@@ -183,12 +195,12 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
if (CollectionUtils.isEmpty(logs) || logs.size() != 1) {
throw new WorkflowEngineException(FORM_FIELD_VALIDATOR_ERROR);
}
- ExtAxProcessLog log = logs.get(0);
- Map permissionMap = log.getFormFieldPermissionConf().stream()
+ ExtAxProcessLog axProcessLog = logs.get(0);
+ Map permissionMap = axProcessLog.getFormFieldPermissionConf().stream()
.collect(Collectors.toMap(FormPermissionMetaInfo::getFieldId, Function.identity(), (s, t) -> s));
formVariables.forEach((k, v) -> {
FormPermissionMetaInfo permission = permissionMap.getOrDefault(k, new FormPermissionMetaInfo());
- if (permission.getRequired()) {
+ if (Boolean.TRUE.equals(permission.getRequired())) {
if (Objects.isNull(v)) {
throw new WorkflowEngineException(FORM_FIELD_VALIDATOR_ERROR);
}
@@ -202,7 +214,7 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
private void executeSynchronous(Task task, TaskService taskService, RuntimeService runtimeService, CommandContext commandContext, String tenantId) {
ExtAxBpmnFormRelationService bpmnFormRelationService = SpringContextUtils.getBean(ExtAxBpmnFormRelationService.class);
ExtAxBpmnFormRelation relation = bpmnFormRelationService.queryByBpmnDefinitionId(task.getProcessDefinitionId());
- if (Objects.nonNull(relation)) {
+ if (Objects.nonNull(relation) && !CollectionUtils.isEmpty(formVariables)) {
log.info("带有表单的审批");
FormEngineConfigurationApi formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration(commandContext);
FormRepositoryService formRepositoryService = formEngineConfiguration.getFormRepositoryService();
@@ -211,19 +223,7 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
.deploymentId(relation.getFormDeploymentId())
.singleResult();
Authentication.setAuthenticatedUserId(approver.buildAssigneeId());
- formVariables.entrySet().forEach(e -> {
- if (e.getValue() instanceof Collection) {
- List convertUploads = ((Collection>) e.getValue()).stream().map(i -> {
- if (i instanceof String) {
- return UploadFieldDTO.toObject(String.valueOf(i)).toSpecString();
- } else {
- ObjectMapper objectMapper = SpringContextUtils.getBean(ObjectMapper.class);
- return objectMapper.convertValue(i, UploadFieldDTO.class).toSpecString();
- }
- }).collect(Collectors.toList());
- e.setValue(StringUtils.collectionToCommaDelimitedString(convertUploads));
- }
- });
+ runtimeService.setVariableLocal(task.getProcessInstanceId(), TASK_SUBMIT_FORM_VARIABLE, formVariables);
taskService.completeTaskWithForm(taskId, formDefinition.getId(), null, formVariables);
Authentication.setAuthenticatedUserId(null);
} else {
@@ -239,4 +239,30 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen
}
}
+ private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
+ List signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
+ if (Objects.isNull(signatures)) {
+ signatures = new ArrayList<>();
+ }
+ Optional any = signatures.stream()
+ .filter(i -> Objects.equals(i.getActivityId(), task.getTaskDefinitionKey())).findAny();
+ SignatureDTO dto = any.orElse(new SignatureDTO()
+ .setActivityId(task.getTaskDefinitionKey())
+ .setActivityName(task.getName())
+ .setSignatures(new ArrayList<>()));
+ ListUtils.emptyIfNull(attachmentList).stream()
+ .filter(i -> Objects.equals(i.getType(), AttachmentTypeEnum.signature))
+ .findFirst()
+ .ifPresent(attachment -> dto.getSignatures().add(0,
+ new SignatureDTO.SignDetail()
+ .setSignature(attachment.getUrl())
+ .setAdvice(advice)));
+ if (!any.isPresent()) {
+ signatures.add(dto);
+ }
+
+ if (!CollectionUtils.isEmpty(signatures)) {
+ runtimeService.setVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, signatures);
+ }
+ }
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBackTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBackTaskCmd.java
index ef456b038..3a9b88a04 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBackTaskCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBackTaskCmd.java
@@ -1,9 +1,14 @@
package cn.axzo.workflow.core.engine.cmd;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.utils.BpmnModelUtils;
import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.FlowNode;
@@ -15,23 +20,27 @@ import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.flowable.task.api.history.HistoricTaskInstance;
-import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.task.service.TaskService;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.stream.Collectors;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.BACK_NODE_CANNOT_REACHABLE;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.BACK_TARGET_ACTIVITY_NOT_EXISTS;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.BACKED;
-import static cn.axzo.workflow.common.code.BpmnTaskRespCode.BACK_NODE_CANNOT_REACHABLE;
-import static cn.axzo.workflow.common.code.BpmnTaskRespCode.BACK_TARGET_ACTIVITY_NOT_EXISTS;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
@@ -43,66 +52,122 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask
public class CustomBackTaskCmd extends AbstractCommand implements Serializable {
private static final long serialVersionUID = -1241290344311892346L;
- private final BpmnTaskBackAuditDTO dto;
+
+ private final List targetTaskIds;
+ private final String advice;
+ private final String operationDesc;
+ private final List attachmentList;
+ private final BpmnTaskDelegateAssigner operator;
+ private final String processInstanceId;
+ private final String currentActivityId;
+ private final String toActivityId;
+ private final boolean validateApprover;
private static final String OPERATION_DESC = "回退至";
+ public CustomBackTaskCmd(CustomBackParamsDto customBackParamsDto) {
+ if (customBackParamsDto == null) {
+ throw new NullPointerException("customBackParamsDto is null");
+ }
+ if (customBackParamsDto.getOperator() == null) {
+ throw new NullPointerException("operator is null");
+ }
+ this.targetTaskIds = customBackParamsDto.getTargetTaskIds();
+ this.advice = customBackParamsDto.getAdvice();
+ this.operationDesc = customBackParamsDto.getOperationDesc();
+ this.attachmentList = customBackParamsDto.getAttachmentList();
+ this.operator = customBackParamsDto.getOperator();
+ this.processInstanceId = customBackParamsDto.getProcessInstanceId();
+ this.currentActivityId = customBackParamsDto.getCurrentActivityId();
+ this.toActivityId = customBackParamsDto.getToActivityId();
+ this.validateApprover = customBackParamsDto.isValidateApprover();
+ }
+
@Override
public String paramToJsonString() {
Map params = new HashMap<>();
- params.put("taskId", dto.getTaskId());
- params.put("advice", dto.getAdvice());
+ params.put("targetTaskIds", JSON.toJSONString(this.targetTaskIds));
+ params.put("advice", advice);
params.put("operationDesc", OPERATION_DESC);
- params.put("attachmentList", JSON.toJSONString(dto.getAttachmentList()));
- params.put("approver", JSON.toJSONString(dto.getApprover()));
- params.put("nodeTypes", JSON.toJSONString(dto.getNodeTypes()));
+ params.put("attachmentList", JSON.toJSONString(attachmentList));
+ params.put("operator", JSON.toJSONString(operator));
+ params.put("toActivityId", JSON.toJSONString(this.toActivityId));
+ params.put("processInstanceId", JSON.toJSONString(this.processInstanceId));
+ params.put("validateApprover", validateApprover);
return JSON.toJSONString(params);
}
- public CustomBackTaskCmd(BpmnTaskBackAuditDTO dto) {
- this.dto = dto;
- }
-
@Override
public Void execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
- CommandContextUtil.getProcessEngineConfiguration(commandContext);
- HistoricTaskInstanceQuery taskQuery =
- processEngineConfiguration.getHistoryService().createHistoricTaskInstanceQuery();
- TaskService taskService = processEngineConfiguration.getTaskServiceConfiguration().getTaskService();
-
- HistoricTaskInstance historicTaskInstance = taskQuery.taskId(dto.getTaskId()).singleResult();
-
- TaskEntity task = taskService.getTask(dto.getTaskId());
- validTask(historicTaskInstance, task, dto.getApprover(), dto.getNodeTypes());
-
- Process process = ProcessDefinitionUtil.getProcess(task.getProcessDefinitionId());
- FlowElement targetFlowElement = process.getFlowElement(dto.getToActivityId(), true);
- if (Objects.isNull(targetFlowElement)) {
- throw new WorkflowEngineException(BACK_TARGET_ACTIVITY_NOT_EXISTS, dto.getToActivityId());
+ CommandContextUtil.getProcessEngineConfiguration(commandContext);
+ List taskList = processEngineConfiguration.getHistoryService()
+ .createHistoricTaskInstanceQuery()
+ .taskDefinitionKey(currentActivityId)
+ .processInstanceId(processInstanceId)
+ .list();
+ List valueableTaskList = taskList.stream()
+ .filter(hi -> {
+ if (hi.getEndTime() != null) {
+ return false;
+ }
+ if (!CollectionUtils.isEmpty(targetTaskIds)) {
+ return targetTaskIds.contains(hi.getId());
+ }
+ return true;
+ })
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(valueableTaskList)) {
+ throw new WorkflowEngineException(TASK_COMPLETE_FAIL_NOT_EXISTS);
}
- FlowElement sourceFlowElement = process.getFlowElement(task.getTaskDefinitionKey(), true);
+ TaskService taskService = processEngineConfiguration.getTaskServiceConfiguration().getTaskService();
+ if (validateApprover) {
+ valueableTaskList.forEach(hi -> validTask(hi, taskService.getTask(hi.getId()), operator, null));
+ }
+ String processDefinitionId = valueableTaskList.get(0).getProcessDefinitionId();
+ Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);
+ FlowElement targetFlowElement = process.getFlowElement(toActivityId, true);
+ if (Objects.isNull(targetFlowElement)) {
+ throw new WorkflowEngineException(BACK_TARGET_ACTIVITY_NOT_EXISTS, toActivityId);
+ }
+ FlowElement sourceFlowElement = process.getFlowElement(currentActivityId, true);
// 退回节点到当前节点不可达到,不允许退回
if (!BpmnModelUtils.isReachable(process, (FlowNode) targetFlowElement, (FlowNode) sourceFlowElement)) {
- throw new WorkflowEngineException(BACK_NODE_CANNOT_REACHABLE, dto.getToActivityId());
+ throw new WorkflowEngineException(BACK_NODE_CANNOT_REACHABLE, toActivityId);
}
- batchAddAttachment(commandContext, task.getProcessInstanceId(), task, dto.getAttachmentList(), dto.getApprover());
-
- Authentication.setAuthenticatedUserId(dto.getApprover().buildAssigneeId());
- addComment(commandContext, task, COMMENT_TYPE_ADVICE, dto.getAdvice());
- addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, OPERATION_DESC + targetFlowElement.getName());
- Authentication.setAuthenticatedUserId(null);
-
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
- task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + dto.getTaskId(), BACKED.getStatus());
-
+ valueableTaskList.forEach(th -> {
+ TaskEntity task = taskService.getTask(th.getId());
+ Authentication.setAuthenticatedUserId(operator.buildAssigneeId());
+ batchAddAttachment(commandContext, processInstanceId, task, attachmentList, operator);
+ addComment(commandContext, task, COMMENT_TYPE_ADVICE, advice);
+ addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, StringUtils.hasText(operationDesc) ? operationDesc : OPERATION_DESC + targetFlowElement.getName());
+ Authentication.setAuthenticatedUserId(null);
+ task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + task.getId(), BACKED.getStatus());
+ });
// 移除回退到的指定节点的变量,让 EngineExecutionStartListener 重新计算该节点的人
- runtimeService.removeVariable(task.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO + dto.getToActivityId());
+ runtimeService.removeVariable(processInstanceId, INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO + toActivityId);
runtimeService.createChangeActivityStateBuilder()
- .processInstanceId(task.getProcessInstanceId())
- .moveActivityIdsToSingleActivityId(Collections.singletonList(task.getTaskDefinitionKey()), dto.getToActivityId())
- .changeState();
+ .processInstanceId(processInstanceId)
+ .moveActivityIdsToSingleActivityId(Collections.singletonList(currentActivityId), toActivityId)
+ .changeState();
return null;
}
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ @Builder
+ public static final class CustomBackParamsDto {
+ private List targetTaskIds;
+ private String advice;
+ private String operationDesc;
+ private List attachmentList;
+ private BpmnTaskDelegateAssigner operator;
+ private String processInstanceId;
+ private String currentActivityId;
+ private String toActivityId;
+ private boolean validateApprover;
+ }
+
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java
index 8cecd996c..243063932 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java
@@ -1,7 +1,7 @@
package cn.axzo.workflow.core.engine.cmd;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
import com.alibaba.fastjson.JSON;
import org.flowable.common.engine.impl.interceptor.CommandContext;
@@ -24,16 +24,16 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
+import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
+import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
-import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
-import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
-import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
-import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
/**
@@ -133,6 +133,7 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand
CommandContextUtil.getProcessEngineConfiguration(commandContext);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
+ @SuppressWarnings("unchecked")
List originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java
index 509b1b986..4052f92f6 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java
@@ -1,8 +1,8 @@
package cn.axzo.workflow.core.engine.cmd;
-import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
-import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
+import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.job.AsyncCancelProcessInstanceJobHandler;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
@@ -17,17 +17,17 @@ import org.flowable.job.service.impl.persistence.entity.JobEntity;
import java.io.Serializable;
import java.util.Objects;
-import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_CANCEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
+import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
public class CustomCancelProcessInstanceAsyncCmd extends AbstractCommand implements Serializable {
- private final BpmnProcessInstanceCancelDTO dto;
+ private final SuperBpmnProcessInstanceCancelDTO dto;
- public CustomCancelProcessInstanceAsyncCmd(BpmnProcessInstanceCancelDTO dto) {
+ public CustomCancelProcessInstanceAsyncCmd(SuperBpmnProcessInstanceCancelDTO dto) {
this.dto = dto;
}
@@ -38,14 +38,13 @@ public class CustomCancelProcessInstanceAsyncCmd extends AbstractCommand i
@Override
public Void execute(CommandContext commandContext) {
- String processInstanceId = dto.getProcessInstanceId(), tenantId = dto.getTenantId();
+ String processInstanceId = dto.getProcessInstanceId();
BpmnTaskDelegateAssigner initiator = dto.getInitiator();
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
HistoryService historyService = processEngineConfiguration.getHistoryService();
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
- .processInstanceTenantId(tenantId)
.singleResult();
if (Objects.isNull(instance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_NOT_EXISTS);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java
index 41bb9c051..f09b7bbf2 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java
@@ -1,7 +1,7 @@
package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
-import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
+import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.model.AddComment;
@@ -12,9 +12,12 @@ import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
+import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
+import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
@@ -27,10 +30,9 @@ import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_CANCEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CANCEL_PROCESS_NODE_DEF_KEY_NAME;
+import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG;
-import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_TENANT_ID;
-import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_ID;
-import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_NAME;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_DELETE_REASON;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_CANCEL;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CANCEL;
@@ -47,6 +49,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVir
* @since 2024/1/2 18:19
*/
public class CustomCancelProcessInstanceCmd extends AbstractCommand implements Serializable {
+ private static final long serialVersionUID = 6556399267210245511L;
private final String processInstanceId;
private final String tenantId;
private final String reason;
@@ -54,8 +57,9 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem
private final String nodeName;
private final List attachmentList;
private final ExtAxHiTaskInstService extAxHiTaskInstService;
+ private final Boolean superAdmin;
- public CustomCancelProcessInstanceCmd(BpmnProcessInstanceCancelDTO dto,
+ public CustomCancelProcessInstanceCmd(SuperBpmnProcessInstanceCancelDTO dto,
ExtAxHiTaskInstService extAxHiTaskInstService) {
this.processInstanceId = dto.getProcessInstanceId();
this.tenantId = dto.getTenantId();
@@ -63,6 +67,7 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem
this.initiator = dto.getInitiator();
this.nodeName = StringUtils.hasText(dto.getNodeName()) ? dto.getNodeName() : "发起人撤回";
this.attachmentList = dto.getAttachmentList();
+ this.superAdmin = Objects.nonNull(dto.getSuperAdmin()) && dto.getSuperAdmin();
this.extAxHiTaskInstService = extAxHiTaskInstService;
}
@@ -82,10 +87,13 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem
CommandContextUtil.getProcessEngineConfiguration(commandContext);
HistoryService historyService = processEngineConfiguration.getHistoryService();
- HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
- .processInstanceId(processInstanceId)
- .processInstanceTenantId(tenantId)
- .singleResult();
+ HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
+ .processInstanceId(processInstanceId);
+ if (Objects.equals(Boolean.TRUE, superAdmin)) {
+ query.processInstanceTenantId(tenantId);
+ }
+
+ HistoricProcessInstance instance = query.singleResult();
if (Objects.isNull(instance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_NOT_EXISTS);
}
@@ -94,7 +102,7 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem
throw new WorkflowEngineException(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS);
}
- if (Objects.isNull(initiator) || !initiator.comparePersonIdToOther(instance.getStartUserId())) {
+ if (!Objects.equals(Boolean.TRUE, superAdmin) && !initiator.comparePersonIdToOther(instance.getStartUserId())) {
throw new WorkflowEngineException(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF);
}
@@ -102,26 +110,37 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem
throw new WorkflowEngineException(PROCESS_INSTANCE_CANT_CANCEL);
}
-
+ List tasks = processEngineConfiguration.getTaskService()
+ .createTaskQuery()
+ .processInstanceId(processInstanceId)
+ .active()
+ .list();
+ String taskDefKey = "";
+ if (!CollectionUtils.isEmpty(tasks)) {
+ taskDefKey = tasks.get(0).getTaskDefinitionKey();
+ }
Map variables = new HashMap<>();
- variables.put(INTERNAL_END_TENANT_ID, tenantId);
- variables.put(INTERNAL_END_USER_ID, initiator.buildAssigneeId());
- variables.put(INTERNAL_END_USER_NAME, initiator.getAssignerName());
+// variables.put(INTERNAL_END_TENANT_ID, tenantId);
+// variables.put(INTERNAL_END_USER_ID, initiator.buildAssigneeId());
+// variables.put(INTERNAL_END_USER_NAME, initiator.getAssignerName());
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_CANCEL);
variables.put(INTERNAL_PROCESS_DELETE_REASON, reason);
+ variables.put(CANCEL_PROCESS_NODE_DEF_KEY_NAME, taskDefKey);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
runtimeService.setVariables(instance.getId(), variables);
CommandContextUtil.getAgenda(commandContext).planOperation(new DeleteProcessInstanceOperation(commandContext,
- processInstanceId, extAxHiTaskInstService, CANCELLED));
+ processInstanceId, extAxHiTaskInstService, CANCELLED));
// 添加自定义的节点,用于展示最后的操作
TaskEntity task = createVirtualTask(commandContext, extAxHiTaskInstService, processInstanceId,
- nodeName, NODE_CANCEL.getType(), reason, initiator, CANCELLED.getStatus(), new AddComment(CANCELLED.getDesc()));
+ nodeName, NODE_CANCEL.getType(), reason, initiator, CANCELLED.getStatus(), new AddComment(CANCELLED.getDesc()));
batchAddAttachment(commandContext, processInstanceId, task, attachmentList, initiator);
completeVirtualTask(commandContext, task);
+
+ runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator);
return null;
}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java
index d309f18ad..b7748ace0 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java
@@ -23,9 +23,7 @@ import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -37,7 +35,6 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.COUNTE
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
-import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.deleteMultiTasks;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getDuplicatePendingTasks;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
@@ -173,7 +170,10 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand implemen
message.append("、");
}
}
- message.append("等").append(targetTaskAssigneeList.size()).append("人进行审批");
+ if (targetTaskAssigneeList.size() > end) {
+ message.append("等");
+ }
+ message.append(targetTaskAssigneeList.size()).append("人进行审批");
Task virtualTask = createVirtualTask(commandContext, extAxHiTaskInstService, task.getProcessInstanceId(), task.getName(),
task.getTaskDefinitionKey(), advice, originTaskAssignee, COUNTERSIGN.getStatus(), new AddComment(message.toString()));
batchAddAttachment(commandContext, task.getProcessInstanceId(), task, attachmentList, originTaskAssignee);
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceLatestValuesCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceLatestValuesCmd.java
new file mode 100644
index 000000000..169dfb5e0
--- /dev/null
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceLatestValuesCmd.java
@@ -0,0 +1,145 @@
+package cn.axzo.workflow.core.engine.cmd;
+
+import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
+import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.flowable.common.engine.impl.interceptor.CommandContext;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.flowable.form.api.FormInstance;
+import org.flowable.form.api.FormService;
+import org.flowable.form.engine.FormEngineConfiguration;
+import org.flowable.form.engine.impl.cmd.GetFormInstanceValuesCmd;
+import org.flowable.form.engine.impl.util.CommandContextUtil;
+import org.flowable.variable.api.history.HistoricVariableInstance;
+import org.joda.time.LocalDate;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
+import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_INSTANCE_DATA_NOT_FOUND;
+import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_SUBMIT_FORM_VARIABLE;
+import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
+
+/**
+ * 自定义的获取表单实例数据的命令
+ *
+ * @author wangli
+ * @since 2025-01-21 10:24
+ */
+public class CustomGetFormInstanceLatestValuesCmd extends GetFormInstanceValuesCmd {
+ private String processInstanceId;
+ private Boolean throwException;
+
+ public CustomGetFormInstanceLatestValuesCmd(String processInstanceId) {
+ this(null, processInstanceId, true);
+ }
+
+ public CustomGetFormInstanceLatestValuesCmd(String processInstanceId, Boolean throwException) {
+ this(null, processInstanceId, throwException);
+ }
+
+ public CustomGetFormInstanceLatestValuesCmd(String formInstanceId, String processInstanceId,
+ Boolean throwException) {
+ super(formInstanceId);
+ this.processInstanceId = processInstanceId;
+ this.throwException = throwException;
+ }
+
+ @Override
+ public byte[] execute(CommandContext commandContext) {
+ if (StringUtils.hasText(formInstanceId) && !StringUtils.hasText(processInstanceId)) {
+ return super.execute(commandContext);
+ }
+ ProcessEngineConfigurationImpl processEngineConfiguration =
+ org.flowable.engine.impl.util.CommandContextUtil.getProcessEngineConfiguration(commandContext);
+
+ HistoricProcessInstance instance =
+ processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+ if (Objects.isNull(instance)) {
+ throw new WorkflowEngineException(PROCESS_INSTANCE_ID_NOT_EXISTS, processInstanceId);
+ }
+ Map variableLocal = new HashMap<>();
+ if (Objects.equals(PROCESSING, BpmnProcessInstanceResultEnum.valueOfStatus(instance.getBusinessStatus()))) {
+ Map taskSubmitFormVariables =
+ processEngineConfiguration.getRuntimeService().getVariableLocal(processInstanceId,
+ TASK_SUBMIT_FORM_VARIABLE, Map.class);
+ if (!CollectionUtils.isEmpty(taskSubmitFormVariables)) {
+ variableLocal.putAll(taskSubmitFormVariables);
+ }
+ } else {
+ HistoricVariableInstance historicVariableInstance = processEngineConfiguration.getHistoryService()
+ .createHistoricVariableInstanceQuery()
+ .processInstanceId(processInstanceId)
+ .variableName(TASK_SUBMIT_FORM_VARIABLE)
+ .singleResult();
+ if (Objects.nonNull(historicVariableInstance)) {
+ variableLocal.putAll((Map) historicVariableInstance.getValue());
+ }
+ }
+ FormEngineConfiguration formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration();
+ if (CollectionUtils.isEmpty(variableLocal)) {
+
+ FormService formService = formEngineConfiguration.getFormService();
+ List formInstances =
+ formService.createFormInstanceQuery().processInstanceId(processInstanceId)
+ .orderBySubmittedDate().desc().listPage(0, 1);
+ if (!CollectionUtils.isEmpty(formInstances)) {
+ // {
+ // "values" : {
+ // "form_mutil_text1" : "表单变量 2",
+ // "form_text1" : "表单变量 1",
+ // "form_image1" : "[{\"fileUrl\":\"http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960\"}]"
+ // }
+ //}
+ return formInstances.get(0).getFormValueBytes();
+ }
+ if (throwException) {
+ throw new WorkflowEngineException(FORM_INSTANCE_DATA_NOT_FOUND, processInstanceId);
+ } else {
+ return null;
+ }
+ } else {
+ ObjectMapper objectMapper = formEngineConfiguration.getObjectMapper();
+ ObjectNode submittedFormValuesJson = objectMapper.createObjectNode();
+
+ ObjectNode valuesNode = submittedFormValuesJson.putObject("values");
+ variableLocal.forEach((k, variableValue) -> {
+ if (variableValue == null) {
+ valuesNode.putNull(k);
+ } else if (variableValue instanceof Long) {
+ valuesNode.put(k, (Long) variableValue);
+
+ } else if (variableValue instanceof Double) {
+ valuesNode.put(k, (Double) variableValue);
+
+ } else if (variableValue instanceof Boolean) {
+ valuesNode.put(k, (Boolean) variableValue);
+
+ } else if (variableValue instanceof LocalDate) {
+ valuesNode.put(k, ((LocalDate) variableValue).toString());
+
+ } else {
+ valuesNode.put(k, variableValue.toString());
+ }
+ });
+ try {
+ return objectMapper.writeValueAsBytes(submittedFormValuesJson);
+ } catch (JsonProcessingException e) {
+ if (throwException) {
+ throw new WorkflowEngineException(FORM_INSTANCE_DATA_NOT_FOUND, processInstanceId);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ }
+}
diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceModelCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceModelCmd.java
index 07c1de73f..e8765638b 100644
--- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceModelCmd.java
+++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormInstanceModelCmd.java
@@ -1,19 +1,58 @@
package cn.axzo.workflow.core.engine.cmd;
+import cn.axzo.workflow.common.exception.WorkflowEngineException;
+import cn.axzo.workflow.common.model.dto.AmountFieldDTO;
+import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
+import cn.axzo.workflow.core.engine.cmd.helper.FormFieldClone;
+import cn.axzo.workflow.form.engine.model.CustomSimpleFormModel;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.flowable.common.engine.api.FlowableException;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.common.engine.impl.el.VariableContainerWrapper;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.form.api.FormInstance;
+import org.flowable.form.api.FormInstanceInfo;
import org.flowable.form.api.FormInstanceQuery;
import org.flowable.form.engine.FormEngineConfiguration;
import org.flowable.form.engine.impl.cmd.GetFormInstanceModelCmd;
import org.flowable.form.engine.impl.util.CommandContextUtil;
+import org.flowable.form.model.ExpressionFormField;
+import org.flowable.form.model.FormContainer;
+import org.flowable.form.model.FormField;
+import org.flowable.form.model.FormFieldTypes;
+import org.flowable.form.model.Option;
+import org.flowable.form.model.OptionFormField;
+import org.flowable.form.model.SimpleFormModel;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_DATA_PARSE_ERROR_BY_CUSTOM_COMPONENT;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_CHANGE_SIGNATURE_ORDER;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_CUSTOM_COMPONENT;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_IMAGE;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_INPUT;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_RECTIFY_ORDER;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_TASK_ORDER;
+import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_TEXTAREA;
+import static cn.axzo.workflow.form.engine.cmd.CustomGetVariablesFromFormSubmissionCmd.fmtConvert;
+import static cn.axzo.workflow.form.engine.cmd.CustomGetVariablesFromFormSubmissionCmd.parseToLocalDateTime;
+
/**
* 自定义的获取表单模型和最新表单内容的命令实现
*
@@ -78,4 +117,303 @@ public class CustomGetFormInstanceModelCmd extends GetFormInstanceModelCmd {
log.info("未查询到流程实例关联的表单实例数据");
return null;
}
+
+ @Override
+ public void fillVariablesWithFormValues(Map submittedFormFieldMap, List allFields) {
+ for (FormField field : allFields) {
+
+ JsonNode fieldValueNode = submittedFormFieldMap.get(field.getId());
+
+ if (fieldValueNode == null || fieldValueNode.isNull()) {
+ continue;
+ }
+
+ String fieldType = field.getType();
+ String fieldValue = fieldValueNode.asText();
+
+ if (FormFieldTypes.DATE.equals(fieldType)) {
+ try {
+ if (org.apache.commons.lang3.StringUtils.isNotEmpty(fieldValue)) {
+ LocalDateTime dateValue = parseToLocalDateTime(fieldValue, fmtConvert(field.getParam("fmt").toString()));
+ if (Objects.nonNull(dateValue)) {
+ variables.put(field.getId(), dateValue.format(DateTimeFormatter.ofPattern(fmtConvert(field.getParam("fmt").toString()))));
+ } else {
+ variables.put(field.getId(), fieldValue);
+ }
+ }
+ } catch (Exception e) {
+ log.error("Error parsing form date value for process instance {} and task {} with value {}", processInstanceId, taskId, fieldValue, e);
+ }
+// } else if (FormFieldTypes.UPLOAD.equals(fieldType) || FormConstants.FORM_FIELD_TYPE_IMAGE.equals(fieldType)) {
+// FormEngineConfiguration formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration();
+// ObjectMapper objectMapper = formEngineConfiguration.getObjectMapper();
+// try {
+// List uploadFiles = objectMapper.readValue(fieldValue, new TypeReference>() {
+// });
+// variables.put(field.getId(), uploadFiles);
+// } catch (JsonProcessingException e) {
+// throw new WorkflowEngineException(FORM_DATA_PARSE_ERROR_BY_UPLOAD);
+// }
+ } else if (fieldValueNode.isBoolean()) {
+ variables.put(field.getId(), fieldValueNode.asBoolean());
+
+ } else if (fieldValueNode.isLong()) {
+ variables.put(field.getId(), fieldValueNode.asLong());
+
+ } else if (fieldValueNode.isDouble()) {
+ variables.put(field.getId(), fieldValueNode.asDouble());
+
+ } else {
+ variables.put(field.getId(), fieldValue);
+ }
+ }
+ }
+
+ @Override
+ protected void fillFormInstanceValues(FormInstanceInfo formInstanceModel, FormInstance formInstance, Map formInstanceFieldMap, ObjectMapper objectMapper) {
+ try {
+ JsonNode submittedNode = objectMapper.readTree(formInstance.getFormValueBytes());
+ if (submittedNode == null) {
+ return;
+ }
+
+ if (submittedNode.get("values") != null) {
+ JsonNode valuesNode = submittedNode.get("values");
+ Iterator fieldIdIterator = valuesNode.fieldNames();
+ while (fieldIdIterator.hasNext()) {
+ String fieldId = fieldIdIterator.next();
+ JsonNode valueNode = valuesNode.get(fieldId);
+ formInstanceFieldMap.put(fieldId, valueNode);
+ }
+ }
+
+ if (submittedNode.get("flowable_form_outcome") != null) {
+ JsonNode outcomeNode = submittedNode.get("flowable_form_outcome");
+ if (!outcomeNode.isNull() && org.apache.commons.lang3.StringUtils.isNotEmpty(outcomeNode.asText())) {
+ formInstanceModel.setSelectedOutcome(outcomeNode.asText());
+ }
+ }
+
+ } catch (Exception e) {
+ throw new FlowableException("Error parsing form instance " + formInstance.getId(), e);
+ }
+ }
+
+ @Override
+ protected void fillFormFieldValues(FormInstance formInstance, FormInstanceInfo formInstanceModel, CommandContext commandContext) {
+ FormEngineConfiguration formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration();
+ CustomSimpleFormModel formModel = new CustomSimpleFormModel((SimpleFormModel) formInstanceModel.getFormModel());
+ List allFields = formModel.listAllFields();
+ if (allFields != null) {
+
+ Map formInstanceFieldMap = new HashMap<>();
+ if (formInstance != null) {
+ fillFormInstanceValues(formInstanceModel, formInstance, formInstanceFieldMap, formEngineConfiguration.getObjectMapper());
+ fillVariablesWithFormValues(formInstanceFieldMap, allFields);
+ }
+
+ for (FormField field : allFields) {
+ if (field instanceof OptionFormField) {
+ OptionFormField optionFormField = (OptionFormField) field;
+ if (optionFormField.getOptionsExpression() != null) {
+ // Drop down options to be populated from an expression
+ Expression optionsExpression = formEngineConfiguration.getExpressionManager().createExpression(optionFormField.getOptionsExpression());
+ Object value = null;
+ try {
+ value = optionsExpression.getValue(new VariableContainerWrapper(variables));
+ } catch (Exception e) {
+ throw new FlowableException("Error getting value for optionsExpression: " + optionFormField.getOptionsExpression(), e);
+ }
+ if (value instanceof List) {
+ @SuppressWarnings("unchecked")
+ List