Merge remote-tracking branch 'origin/feature/REQ-4418_Enum' into release-20251022

# Conflicts:
#	workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/PrintFieldCategoryEnum.java
This commit is contained in:
wangli 2025-10-22 11:09:15 +08:00
commit 05a9657222
49 changed files with 1246 additions and 638 deletions

View File

@ -0,0 +1,50 @@
package cn.axzo.workflow.client.feign.manage;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.enums.AdminDataSource;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
* 一些功能性 API
*
* @author wangli
* @since 2025-09-02 14:40
*/
@WorkflowEngineFeignClient
public interface FunctionApi {
@Operation(summary = "获取指定枚举类型的枚举值信息")
@GetMapping("/api/function/enum/admin-data-source/get")
@Manageable
@InvokeMode(SYNC)
CommonResponse<AdminDataSource> getAdminDataSourceEnum(@RequestParam String enumValue);
@Operation(summary = "获取指定枚举类型的枚举值信息")
@GetMapping("/api/function/enum/process-instance-result/get")
@Manageable
@InvokeMode(SYNC)
CommonResponse<BpmnProcessInstanceResultEnum> getFileTypeEnum(@RequestParam String enumValue);
/**
* 用于 Starter 检测必接事件的告警
*
* @param dto
* @return
*/
@Operation(summary = "发送钉钉消息")
@PostMapping("/api/function/dingtalk/alter")
@InvokeMode(SYNC)
CommonResponse<Boolean> sendDingtalk(@Validated @RequestBody DingTalkStarterAlterDTO dto);
}

View File

@ -1,11 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
public enum AdminDataSource { public enum AdminDataSource {
SYSTEM_ENTRY("systemEntry", "系统录入"), SYSTEM_ENTRY("systemEntry", "系统录入"),
USER_ENTRY("userEntry", "用户手动录入"); USER_ENTRY("userEntry", "用户手动录入"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知"),
;
private final String type; private final String type;
private final String desc; private final String desc;
@ -14,4 +21,15 @@ public enum AdminDataSource {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static AdminDataSource fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(AdminDataSource.values())
.filter(v -> v.getType().equalsIgnoreCase(value) || v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,13 +1,19 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
public enum AdminRoleType { public enum AdminRoleType {
ORGANIZATION_ADMIN("organizationAdmin", "单位超管"), ORGANIZATION_ADMIN("organizationAdmin", "单位超管"),
ORG_WORKSPACE_ADMIN("organizationWorkspaceAdmin", "项目内单位负责人"), ORG_WORKSPACE_ADMIN("organizationWorkspaceAdmin", "项目内单位负责人"),
WORKSPACE_ADMIN("workspaceAdmin", "项目超管"), WORKSPACE_ADMIN("workspaceAdmin", "项目超管"),
OTHER("other", "其他用户"); OTHER("other", "其他用户"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知");
private final String type; private final String type;
private final String desc; private final String desc;
@ -16,4 +22,15 @@ public enum AdminRoleType {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static AdminRoleType fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(AdminRoleType.values())
.filter(v -> v.getType().equalsIgnoreCase(value) || v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,14 +1,21 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
/** /**
* 审批管理员类型 * 审批管理员类型
*/ */
@Getter @Getter
public enum AdminTypeEnum { public enum AdminTypeEnum {
SUPER_ADMIN("super_admin", "超级管理员"), SUPER_ADMIN("super_admin", "超级管理员"),
COMMON_ADMIN("common_admin", "普通管理员"); COMMON_ADMIN("common_admin", "普通管理员"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知"),
;
private final String type; private final String type;
private final String desc; private final String desc;
@ -17,4 +24,15 @@ public enum AdminTypeEnum {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static AdminTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(AdminTypeEnum.values())
.filter(v -> v.getType().equalsIgnoreCase(value) || v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 审批方式枚举 * 审批方式枚举
@ -9,6 +12,7 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2023/11/16 10:10 * @since 2023/11/16 10:10
*/ */
@Getter
public enum ApprovalMethodEnum { public enum ApprovalMethodEnum {
human("human", "人工审批", ""), human("human", "人工审批", ""),
@ -19,12 +23,12 @@ public enum ApprovalMethodEnum {
nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"), nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"),
bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"), bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"),
transferToAdmin("transferToAdmin", "转办给管理员", "该枚举仅日志处理使用"), transferToAdmin("transferToAdmin", "转办给管理员", "该枚举仅日志处理使用"),
unknown("unknown", "未知", "兜底") @JsonEnumDefaultValue
; unknown("unknown", "未知", "兜底");
private String type; private final String type;
private String desc; private final String desc;
private String remark; private final String remark;
ApprovalMethodEnum(String type, String desc, String remark) { ApprovalMethodEnum(String type, String desc, String remark) {
this.type = type; this.type = type;
@ -32,34 +36,18 @@ public enum ApprovalMethodEnum {
this.remark = remark; this.remark = remark;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApprovalMethodEnum fromValue(String value) {
} if (value == null) {
return unknown;
public void setType(String type) { }
this.type = type; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public String getDesc() { .orElse(unknown);
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} }
public static ApprovalMethodEnum valueOfType(String type) { public static ApprovalMethodEnum valueOfType(String type) {
return Arrays.stream(ApprovalMethodEnum.values()) return fromValue(type);
.filter(i -> Objects.equals(i.getType(), type))
.findAny()
.orElse(null);
} }
} }

View File

@ -1,17 +1,26 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 审批人为空时的处理方式枚举 * 审批人为空时的处理方式枚举
* *
* @author wangli * @author wangli
* @since 2023/11/16 10:22 * @since 2023/11/16 10:22
*/ */
@Getter
public enum ApproverEmptyHandleTypeEnum { public enum ApproverEmptyHandleTypeEnum {
autoPassed("autoPassed", "自动通过"), autoPassed("autoPassed", "自动通过"),
autoRejection("autoRejection", "自动驳回"), autoRejection("autoRejection", "自动驳回"),
autoSkipped("autoSkipped", "自动跳过"), autoSkipped("autoSkipped", "自动跳过"),
transferToAdmin("transferToAdmin", "转交给管理员"), transferToAdmin("transferToAdmin", "转交给管理员"),
specifyAssignee("specifyAssignee", "指定审批人"), specifyAssignee("specifyAssignee", "指定审批人"),
@JsonEnumDefaultValue
unknown("unknown", "未知"),
; ;
private String type; private String type;
private String desc; private String desc;
@ -21,19 +30,15 @@ public enum ApproverEmptyHandleTypeEnum {
this.desc = desc; this.desc = desc;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApproverEmptyHandleTypeEnum fromValue(String value) {
if (value == null) {
return unknown;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(unknown);
} }
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
} }

View File

@ -1,5 +1,9 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
@ -9,12 +13,15 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2023/11/16 10:14 * @since 2023/11/16 10:14
*/ */
@Getter
public enum ApproverScopeEnum { public enum ApproverScopeEnum {
entWorkspace("entWorkspace", "企业工作台", "entWorkspaceProcessor"), entWorkspace("entWorkspace", "企业工作台", "entWorkspaceProcessor"),
govWorkspace("govWorkspace", "政务工作台", "govWorkspaceProcessor"), govWorkspace("govWorkspace", "政务工作台", "govWorkspaceProcessor"),
projectWorkspace("projectWorkspace", "项目工作台","projectWorkspaceProcessor"), projectWorkspace("projectWorkspace", "项目工作台", "projectWorkspaceProcessor"),
preTaskUser("preTaskUser", "上节点审批人所在单位","preTaskUserProcessor"), preTaskUser("preTaskUser", "上节点审批人所在单位", "preTaskUserProcessor"),
preTaskSpecified("preTaskSpecified", "上节点审批人指定","preTaskUserProcessor"), preTaskSpecified("preTaskSpecified", "上节点审批人指定", "preTaskUserProcessor"),
@JsonEnumDefaultValue
unknown("unknown", "未知", "unknownProcessor"),
; ;
private final String type; private final String type;
private final String desc; private final String desc;
@ -26,20 +33,15 @@ public enum ApproverScopeEnum {
this.processor = processor; this.processor = processor;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApprovalMethodEnum fromValue(String value) {
} if (value == null) {
return ApprovalMethodEnum.unknown;
public String getDesc() { }
return desc; return Arrays.stream(ApprovalMethodEnum.values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public String getProcessor() { .orElse(ApprovalMethodEnum.unknown);
return processor;
}
public boolean selectWorkspace() {
return this == ApproverScopeEnum.projectWorkspace;
} }
public static ApproverScopeEnum valueOfProcessor(String processor) { public static ApproverScopeEnum valueOfProcessor(String processor) {

View File

@ -1,11 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 审批人指定枚举 * 审批人指定枚举
* *
* @author wangli * @author wangli
* @since 2023/11/16 10:16 * @since 2023/11/16 10:16
*/ */
@Getter
public enum ApproverSpecifyEnum { public enum ApproverSpecifyEnum {
position("position", "指定岗位", 1), position("position", "指定岗位", 1),
@ -28,11 +35,13 @@ public enum ApproverSpecifyEnum {
initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2), initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
fixedPerson_v2("fixedPerson_v2", "固定人员", 2), fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
preAllNodeApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2), preAllNodeApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
@JsonEnumDefaultValue
unknown("unknown", "未知", 1),
; ;
private String type; private final String type;
private String desc; private final String desc;
private Integer version; private final Integer version;
ApproverSpecifyEnum(String type, String desc, Integer version) { ApproverSpecifyEnum(String type, String desc, Integer version) {
this.type = type; this.type = type;
@ -40,27 +49,14 @@ public enum ApproverSpecifyEnum {
this.version = version; this.version = version;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApproverSpecifyEnum fromValue(String value) {
} if (value == null) {
return unknown;
public void setType(String type) { }
this.type = type; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public String getDesc() { .orElse(unknown);
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
} }
} }

View File

@ -1,11 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 审批人指定的二次范围限定枚举 * 审批人指定的二次范围限定枚举
* *
* @author wangli * @author wangli
* @since 2025-08-13 14:32 * @since 2025-08-13 14:32
*/ */
@Getter
public enum ApproverSpecifyRangeEnum { public enum ApproverSpecifyRangeEnum {
within_the_project("within_the_project", "项目内岗位"), within_the_project("within_the_project", "项目内岗位"),
@ -13,29 +20,26 @@ public enum ApproverSpecifyRangeEnum {
specified_org("specified_org", "审批单指定的末级组织"), specified_org("specified_org", "审批单指定的末级组织"),
initiator("initiator", "审批单发起人"), initiator("initiator", "审批单发起人"),
pre_node_approver("pre_node_approver", "上节点审批人"), pre_node_approver("pre_node_approver", "上节点审批人"),
@JsonEnumDefaultValue
unknown("unknown", "未知"),
; ;
private String type; private final String type;
private String desc; private final String desc;
ApproverSpecifyRangeEnum(String type, String desc) { ApproverSpecifyRangeEnum(String type, String desc) {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApproverSpecifyRangeEnum fromValue(String value) {
} if (value == null) {
return unknown;
public void setType(String type) { }
this.type = type; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public String getDesc() { .orElse(unknown);
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
} }
} }

View File

@ -1,11 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 审批人指定的范围单位枚举 * 审批人指定的范围单位枚举
* *
* @author wangli * @author wangli
* @since 2025-08-13 15:05 * @since 2025-08-13 15:05
*/ */
@Getter
public enum ApproverSpecifyRangeUnitEnum { public enum ApproverSpecifyRangeUnitEnum {
in_project("in_project", "项目内", null), in_project("in_project", "项目内", null),
in_ent("in_ent", "企业内", null), in_ent("in_ent", "企业内", null),
@ -14,8 +21,8 @@ public enum ApproverSpecifyRangeUnitEnum {
in_group_lv_3("in_group_lv_3", "集团岗位,上三级", 3), in_group_lv_3("in_group_lv_3", "集团岗位,上三级", 3),
in_group_lv_4("in_group_lv_4", "集团岗位,上四级", 4), in_group_lv_4("in_group_lv_4", "集团岗位,上四级", 4),
in_group_lv_top("in_group_lv_top", "集团岗位,总公司", Integer.MAX_VALUE), in_group_lv_top("in_group_lv_top", "集团岗位,总公司", Integer.MAX_VALUE),
UNKNOWN("UNKNOWN", "未知范围", null) @JsonEnumDefaultValue
; UNKNOWN("UNKNOWN", "未知范围", null);
private final String type; private final String type;
private final String desc; private final String desc;
private final Integer value; private final Integer value;
@ -26,15 +33,14 @@ public enum ApproverSpecifyRangeUnitEnum {
this.value = value; this.value = value;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static ApproverSpecifyRangeUnitEnum fromValue(String value) {
} if (value == null) {
return UNKNOWN;
public String getDesc() { }
return desc; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public Integer getValue() { .orElse(UNKNOWN);
return value;
} }
} }

View File

@ -1,39 +1,43 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 附件类型枚举 * 附件类型枚举
* *
* @author wangli * @author wangli
* @since 2023/11/22 23:19 * @since 2023/11/22 23:19
*/ */
@Getter
public enum AttachmentTypeEnum { public enum AttachmentTypeEnum {
image("image", "图片"), image("image", "图片"),
file("file", "文件"), file("file", "文件"),
signature("signature", "签名"), signature("signature", "签名"),
@JsonEnumDefaultValue
unknown("unknown", "未知"),
; ;
private String type; private final String type;
private String desc; private final String desc;
AttachmentTypeEnum(String type, String desc) { AttachmentTypeEnum(String type, String desc) {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static AttachmentTypeEnum fromValue(String value) {
} if (value == null) {
return unknown;
public void setType(String type) { }
this.type = type; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public String getDesc() { .orElse(unknown);
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
} }
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import org.springframework.util.StringUtils;
import java.util.Arrays;
/** /**
* 自动过审参数 * 自动过审参数
@ -11,7 +14,10 @@ import org.springframework.util.StringUtils;
public enum AutoApprovalTypeEnum { public enum AutoApprovalTypeEnum {
NO_AUTO_APPROVAL("noAutoApproval", "不自动过审"), NO_AUTO_APPROVAL("noAutoApproval", "不自动过审"),
CONTINUOUS_NODES_AUTO_APPROVAL("continuousNodesAutoApproval", "连续节点自动过审"); CONTINUOUS_NODES_AUTO_APPROVAL("continuousNodesAutoApproval", "连续节点自动过审"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知"),
;
private final String type; private final String type;
private final String desc; private final String desc;
@ -22,14 +28,17 @@ public enum AutoApprovalTypeEnum {
} }
public static AutoApprovalTypeEnum fromType(String type) { public static AutoApprovalTypeEnum fromType(String type) {
if (!StringUtils.hasText(type)) { return fromValue(type);
return null; }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static AutoApprovalTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
} }
for (AutoApprovalTypeEnum typeEnum : AutoApprovalTypeEnum.values()) { return Arrays.stream(values())
if (typeEnum.type.equals(type)) { .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
return typeEnum; .findFirst()
} .orElse(UNKNOWN);
}
return null;
} }
} }

View File

@ -1,8 +1,12 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.Getter;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static cn.axzo.workflow.common.enums.BusinessTypeEnum.APPROVAL; import static cn.axzo.workflow.common.enums.BusinessTypeEnum.APPROVAL;
@ -14,6 +18,7 @@ import static cn.axzo.workflow.common.enums.BusinessTypeEnum.SIGN;
* @author wangli * @author wangli
* @since 2023/9/4 10:38 * @since 2023/9/4 10:38
*/ */
@Getter
public enum BpmnButtonEnum { public enum BpmnButtonEnum {
/** /**
* 同意按钮 * 同意按钮
@ -66,24 +71,13 @@ public enum BpmnButtonEnum {
/** /**
* 管理员转交按钮 * 管理员转交按钮
*/ */
BPMN_ADMIN_TRANSFER(90, "BPMN_ADMIN_TRANSFER", "管理员转交", Lists.newArrayList()); BPMN_ADMIN_TRANSFER(90, "BPMN_ADMIN_TRANSFER", "管理员转交", Lists.newArrayList()),
/**
* 兜底
public int getOrder() { */
return order; @JsonEnumDefaultValue
} UNKNOWN(99, "UNKNOWN", "未知", Lists.newArrayList()),
;
public String getBtnKey() {
return btnKey;
}
public String getBtnName() {
return btnName;
}
public List<BusinessTypeEnum> getSupportBizType() {
return supportBizType;
}
private final int order; private final int order;
private final String btnKey; private final String btnKey;
@ -98,4 +92,15 @@ public enum BpmnButtonEnum {
this.supportBizType = supportBizType; this.supportBizType = supportBizType;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnButtonEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getBtnKey().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,12 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
/** /**
* 加签类型 * 加签类型
* *
* @author zuoqinbo * @author zuoqinbo
*/ */
@Getter
public enum BpmnCountersignTypeEnum { public enum BpmnCountersignTypeEnum {
/** /**
* 向前加签 * 向前加签
@ -20,6 +26,11 @@ public enum BpmnCountersignTypeEnum {
* 共享加签 * 共享加签
*/ */
SHARE_COUNTERSIGN("SHARE_COUNTERSIGN", "共享加签"), SHARE_COUNTERSIGN("SHARE_COUNTERSIGN", "共享加签"),
/**
* 兜底
*/
@JsonEnumDefaultValue
UNKNOW("UNKNOW", "未知"),
; ;
private final String type; private final String type;
@ -30,14 +41,6 @@ public enum BpmnCountersignTypeEnum {
this.desc = desc; this.desc = desc;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public static BpmnCountersignTypeEnum valueOfType(String countersignType) { public static BpmnCountersignTypeEnum valueOfType(String countersignType) {
if (StringUtils.isBlank(countersignType)) { if (StringUtils.isBlank(countersignType)) {
return null; return null;
@ -50,4 +53,15 @@ public enum BpmnCountersignTypeEnum {
} }
return null; return null;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnCountersignTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOW;
}
return Arrays.stream(values())
.filter(v -> v.getType().equalsIgnoreCase(value) || v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOW);
}
} }

View File

@ -1,48 +1,42 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import java.util.Arrays; import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.Objects; import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
@Getter
public enum BpmnFlowNodeMode { public enum BpmnFlowNodeMode {
GENERAL("GENERAL", "普通节点"), GENERAL("GENERAL", "普通节点"),
OR("OR", "或签节点"), OR("OR", "或签节点"),
AND("AND", "会签节点"), AND("AND", "会签节点"),
EXCEPTIONAL("EXCEPTIONAL", "异常"), EXCEPTIONAL("EXCEPTIONAL", "异常"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
; ;
private String type; private final String type;
private String desc; private final String desc;
BpmnFlowNodeMode(String type, String desc) { BpmnFlowNodeMode(String type, String desc) {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
public boolean isEqual(String type) {
return this.type.equals(type);
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static BpmnFlowNodeMode valueOfType(String type) { public static BpmnFlowNodeMode valueOfType(String type) {
return fromValue(type);
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnFlowNodeMode fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(BpmnFlowNodeMode.values()) return Arrays.stream(BpmnFlowNodeMode.values())
.filter(i -> Objects.equals(i.getType(), type)) .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findAny() .findFirst()
.orElse(null); .orElse(UNKNOWN);
} }
} }

View File

@ -1,11 +1,14 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
@Getter
public enum BpmnFlowNodeType { public enum BpmnFlowNodeType {
//0 发起人 1审批 2抄送 3条件 4路由 //0 发起人 1审批 2抄送 3条件 4路由
@ -25,53 +28,33 @@ public enum BpmnFlowNodeType {
NODE_ALTER("NODE_ALTER", "告警节点"), NODE_ALTER("NODE_ALTER", "告警节点"),
NODE_CANCEL("NODE_CANCEL", "撤回节点"), NODE_CANCEL("NODE_CANCEL", "撤回节点"),
NODE_EMPTY("NODE_EMPTY", "空节点"), NODE_EMPTY("NODE_EMPTY", "空节点"),
; @JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知");
private String type; private final String type;
private String desc; private final String desc;
BpmnFlowNodeType(String type, String desc) { BpmnFlowNodeType(String type, String desc) {
this.type = type; this.type = type;
this.desc = desc; this.desc = desc;
} }
public boolean isEqual(String type) {
return this.type.equals(type);
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static BpmnFlowNodeType getByType(String type) { public static BpmnFlowNodeType getByType(String type) {
if (!StringUtils.hasText(type)) { return fromValue(type);
return null;
}
BpmnFlowNodeType[] values = BpmnFlowNodeType.values();
for (BpmnFlowNodeType value : values) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
} }
public static BpmnFlowNodeType valueOfType(String type) { public static BpmnFlowNodeType valueOfType(String type) {
return fromValue(type);
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnFlowNodeType fromValue(String value) {
if (!StringUtils.hasText(value)) {
return UNKNOWN;
}
return Arrays.stream(BpmnFlowNodeType.values()) return Arrays.stream(BpmnFlowNodeType.values())
.filter(i -> Objects.equals(i.getType(), type)) .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findAny() .findFirst()
.orElse(null); .orElse(UNKNOWN);
} }
} }

View File

@ -1,5 +1,11 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_CONFIG; import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MESSAGE_CONFIG;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID; import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID; import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
@ -10,11 +16,14 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAG
* @author wangli * @author wangli
* @since 2023/11/22 11:02 * @since 2023/11/22 11:02
*/ */
@Getter
public enum BpmnNoticeEnum { public enum BpmnNoticeEnum {
notice("notice", TEMPLATE_NOTICE_MESSAGE_CONFIG, "通知模板"), notice("notice", TEMPLATE_NOTICE_MESSAGE_CONFIG, "通知模板"),
pending("pending", TEMPLATE_PENDING_MESSAGE_ID, "待办模板"), pending("pending", TEMPLATE_PENDING_MESSAGE_ID, "待办模板"),
sms("sms", TEMPLATE_SMS_MESSAGE_ID, "短信模板"), sms("sms", TEMPLATE_SMS_MESSAGE_ID, "短信模板"),
@JsonEnumDefaultValue
unknown("unknown", "unknown", "未知类型"),
; ;
private final String key; private final String key;
private final String configName; private final String configName;
@ -26,15 +35,14 @@ public enum BpmnNoticeEnum {
this.desc = desc; this.desc = desc;
} }
public String getKey() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return key; public static BpmnNoticeEnum fromValue(String key) {
} if (key == null) {
return unknown;
public String getConfigName() { }
return configName; return Arrays.stream(values())
} .filter(e -> e.getKey().equalsIgnoreCase(key) || e.name().equalsIgnoreCase(key))
.findFirst()
public String getDesc() { .orElse(unknown);
return desc;
} }
} }

View File

@ -1,7 +1,12 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
@Getter
public enum BpmnProcessInstanceResultEnum { public enum BpmnProcessInstanceResultEnum {
PROCESSING("PROCESSING", "审批中"), PROCESSING("PROCESSING", "审批中"),
APPROVED("APPROVED", "已通过"), APPROVED("APPROVED", "已通过"),
@ -14,6 +19,8 @@ public enum BpmnProcessInstanceResultEnum {
UPGRADED("UPGRADED", "已提级"), UPGRADED("UPGRADED", "已提级"),
COMMENTED("COMMENTED", "已评论"), COMMENTED("COMMENTED", "已评论"),
DELETED("DELETED", "已删除"), DELETED("DELETED", "已删除"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
; ;
/** /**
* 结果 * 结果
@ -29,25 +36,8 @@ public enum BpmnProcessInstanceResultEnum {
this.desc = desc; this.desc = desc;
} }
public String getStatus() { public static BpmnProcessInstanceResultEnum valueOfDesc(String desc) {
return status; return Arrays.stream(values()).filter(it -> it.getDesc().equals(desc)).findFirst().orElse(DELETED);
}
public String getDesc() {
return desc;
}
/**
* 判断该结果是否已经处于 End 最终结果
* <p>
* 主要用于一些结果更新的逻辑如果已经是最终结果就不再进行更新
*
* @param result 结果
* @return 是否
*/
public static boolean isEndResult(String result) {
return Arrays.asList(PROCESSING.getStatus(), APPROVED.getStatus(), REJECTED.getStatus(),
CANCELLED.getStatus()).contains(result);
} }
public static BpmnProcessInstanceResultEnum valueOfStatus(String status) { public static BpmnProcessInstanceResultEnum valueOfStatus(String status) {
@ -55,8 +45,15 @@ public enum BpmnProcessInstanceResultEnum {
.orElse(DELETED); .orElse(DELETED);
} }
public static BpmnProcessInstanceResultEnum valueOfDesc(String desc) { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return Arrays.stream(values()).filter(it -> it.getDesc().equals(desc)).findFirst() public static BpmnProcessInstanceResultEnum fromValue(String value) {
.orElse(DELETED); if (value == null) {
return UNKNOWN;
}
return Arrays.stream(BpmnProcessInstanceResultEnum.values())
.filter(e -> e.getStatus().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
} }
} }

View File

@ -1,7 +1,11 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
public enum BpmnProcessTaskResultEnum { public enum BpmnProcessTaskResultEnum {
PENDING("PENDING", "待处理"), PENDING("PENDING", "待处理"),
@ -11,6 +15,8 @@ public enum BpmnProcessTaskResultEnum {
CANCELED("CANCELED", "已撤销"), CANCELED("CANCELED", "已撤销"),
TRANSFERRED("TRANSFERRED", "已转交"), TRANSFERRED("TRANSFERRED", "已转交"),
NONE("NONE", "没有执行动作,例如 抄送"), NONE("NONE", "没有执行动作,例如 抄送"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
; ;
/** /**
* 结果 * 结果
@ -26,4 +32,14 @@ public enum BpmnProcessTaskResultEnum {
this.desc = desc; this.desc = desc;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnProcessTaskResultEnum fromValue(String status) {
if (status == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getStatus().equalsIgnoreCase(status) || e.name().equalsIgnoreCase(status))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,10 +1,17 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 加签类型 * 加签类型
* *
* @author zuoqinbo * @author zuoqinbo
*/ */
@Getter
public enum BpmnReminderType { public enum BpmnReminderType {
/** /**
* 短信 * 短信
@ -13,7 +20,10 @@ public enum BpmnReminderType {
/** /**
* 站内信 * 站内信
*/ */
INBOX_MESSAGE("INBOX_MESSAGE", "站内信"); INBOX_MESSAGE("INBOX_MESSAGE", "站内信"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
;
private String type; private String type;
private String desc; private String desc;
@ -23,24 +33,15 @@ public enum BpmnReminderType {
this.desc = desc; this.desc = desc;
} }
public boolean isEqual(String type) { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return this.type.equals(type); public static BpmnReminderType fromValue(String value) {
} if (value == null) {
return UNKNOWN;
public String getType() { }
return type; return Arrays.stream(values())
} .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
public void setType(String type) { .orElse(UNKNOWN);
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
} }
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 签署方式 * 签署方式
@ -9,10 +12,13 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2025-03-25 17:00 * @since 2025-03-25 17:00
*/ */
@Getter
public enum BpmnSignType { public enum BpmnSignType {
SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"), SINGLE("SINGLE", "指定人群,所有人共同签署一份文件"),
MULTI("MULTI", "指定人群,每人签署一份文件"), MULTI("MULTI", "指定人群,每人签署一份文件"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
; ;
private final String type; private final String type;
@ -23,20 +29,19 @@ public enum BpmnSignType {
this.desc = desc; this.desc = desc;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public static BpmnSignType valueOfType(String type) { public static BpmnSignType valueOfType(String type) {
return fromValue(type);
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BpmnSignType fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(BpmnSignType.values()) return Arrays.stream(BpmnSignType.values())
.filter(i -> Objects.equals(i.getType(), type)) .filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findAny() .findFirst()
.orElse(null); .orElse(UNKNOWN);
} }
} }

View File

@ -1,18 +1,35 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import lombok.AllArgsConstructor; import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
@AllArgsConstructor import java.util.Arrays;
@NoArgsConstructor
@Getter @Getter
public enum BusinessTypeEnum { public enum BusinessTypeEnum {
SIGN("sign", "签署业务"), SIGN("sign", "签署业务"),
APPROVAL("approval", "审批业务"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知");
APPROVAL("approval", "审批业务"); private final String type;
private final String desc;
private String type; BusinessTypeEnum(String type, String desc) {
private String desc; this.type = type;
this.desc = desc;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static BusinessTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(v -> v.getType().equalsIgnoreCase(value) || v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,14 +1,18 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
public enum ButtonVisibleScopeEnum { public enum ButtonVisibleScopeEnum {
INITIATOR("INITIATOR", "发起人"), INITIATOR("INITIATOR", "发起人"),
EXECUTOR("EXECUTOR", "当前操作人"), EXECUTOR("EXECUTOR", "当前操作人"),
; @JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知");
/** /**
* 结果 * 结果
@ -23,4 +27,15 @@ public enum ButtonVisibleScopeEnum {
this.status = status; this.status = status;
this.desc = desc; this.desc = desc;
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static ButtonVisibleScopeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getStatus().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 抄送对象类型枚举 * 抄送对象类型枚举
@ -9,6 +12,7 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 12/03/2024 09:33 * @since 12/03/2024 09:33
*/ */
@Getter
public enum CarbonCopyObjectType { public enum CarbonCopyObjectType {
// 单位下 // 单位下
ent_role("ent_role", "role", "单位内指定角色", "entWorkspaceProcessor"), ent_role("ent_role", "role", "单位内指定角色", "entWorkspaceProcessor"),
@ -33,12 +37,14 @@ public enum CarbonCopyObjectType {
approver("approver", "approver", "审批人", "common"), approver("approver", "approver", "审批人", "common"),
ent_initiator_leader("ent_initiator_leader", "initiatorLeader", "单位内发起人主管", "entWorkspaceProcessor"), ent_initiator_leader("ent_initiator_leader", "initiatorLeader", "单位内发起人主管", "entWorkspaceProcessor"),
project_initiator_leader("project_initiator_leader", "initiatorLeader", "项目部内发起人主管", "projectWorkspaceProcessor"), project_initiator_leader("project_initiator_leader", "initiatorLeader", "项目部内发起人主管", "projectWorkspaceProcessor"),
;
private String type; @JsonEnumDefaultValue
private String simpleType; unknown("unknown", "unknown", "未知", "unknownProcessor");
private String desc;
private String processor; private final String type;
private final String simpleType;
private final String desc;
private final String processor;
CarbonCopyObjectType(String type, String simpleType, String desc, String processor) { CarbonCopyObjectType(String type, String simpleType, String desc, String processor) {
this.type = type; this.type = type;
@ -47,43 +53,19 @@ public enum CarbonCopyObjectType {
this.processor = processor; this.processor = processor;
} }
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSimpleType() {
return simpleType;
}
public void setSimpleType(String simpleType) {
this.simpleType = simpleType;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getProcessor() {
return processor;
}
public void setProcessor(String processor) {
this.processor = processor;
}
public static CarbonCopyObjectType valueOfType(String type) { public static CarbonCopyObjectType valueOfType(String type) {
return Arrays.stream(CarbonCopyObjectType.values()) return fromValue(type);
.filter(i -> Objects.equals(i.getType(), type)) }
.findAny()
.orElse(null); @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static CarbonCopyObjectType fromValue(String value) {
if (value == null) {
return unknown;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(unknown);
} }
} }

View File

@ -1,5 +1,11 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 参建单位类型枚举 * 参建单位类型枚举
* <p> * <p>
@ -8,6 +14,7 @@ package cn.axzo.workflow.common.enums;
* @author wangli * @author wangli
* @since 2025-08-13 14:51 * @since 2025-08-13 14:51
*/ */
@Getter
public enum CooperateShipTypeEnum { public enum CooperateShipTypeEnum {
PROJ_PRIMARY_CONTRACTING_UNIT(1, "施工总承包"), PROJ_PRIMARY_CONTRACTING_UNIT(1, "施工总承包"),
PROJ_CONSTRUCTION_UNIT(2, "建设单位"), PROJ_CONSTRUCTION_UNIT(2, "建设单位"),
@ -22,7 +29,9 @@ public enum CooperateShipTypeEnum {
PROJ_GROUP(11, "项目内小组"), PROJ_GROUP(11, "项目内小组"),
SURVEY_UNIT(12, "地勘单位"), SURVEY_UNIT(12, "地勘单位"),
DESIGN_UNIT(13, "设计单位"), DESIGN_UNIT(13, "设计单位"),
OTHER(30, "其他"); OTHER(30, "其他"),
@JsonEnumDefaultValue
UNKNOWN(99, "未知");
private final Integer code; private final Integer code;
private final String desc; private final String desc;
@ -32,12 +41,15 @@ public enum CooperateShipTypeEnum {
this.desc = desc; this.desc = desc;
} }
public Integer getCode() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return code; public static CooperateShipTypeEnum fromValue(String value) {
} if (value == null) {
return UNKNOWN;
public String getDesc() { }
return desc; return Arrays.stream(values())
.filter(v -> v.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
} }
} }

View File

@ -1,11 +1,34 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 模型扩展表的状态枚举 * 模型扩展表的状态枚举
* *
* @author wangli * @author wangli
* @since 2025-01-15 09:46 * @since 2025-01-15 09:46
*/ */
@Getter
public enum ExtModelStateFieldEnum { public enum ExtModelStateFieldEnum {
status, printStatus status,
printStatus,
@JsonEnumDefaultValue
unknown,
;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static ExtModelStateFieldEnum fromValue(String value) {
if (value == null) {
return unknown;
}
return Arrays.stream(ExtModelStateFieldEnum.values())
.filter(e -> e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(unknown);
}
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 文档类型枚举 * 文档类型枚举
@ -9,11 +12,14 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2025-03-27 09:55 * @since 2025-03-27 09:55
*/ */
@Getter
public enum FileTypeEnum { public enum FileTypeEnum {
WORD("word", "文本", ".docx"), WORD("word", "文本", ".docx"),
EXCEL("excel", "表格", ".xlsx"), EXCEL("excel", "表格", ".xlsx"),
HIPRINT("hiprint", "智能文档", ""), HIPRINT("hiprint", "智能文档", ""),
PDF("pdf", "PDF", ".pdf"), PDF("pdf", "PDF", ".pdf"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知", ""),
; ;
private final String type; private final String type;
private final String desc; private final String desc;
@ -25,22 +31,19 @@ public enum FileTypeEnum {
this.suffix = suffix; this.suffix = suffix;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public String getSuffix() {
return suffix;
}
public static FileTypeEnum valueOfType(String type) { public static FileTypeEnum valueOfType(String type) {
return Arrays.stream(FileTypeEnum.values()) return fromValue(type);
.filter(i -> Objects.equals(i.getType().toUpperCase(), type.toUpperCase()))
.findAny()
.orElse(null);
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static FileTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(FileTypeEnum.values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,16 +1,25 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 新版配置下的发起人自选的范围限定枚举 * 新版配置下的发起人自选的范围限定枚举
* *
* @author wangli * @author wangli
* @since 2025-08-13 15:13 * @since 2025-08-13 15:13
*/ */
@Getter
public enum InitiatorSpecifiedRangeEnum { public enum InitiatorSpecifiedRangeEnum {
self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"), self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
self_in_project("self_in_project", "项目内本组织所有成员"), self_in_project("self_in_project", "项目内本组织所有成员"),
in_project("in_project", "项目内所有成员"), in_project("in_project", "项目内所有成员"),
in_ent("in_ent", "企业内所有成员"), in_ent("in_ent", "企业内所有成员"),
@JsonEnumDefaultValue
unknown("unknown", "未知"),
; ;
private final String type; private final String type;
private final String desc; private final String desc;
@ -20,11 +29,14 @@ public enum InitiatorSpecifiedRangeEnum {
this.desc = desc; this.desc = desc;
} }
public String getType() { @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
return type; public static InitiatorSpecifiedRangeEnum fromValue(String value) {
} if (value == null) {
return unknown;
public String getDesc() { }
return desc; return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(unknown);
} }
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 模型业务类型枚举 * 模型业务类型枚举
@ -9,10 +12,13 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2025-03-26 11:49 * @since 2025-03-26 11:49
*/ */
@Getter
public enum ModelBizTypeEnum { public enum ModelBizTypeEnum {
SIGN("SIGN", "签署业务"), SIGN("SIGN", "签署业务"),
FLOWABLE("FLOWABLE", "审批业务"), FLOWABLE("FLOWABLE", "审批业务"),
@JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知"),
; ;
private final String type; private final String type;
private final String desc; private final String desc;
@ -22,18 +28,18 @@ public enum ModelBizTypeEnum {
this.desc = desc; this.desc = desc;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public static ModelBizTypeEnum valueOfType(String type) { public static ModelBizTypeEnum valueOfType(String type) {
return Arrays.stream(ModelBizTypeEnum.values()) return fromValue(type);
.filter(i -> Objects.equals(i.getType(), type)) }
.findAny()
.orElse(null); @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static ModelBizTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
} }
} }

View File

@ -1,12 +1,32 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 顺序操作枚举 * 顺序操作枚举
* *
* @author wangli * @author wangli
* @since 2025-03-31 16:35 * @since 2025-03-31 16:35
*/ */
@Getter
public enum OrderEnum { public enum OrderEnum {
UP, DOWN UP, DOWN,
@JsonEnumDefaultValue
UNKNOWN;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static OrderEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* 签署确认节点的审批人层级范围限制 * 签署确认节点的审批人层级范围限制
@ -9,6 +12,7 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2025-03-26 14:30 * @since 2025-03-26 14:30
*/ */
@Getter
public enum SignApproverOrgLimitEnum { public enum SignApproverOrgLimitEnum {
LV_0("LV_0", "当前组织", 0), LV_0("LV_0", "当前组织", 0),
LV_1("LV_1", "上1级组织", 1), LV_1("LV_1", "上1级组织", 1),
@ -18,13 +22,11 @@ public enum SignApproverOrgLimitEnum {
LV_5("LV_5", "上5级组织", 5), LV_5("LV_5", "上5级组织", 5),
LV_ALL("LV_ALL", "所有组织", -1), LV_ALL("LV_ALL", "所有组织", -1),
LV_TOP("LV_TOP", "顶层组织", Integer.MAX_VALUE), LV_TOP("LV_TOP", "顶层组织", Integer.MAX_VALUE),
UNKNOWN("UNKNOWN", "未知层级", null) @JsonEnumDefaultValue
; UNKNOWN("UNKNOWN", "未知层级", null);
private final String type; private final String type;
private final String desc; private final String desc;
private final Integer code; private final Integer code;
SignApproverOrgLimitEnum(String type, String desc, Integer code) { SignApproverOrgLimitEnum(String type, String desc, Integer code) {
@ -33,22 +35,18 @@ public enum SignApproverOrgLimitEnum {
this.code = code; this.code = code;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public Integer getCode() {
return code;
}
public static SignApproverOrgLimitEnum valueOfType(String type) { public static SignApproverOrgLimitEnum valueOfType(String type) {
return Arrays.stream(SignApproverOrgLimitEnum.values()) return fromValue(type);
.filter(i -> Objects.equals(i.getType(), type)) }
.findAny()
.orElse(null); @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static SignApproverOrgLimitEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
} }
} }

View File

@ -1,5 +1,9 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
@ -9,12 +13,13 @@ import java.util.Objects;
* @author wangli * @author wangli
* @since 2025-03-26 14:30 * @since 2025-03-26 14:30
*/ */
@Getter
public enum SignApproverRoleLimitEnum { public enum SignApproverRoleLimitEnum {
LEADER("LEADER", "负责人"), LEADER("LEADER", "负责人"),
; @JsonEnumDefaultValue
UNKNOWN("UNKNOWN", "未知");
private final String type; private final String type;
private final String desc; private final String desc;
SignApproverRoleLimitEnum(String type, String desc) { SignApproverRoleLimitEnum(String type, String desc) {
@ -22,18 +27,21 @@ public enum SignApproverRoleLimitEnum {
this.desc = desc; this.desc = desc;
} }
public String getType() {
return type;
}
public String getDesc() {
return desc;
}
public static SignApproverRoleLimitEnum valueOfType(String type) { public static SignApproverRoleLimitEnum valueOfType(String type) {
return Arrays.stream(SignApproverRoleLimitEnum.values()) return Arrays.stream(SignApproverRoleLimitEnum.values())
.filter(i -> Objects.equals(i.getType(), type)) .filter(i -> Objects.equals(i.getType(), type))
.findAny() .findAny()
.orElse(null); .orElse(null);
} }
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static SignApproverRoleLimitEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,5 +1,11 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter;
import java.util.Arrays;
/** /**
* 时间查询方向 * 时间查询方向
* <p> * <p>
@ -9,8 +15,22 @@ package cn.axzo.workflow.common.enums;
* @author wangli * @author wangli
* @since 2024-09-29 09:56 * @since 2024-09-29 09:56
*/ */
@Getter
public enum TimeQueryDirection { public enum TimeQueryDirection {
BEFORE, BEFORE,
AFTER, AFTER,
@JsonEnumDefaultValue
UNKNOWN,
; ;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static TimeQueryDirection fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,21 +1,39 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import lombok.AllArgsConstructor; import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.Arrays;
/** /**
* 模版上变量字段类型 * 模版上变量字段类型
*/ */
@AllArgsConstructor
@NoArgsConstructor
@Getter @Getter
public enum VarTypeEnum { public enum VarTypeEnum {
TEXT("text", "文本"), TEXT("text", "文本"),
PICTURE("picture", "图片"),
@JsonEnumDefaultValue
UNKNOWN("unknown", "未知"),
;
PICTURE("picture", "图片"); private final String type;
private final String desc;
private String type; VarTypeEnum(String type, String desc) {
private String desc; this.type = type;
this.desc = desc;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static VarTypeEnum fromValue(String value) {
if (value == null) {
return UNKNOWN;
}
return Arrays.stream(values())
.filter(e -> e.getType().equalsIgnoreCase(value) || e.name().equalsIgnoreCase(value))
.findFirst()
.orElse(UNKNOWN);
}
} }

View File

@ -1,6 +1,7 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import lombok.AllArgsConstructor; import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
@ -10,7 +11,6 @@ import java.util.Arrays;
* @date 2023/11/21 * @date 2023/11/21
*/ */
@Getter @Getter
@AllArgsConstructor
public enum WorkspaceType { public enum WorkspaceType {
/** /**
@ -21,15 +21,30 @@ public enum WorkspaceType {
PROJECT(2, "项目"), PROJECT(2, "项目"),
GOVERNMENT(3, "政务监管平台"), GOVERNMENT(3, "政务监管平台"),
OMS(6, "oms工作台"), OMS(6, "oms工作台"),
@JsonEnumDefaultValue
UN_KNOW(0, "未知"), UN_KNOW(0, "未知"),
; ;
private final Integer code; private final Integer code;
private final String desc; private final String desc;
WorkspaceType(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static WorkspaceType getType(Integer code) { public static WorkspaceType getType(Integer code) {
return Arrays.stream(values()).filter(it -> it.getCode().equals(code)) return fromValue(String.valueOf(code));
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static WorkspaceType fromValue(String value) {
if (value == null) {
return UN_KNOW;
}
return Arrays.stream(values())
.filter(e -> e.getCode().toString().equalsIgnoreCase(value))
.findFirst() .findFirst()
.orElse(null); .orElse(UN_KNOW);
} }
} }

View File

@ -0,0 +1,26 @@
package cn.axzo.workflow.common.model.request.feature;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 钉钉告警内容对象
*
* @author wangli
* @since 2025-09-02 15:24
*/
@ApiModel("钉钉告警内容对象")
@Data
public class DingTalkStarterAlterDTO {
@NotBlank(message = "环境信息不能为空")
private String profile;
@NotBlank(message = "应用名称不能为空")
private String applicationName;
@NotBlank(message = "告警内容不能为空")
private String alterContent;
}

View File

@ -0,0 +1,29 @@
package cn.axzo.workflow.common.model.request.feature;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 枚举查询对象
*
* @author wangli
* @since 2025-09-02 15:17
*/
@ApiModel("枚举查询对象")
@Data
public class EnumQueryDTO {
/**
* 枚举类全路径
*/
@NotBlank(message = "枚举类全路径不能为空")
private String enumClz;
/**
* 枚举值
*/
@NotBlank(message = "枚举值不能为空")
private String enumValue;
}

View File

@ -92,4 +92,10 @@ public class SupportRefreshProperties {
@Value("${workflow.imTemplateCode:}") @Value("${workflow.imTemplateCode:}")
private String imTemplateCode; private String imTemplateCode;
/**
* 忽略 MQ 必接事件的告警服务名
*/
@Value("${workflow.ignoreMqAlterApplicationNames:}")
private List<String> ignoreMqAlterApplicationNames;
} }

View File

@ -0,0 +1,13 @@
package cn.axzo.workflow.core.deletage.approverscope;
import org.springframework.stereotype.Component;
/**
* 兜底的处理器
*
* @author wangli
* @since 2025-08-28 16:45
*/
@Component
public class UnknownProcessor implements ApproverScopeProcessor {
}

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.core.util;
import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO; import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO;
import cn.axzo.workflow.common.model.dto.AlterDTO; import cn.axzo.workflow.common.model.dto.AlterDTO;
import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -203,4 +204,21 @@ public class DingTalkUtils {
request.setMarkdown(markdown); request.setMarkdown(markdown);
sendDingTalk(request); sendDingTalk(request);
} }
public static void sendDingTalkForStarter(DingTalkStarterAlterDTO dto, List<String> alterMobiles) {
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("markdown");
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
markdown.setTitle("Notice 应用必接广播 MQ 事件告警, Env: " + dto.getProfile());
markdown.setText("#### [" + dto.getProfile() + "]应用必接广播 MQ 事件告警\n" +
"> 应用名称:" + dto.getApplicationName() + "\n\n" +
"> 检测信息:" + dto.getAlterContent() + "\n\n" +
mobiles(alterMobiles));
request.setMarkdown(markdown);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(alterMobiles);
at.setIsAtAll(false);
request.setAt(at);
sendDingTalk(request);
}
} }

View File

@ -7,6 +7,7 @@ import cn.axzo.riven.client.model.SampleMarkdown;
import cn.axzo.riven.client.req.DingDingSendRebootGroupMsgReq; import cn.axzo.riven.client.req.DingDingSendRebootGroupMsgReq;
import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO; import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO;
import cn.axzo.workflow.common.model.dto.AlterDTO; import cn.axzo.workflow.common.model.dto.AlterDTO;
import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.axzo.workflow.core.conf.SupportRefreshProperties; import cn.axzo.workflow.core.conf.SupportRefreshProperties;
import cn.axzo.workflow.core.listener.Alter; import cn.axzo.workflow.core.listener.Alter;
import cn.axzo.workflow.core.util.DingTalkUtils; import cn.axzo.workflow.core.util.DingTalkUtils;
@ -41,23 +42,55 @@ public class DingTalkAlter implements Alter {
@Override @Override
public void invoke(Object obj) { public void invoke(Object obj) {
if (!Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) {
log.info("ignore send alter");
return;
}
log.info("send biz node alter : {}", JSON.toJSONString(obj)); log.info("send biz node alter : {}", JSON.toJSONString(obj));
if (obj instanceof AlterDTO) { if (obj instanceof AlterDTO) {
AlterDTO alterDTO = (AlterDTO) obj; AlterDTO alterDTO = (AlterDTO) obj;
if (Objects.equals(profile, "master")) { if (Objects.equals(profile, "master")) {
rivenDingtalk(alterDTO);
} else {
DingTalkUtils.sendDingTalkForBizNodeAlter(profile, alterDTO, refreshProperties.getAlterMobiles()); DingTalkUtils.sendDingTalkForBizNodeAlter(profile, alterDTO, refreshProperties.getAlterMobiles());
} else {
rivenDingtalk(alterDTO);
} }
} }
if (obj instanceof NextNodePreCheckAlterDTO) { if (obj instanceof NextNodePreCheckAlterDTO) {
NextNodePreCheckAlterDTO alterDTO = (NextNodePreCheckAlterDTO) obj; NextNodePreCheckAlterDTO alterDTO = (NextNodePreCheckAlterDTO) obj;
if (Objects.equals(profile, "master")) { if (Objects.equals(profile, "master")) {
rivenDingtalkForNodePreCheck(alterDTO);
} else {
DingTalkUtils.sendDingTalkForNodePreCheck(profile, alterDTO, refreshProperties.getAlterMobiles()); DingTalkUtils.sendDingTalkForNodePreCheck(profile, alterDTO, refreshProperties.getAlterMobiles());
} else {
rivenDingtalkForNodePreCheck(alterDTO);
} }
} }
if (obj instanceof DingTalkStarterAlterDTO) {
DingTalkStarterAlterDTO starterAlterDTO = (DingTalkStarterAlterDTO) obj;
if (refreshProperties.getIgnoreMqAlterApplicationNames().contains(starterAlterDTO.getApplicationName())) {
// 忽略必接事件的应用
return;
}
DingTalkUtils.sendDingTalkForStarter(starterAlterDTO, refreshProperties.getAlterMobiles());
}
}
private void rivenDingtalkForStarter(DingTalkStarterAlterDTO alterDTO) {
DingDingSendRebootGroupMsgReq req = new DingDingSendRebootGroupMsgReq();
req.setDingDingScene("WORKFLOW_ENGINE_BIZNODE_ALTER");
String title = "Notice 应用必接事件告警, Env: " + profile;
String text = "#### [" + profile + "]应用必接事件告警\n" +
"> 应用名称:" + alterDTO.getApplicationName() + "\n\n" +
"> 检测信息:" + alterDTO.getAlterContent() + "\n\n" +
mobiles(refreshProperties.getAlterMobiles());
SampleMarkdown markdown = new SampleMarkdown(title, text);
JSONObject markdownJson = JSONObject.parseObject(markdown.toJson());
JSONObject atMobiles = new JSONObject();
atMobiles.put("atMobiles", refreshProperties.getAlterMobiles());
markdownJson.put("at", atMobiles);
markdownJson.put("isAtAll", false);
req.setDingDingJson(markdownJson.toJSONString());
req.setMsgType(DingTalkMsgTypeEnum.sampleMarkdown);
dingDingMsgApi.sendRebootGroupMsg(req);
} }
private void rivenDingtalkForNodePreCheck(NextNodePreCheckAlterDTO alterDTO) { private void rivenDingtalkForNodePreCheck(NextNodePreCheckAlterDTO alterDTO) {

View File

@ -9,6 +9,7 @@ import cn.axzo.workflow.common.model.request.form.definition.FormContentSearchDT
import cn.axzo.workflow.common.model.request.form.instance.FormInstanceSearchDTO; import cn.axzo.workflow.common.model.request.form.instance.FormInstanceSearchDTO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO; import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd;
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation; import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
@ -110,6 +111,8 @@ public class TestController {
private SpecifyProcessInstanceSyncEsJobHandler specifyProcessInstanceSyncEsJobHandler; private SpecifyProcessInstanceSyncEsJobHandler specifyProcessInstanceSyncEsJobHandler;
@Resource @Resource
private TaskService taskService; private TaskService taskService;
@Resource
private SupportRefreshProperties refreshProperties;
@RepeatSubmit @RepeatSubmit
@GetMapping("/test") @GetMapping("/test")
@ -397,5 +400,10 @@ public class TestController {
taskService.complete(taskId); taskService.complete(taskId);
return CommonResponse.success(true); return CommonResponse.success(true);
} }
@GetMapping("/properties/refresh")
public CommonResponse<String> refreshProperties() {
return CommonResponse.success(JSON.toJSONString(refreshProperties));
}
} }

View File

@ -8,6 +8,7 @@ import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
import cn.axzo.workflow.common.model.response.es.ProcessTaskDocumentVO; import cn.axzo.workflow.common.model.response.es.ProcessTaskDocumentVO;
import cn.axzo.workflow.es.service.aggregation.AggregateProcessInstanceService; import cn.axzo.workflow.es.service.aggregation.AggregateProcessInstanceService;
import cn.axzo.workflow.es.service.aggregation.AggregateProcessTaskService; import cn.axzo.workflow.es.service.aggregation.AggregateProcessTaskService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.azxo.framework.common.model.CommonResponse; import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -30,6 +31,7 @@ import java.util.List;
@Slf4j @Slf4j
@RequestMapping({"/web/v1/api/es", "/api/es"}) @RequestMapping({"/web/v1/api/es", "/api/es"})
@RestController @RestController
@ErrorReporter
@Validated @Validated
public class ElasticSearchController implements EsProcessInstanceApi { public class ElasticSearchController implements EsProcessInstanceApi {
@Resource @Resource

View File

@ -0,0 +1,63 @@
package cn.axzo.workflow.server.controller.web.manage;
import cn.axzo.workflow.client.feign.manage.FunctionApi;
import cn.axzo.workflow.common.enums.AdminDataSource;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.axzo.workflow.server.alter.DingTalkAlter;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 功能性 API 控制器
*
* @author wangli
* @since 2025-09-02 14:44
*/
@Slf4j
@RequestMapping({"/web/v1/api/function", "/api/function"})
@RestController
@ErrorReporter
@Validated
public class FunctionController implements FunctionApi {
@Resource
private DingTalkAlter dingTalkAlter;
/**
* 获取指定枚举类型的枚举值信息
*
* @param enumValue
* @return
*/
@Operation(summary = "获取指定枚举类型的枚举值信息")
@Override
@GetMapping("/enum/admin-data-source/get")
public CommonResponse<AdminDataSource> getAdminDataSourceEnum(String enumValue) {
return CommonResponse.success(AdminDataSource.fromValue(enumValue));
}
@Operation(summary = "获取指定枚举类型的枚举值信息")
@Override
@GetMapping("/enum/process-instance-result/get")
public CommonResponse<BpmnProcessInstanceResultEnum> getFileTypeEnum(String enumValue) {
return CommonResponse.success(BpmnProcessInstanceResultEnum.fromValue(enumValue));
}
@Operation(summary = "发送钉钉消息")
@PostMapping("/dingtalk/alter")
@Override
public CommonResponse<Boolean> sendDingtalk(@Validated @RequestBody DingTalkStarterAlterDTO dto) {
dingTalkAlter.invoke(dto);
return CommonResponse.success(true);
}
}

View File

@ -30,4 +30,5 @@ public class StarterFeignClientConfiguration {
public static class WorkflowManageServiceClient { public static class WorkflowManageServiceClient {
} }
} }

View File

@ -1,5 +1,6 @@
package cn.axzo.workflow.starter; package cn.axzo.workflow.starter;
import cn.axzo.workflow.starter.api.WorkflowCoreService;
import cn.axzo.workflow.starter.common.enums.FailHandleTypeEnum; import cn.axzo.workflow.starter.common.enums.FailHandleTypeEnum;
import cn.axzo.workflow.starter.common.exception.WorkflowUnsupportedException; import cn.axzo.workflow.starter.common.exception.WorkflowUnsupportedException;
import cn.axzo.workflow.starter.handler.MessageNotificationEventHandler; import cn.axzo.workflow.starter.handler.MessageNotificationEventHandler;
@ -23,6 +24,7 @@ import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerInstanceEventListener
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerNotificationEventListener; import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerNotificationEventListener;
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerTaskEventListener; import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerTaskEventListener;
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerWorkflowListener; import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerWorkflowListener;
import cn.axzo.workflow.starter.mq.check.ImplementationReadyChecker;
import cn.axzo.workflow.starter.mq.monitor.WorkflowEngineStarterDefaultMQMonitor; import cn.axzo.workflow.starter.mq.monitor.WorkflowEngineStarterDefaultMQMonitor;
import cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController; import cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController;
import cn.axzo.workflow.starter.selector.MetaFeignClientEnableSelector; import cn.axzo.workflow.starter.selector.MetaFeignClientEnableSelector;
@ -155,9 +157,9 @@ public class WorkflowEngineStarterAutoConfiguration {
return new WorkflowEngineStarterDefaultMQMonitor(mqAdminExtObjectProvider, broadcastDLQProcessorObjectProvider, rpcDLQProcessorObjectProvider, workflowEngineStarterProperties, environment); return new WorkflowEngineStarterDefaultMQMonitor(mqAdminExtObjectProvider, broadcastDLQProcessorObjectProvider, rpcDLQProcessorObjectProvider, workflowEngineStarterProperties, environment);
} }
// @Bean @Bean
// public ImplementationReadyChecker implementationReadyChecker() { public ImplementationReadyChecker implementationReadyChecker(WorkflowCoreService workflowCoreService) {
// return new ImplementationReadyChecker(); return new ImplementationReadyChecker(workflowCoreService);
// } }
} }

View File

@ -1,87 +1,66 @@
package cn.axzo.workflow.starter.api; package cn.axzo.workflow.starter.api;
import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration;
import cn.axzo.workflow.common.util.ThreadUtil;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
import cn.axzo.workflow.common.model.response.form.FormVO;
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
import java.util.List;
import cn.axzo.workflow.common.model.dto.SignFileDTO; import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO; import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import java.util.Map;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO; import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO; import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO; import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import javax.validation.constraints.NotEmpty; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
import cn.axzo.workflow.common.util.ThreadUtil;
import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/** /**
* Workflow Engine Starter Core Service * Workflow Engine Starter Core Service
@ -94,14 +73,26 @@ import javax.validation.constraints.NotEmpty;
public interface WorkflowCoreService { public interface WorkflowCoreService {
/** /**
* 业务节点唤醒, 该节点废弃请换成 {@link ProcessActivityApi#trigger(cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO)} 接口 * 查询指定审批流程是否能打印打印开关是否开启是否存在打印模板
* <p> *
* 当模型中使用了业务节点且设置了不设置审批人模式则当业务监听到 PROCESS_ACTIVITY_START 事件时可通过该接口推动流程继续运行 * @param processInstanceId
* @return
*/ */
@Deprecated @Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
@GetMapping("/api/process/activity/trigger") @GetMapping("/api/print/admin/template/exists")
@InvokeMode(SYNC) @InvokeMode(SYNC)
Boolean trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId); Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
/**
* 打印模板配置内容更新保存
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容更新保存")
@PostMapping("/api/print/admin/template/upsert")
@InvokeMode(SYNC)
Void printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
/** /**
* 业务节点唤醒 * 业务节点唤醒
@ -148,6 +139,17 @@ public interface WorkflowCoreService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto); Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
/**
* 用于 Starter 检测必接事件的告警
*
* @param dto
* @return
*/
@Operation(summary = "发送钉钉消息")
@PostMapping("/api/function/dingtalk/alter")
@InvokeMode(SYNC)
Boolean sendDingtalk(@Validated @RequestBody DingTalkStarterAlterDTO dto);
/** /**
* 获取指定审批业务的流程表单设置 * 获取指定审批业务的流程表单设置
* @param dto * @param dto
@ -236,6 +238,17 @@ public interface WorkflowCoreService {
@InvokeMode(ASYNC) @InvokeMode(ASYNC)
BatchOperationResultVO batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos); BatchOperationResultVO batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);
/**
* 抄送流程实例未实现
*
* @param dto
* @return
*/
@Operation(summary = "抄送流程实例")
@PostMapping("/api/process/instance/carbon-copy")
@Deprecated
Boolean carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
/** /**
* 获得流程实例 * 获得流程实例
* *
@ -247,6 +260,17 @@ public interface WorkflowCoreService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
BpmnProcessInstanceVO getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto); BpmnProcessInstanceVO getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
/**
* 批量获得流程实例
*
* @param dto
* @return
*/
@Operation(summary = "批量获得流程实例")
@PostMapping("/api/process/instance/batch/get")
@InvokeMode(SYNC)
List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto);
/** /**
* 获取指定流程实例的流程变量 * 获取指定流程实例的流程变量
* *

View File

@ -1,74 +1,17 @@
package cn.axzo.workflow.starter.api; package cn.axzo.workflow.starter.api;
import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration;
import cn.axzo.workflow.common.util.ThreadUtil;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable; import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.enums.AdminDataSource;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO; import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO; import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO; import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO; import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
import cn.axzo.workflow.common.model.response.form.FormVO;
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import com.fasterxml.jackson.databind.node.ObjectNode;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import cn.axzo.workflow.common.model.request.category.*;
import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
import org.springframework.web.bind.annotation.*;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable;
import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO; import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
@ -81,38 +24,69 @@ import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO; import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO; import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
import cn.axzo.workflow.common.model.request.category.CategoryConfigCreateDTO;
import cn.axzo.workflow.common.model.request.category.CategoryConfigSearchDTO;
import cn.axzo.workflow.common.model.request.category.CategoryCreateDTO;
import cn.axzo.workflow.common.model.request.category.CategoryGroupVarSearchDto;
import cn.axzo.workflow.common.model.request.category.CategoryGroupVarUpsertDto;
import cn.axzo.workflow.common.model.request.category.CategorySearchDTO;
import cn.axzo.workflow.common.model.request.category.CategoryUpdateDTO;
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO; import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelExtVO; import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelExtVO;
import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO; import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
import cn.axzo.workflow.common.model.response.print.PrintModelDTO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO; import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
import cn.axzo.workflow.common.model.response.form.FormVO;
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
import cn.axzo.workflow.common.util.ThreadUtil;
import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO; import javax.validation.constraints.NotNull;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO; import java.util.List;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO; import java.util.Map;
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID; import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/** /**
* Workflow Engine Starter Management Service * Workflow Engine Starter Management Service
@ -124,18 +98,27 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
@org.springframework.cloud.openfeign.FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = WorkflowEngineStarterFeignConfiguration.class) @org.springframework.cloud.openfeign.FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = WorkflowEngineStarterFeignConfiguration.class)
public interface WorkflowManageService { public interface WorkflowManageService {
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板") /**
@GetMapping("/api/print/admin/template/exists") * 获取打印模板中可打印的字段
@InvokeMode(SYNC) *
Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId); * @param dto
* @return
*/
@Operation(summary = "获取打印模板中可打印的字段") @Operation(summary = "获取打印模板中可打印的字段")
@PostMapping("/api/print/admin/fields") @PostMapping("/api/print/admin/fields")
@Manageable
@InvokeMode(SYNC) @InvokeMode(SYNC)
List<PrintFieldDTO> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto); List<PrintFieldDTO> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
/**
* 获取指定流程下用于替换打印的相关变量
*
* @param processInstanceId
* @return
*/
@Operation(summary = "获取指定流程下用于替换打印的相关变量") @Operation(summary = "获取指定流程下用于替换打印的相关变量")
@GetMapping("/api/print/admin/field/variables") @GetMapping("/api/print/admin/field/variables")
@Manageable
@InvokeMode(SYNC) @InvokeMode(SYNC)
Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId); Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
@ -202,6 +185,29 @@ public interface WorkflowManageService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
Integer batchDeleteProcessAdmin(@RequestBody List<Long> ids); Integer batchDeleteProcessAdmin(@RequestBody List<Long> ids);
/**
* 业务节点唤醒, 该节点废弃请换成 {@link ProcessActivityApi#trigger(cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO)} 接口
* <p>
* 当模型中使用了业务节点且设置了不设置审批人模式则当业务监听到 PROCESS_ACTIVITY_START 事件时可通过该接口推动流程继续运行
*/
@Deprecated
@GetMapping("/api/process/activity/trigger")
@Manageable
@InvokeMode(SYNC)
Boolean trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
@Operation(summary = "获取指定枚举类型的枚举值信息")
@GetMapping("/api/function/enum/admin-data-source/get")
@Manageable
@InvokeMode(SYNC)
AdminDataSource getAdminDataSourceEnum(@RequestParam String enumValue);
@Operation(summary = "获取指定枚举类型的枚举值信息")
@GetMapping("/api/function/enum/process-instance-result/get")
@Manageable
@InvokeMode(SYNC)
BpmnProcessInstanceResultEnum getFileTypeEnum(@RequestParam String enumValue);
@PostMapping("/api/form/admin/form/page") @PostMapping("/api/form/admin/form/page")
@InvokeMode(SYNC) @InvokeMode(SYNC)
@Manageable @Manageable
@ -221,18 +227,6 @@ public interface WorkflowManageService {
@Manageable @Manageable
Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto); Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
/**
* 抄送流程实例未实现
*
* @param dto
* @return
*/
@Operation(summary = "抄送流程实例")
@PostMapping("/api/process/instance/carbon-copy")
@Deprecated
@Manageable
Boolean carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
/** /**
* 查询所有的审批流 * 查询所有的审批流
* *
@ -675,17 +669,6 @@ public interface WorkflowManageService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
List<String> getModelTenantIds(); List<String> getModelTenantIds();
/**
* 打印模板配置内容更新保存
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容更新保存")
@PostMapping("/api/process/model/print/template/upsert")
@InvokeMode(SYNC)
Void printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
/** /**
* 获取打印模板配置内容 * 获取打印模板配置内容
* *

View File

@ -1,12 +1,23 @@
package cn.axzo.workflow.starter.mq.check; package cn.axzo.workflow.starter.mq.check;
import cn.axzo.framework.rocketmq.DefaultEventConsumer;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandler;
import cn.axzo.framework.rocketmq.EventHandlerRepository;
import cn.axzo.workflow.common.enums.ProcessInstanceEventEnum;
import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO; import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
import cn.axzo.workflow.starter.api.WorkflowCoreService;
import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler; import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
import com.google.common.collect.ListMultimap;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.core.env.Environment;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -31,19 +42,82 @@ public class ImplementationReadyChecker implements ApplicationListener<Applicati
"onAborted" "onAborted"
); );
private static final List<Event.EventCode> EVENT_CODES = Arrays.asList(
ProcessInstanceEventEnum.PROCESS_INSTANCE_COMPLETED.getEventCode(),
ProcessInstanceEventEnum.PROCESS_INSTANCE_CANCELLED.getEventCode(),
ProcessInstanceEventEnum.PROCESS_INSTANCE_REJECTED.getEventCode(),
ProcessInstanceEventEnum.PROCESS_INSTANCE_ABORTED.getEventCode()
);
private final WorkflowCoreService workflowCoreService;
public ImplementationReadyChecker(WorkflowCoreService workflowCoreService) {
this.workflowCoreService = workflowCoreService;
}
@Override @Override
public void onApplicationEvent(ApplicationReadyEvent event) { public void onApplicationEvent(ApplicationReadyEvent event) {
ApplicationContext context = event.getApplicationContext(); ApplicationContext context = event.getApplicationContext();
// 获取所有实现了目标接口的Bean boolean[] methodImplemented = checkUnImplementedMethodsWithInterface(context);
Map<String, ProcessInstanceEventHandler> handlers = context.getBeansOfType(TARGET_INTERFACE); if (getBinaryResult(methodImplemented) == 15) {
if (handlers.isEmpty()) { log.info("Congratulations, passed the verification");
log.warn("未找到实现 {} 接口的Bean, 请确保至少有一个实现类被正确扫描和注册。", TARGET_INTERFACE.getName()); log.info("祝贺,已通过必接事件的校验!但仍然请确保您的实现类逻辑正确无误,不允许出现空实现,否则生产问题自行负责!");
return;
}
log.warn("将继续通过 EventConsumer 进行检查...");
boolean[] methodImplemented2 = checkUnImplementedMethodsWithEventConsumer(context);
if (getBinaryResult(methodImplemented2) == 15) {
log.info("Congratulations, passed the verification");
log.info("祝贺,已通过必接事件的校验!但仍然请确保您的实现类逻辑正确无误,不允许出现空实现,否则生产问题自行负责!");
} else {
int finalResult = getBinaryResult(methodImplemented) | getBinaryResult(methodImplemented2);
boolean[] booleansAdaptive = toBooleansAdaptive(finalResult);
log.error("----------------------------------------");
log.error("最终事件实现情况:(二进制:{})(十进制:{})", String.format("%4s", Integer.toBinaryString(finalResult)).replace(' ', '0'), finalResult);
log.error("警告:未通过必接事件的校验!未实现的方法:{},请确保实现了 {} 接口的Bean被Spring扫描或者在EventConsumer注册了 ProcessInstanceEventEnum 的 EventCode。", String.join(", ", getUnImplementedMethods(booleansAdaptive)), TARGET_INTERFACE.getName());
log.error("----------------------------------------");
sendAlter(context, getUnImplementedMethods(booleansAdaptive));
} }
}
public static boolean[] toBooleansAdaptive(int value) {
if (value < 0) throw new IllegalArgumentException("adaptive mode only for non-negative");
if (value == 0) return new boolean[]{false};
int bits = 32 - Integer.numberOfLeadingZeros(value);
return toBooleans(value, bits);
}
// 高位在前index=0 是最高位
public static boolean[] toBooleans(int value, int bits) {
if (bits <= 0 || bits > 32) throw new IllegalArgumentException("bits must be 1~32");
boolean[] arr = new boolean[bits];
for (int i = 0; i < bits; i++) {
int shift = bits - 1 - i;
arr[i] = ((value >>> shift) & 1) == 1;
}
return arr;
}
private void sendAlter(ApplicationContext context, List<String> unImplementedMethods) {
Environment environment = context.getEnvironment();
DingTalkStarterAlterDTO dto = new DingTalkStarterAlterDTO();
dto.setApplicationName(environment.getProperty("spring.application.name"));
dto.setProfile(environment.getProperty("spring.profiles.active"));
dto.setAlterContent("必接事件实现类检查未通过,未实现的方法: " + String.join(", ", unImplementedMethods) + "。请确保至少有一个实现类覆盖这些方法以处理相应的事件。");
workflowCoreService.sendDingtalk(dto);
}
private static boolean[] checkUnImplementedMethodsWithInterface(ApplicationContext context) {
// 记录每个方法是否被实现 // 记录每个方法是否被实现
boolean[] methodImplemented = new boolean[4]; boolean[] methodImplemented = new boolean[4];
Arrays.fill(methodImplemented, false); Arrays.fill(methodImplemented, false);
// 获取所有实现了目标接口的Bean
Map<String, ProcessInstanceEventHandler> handlers = context.getBeansOfType(TARGET_INTERFACE);
if (handlers.isEmpty()) {
log.warn("未找到实现 {} 接口的Bean ", TARGET_INTERFACE.getName());
return methodImplemented;
}
// 检查每个实现类 // 检查每个实现类
for (ProcessInstanceEventHandler handler : handlers.values()) { for (ProcessInstanceEventHandler handler : handlers.values()) {
@ -63,7 +137,60 @@ public class ImplementationReadyChecker implements ApplicationListener<Applicati
} }
} }
} }
int binaryResult = getBinaryResult(methodImplemented);
List<String> unimplementedMethods = getUnImplementedMethods(methodImplemented);
log.info("实现 {} 接口的Bean数量: {}", TARGET_INTERFACE.getName(), handlers.size());
log.warn("基于接口事件实现情况:(二进制:{})(十进制:{})", String.format("%4s", Integer.toBinaryString(binaryResult)).replace(' ', '0'), binaryResult);
if (!unimplementedMethods.isEmpty()) {
log.info("未通过 Starter 提供的 {} 接口实现中找到以下方法的实现: {}。请确保至少有一个实现类覆盖这些方法以处理相应的事件。", TARGET_INTERFACE.getName(), String.join(", ", unimplementedMethods));
}
return methodImplemented;
}
private static boolean[] checkUnImplementedMethodsWithEventConsumer(ApplicationContext context) {
// 记录每个方法是否被实现
boolean[] methodImplemented = new boolean[4];
Arrays.fill(methodImplemented, false);
Map<String, EventConsumer> beansOfType = context.getBeansOfType(EventConsumer.class);
beansOfType.forEach((name, c) -> {
if (c instanceof DefaultEventConsumer) {
try {
Field repoField = DefaultEventConsumer.class.getDeclaredField("handlerRepository");
repoField.setAccessible(true);
EventHandlerRepository repo = (EventHandlerRepository) repoField.get(c);
Field handlersField = EventHandlerRepository.class.getDeclaredField("handlers");
handlersField.setAccessible(true);
@SuppressWarnings("unchecked")
ListMultimap<Event.EventCode, EventHandler> eventHandlers =
(ListMultimap<Event.EventCode, EventHandler>) handlersField.get(repo);
for (int i = 0; i < EVENT_CODES.size(); i++) {
methodImplemented[i] = eventHandlers.keySet().contains(EVENT_CODES.get(i));
}
} catch (Exception e) {
log.warn("通过 EventConsumer 检测必接事件异常:{}", e.getMessage(), e);
}
}
});
int binaryResult = getBinaryResult(methodImplemented);
log.warn("基于EventConsumer事件实现情况(二进制:{})(十进制:{})", String.format("%4s", Integer.toBinaryString(binaryResult)).replace(' ', '0'), binaryResult);
return methodImplemented;
}
private static List<String> getUnImplementedMethods(boolean[] methodImplemented) {
// 收集未实现的方法
List<String> unimplementedMethods = new ArrayList<>();
for (int i = 0; i < methodImplemented.length; i++) {
if (!methodImplemented[i]) {
unimplementedMethods.add(METHOD_NAMES.get(i));
}
}
return unimplementedMethods;
}
private static int getBinaryResult(boolean[] methodImplemented) {
// 生成4位二进制数 // 生成4位二进制数
int binaryResult = 0; int binaryResult = 0;
for (int i = 0; i < methodImplemented.length; i++) { for (int i = 0; i < methodImplemented.length; i++) {
@ -73,22 +200,6 @@ public class ImplementationReadyChecker implements ApplicationListener<Applicati
binaryResult += weight; binaryResult += weight;
} }
} }
return binaryResult;
// 收集未实现的方法
List<String> unimplementedMethods = new ArrayList<>();
for (int i = 0; i < methodImplemented.length; i++) {
if (!methodImplemented[i]) {
unimplementedMethods.add(METHOD_NAMES.get(i));
}
}
log.warn("实现 {} 接口的Bean数量: {}", TARGET_INTERFACE.getName(), handlers.size());
log.warn("方法实现情况:(二进制:{})(十进制:{})", String.format("%4s", Integer.toBinaryString(binaryResult)).replace(' ', '0'), binaryResult);
if (!unimplementedMethods.isEmpty()) {
log.error("以下方法未被任何实现类覆盖: {}。请确保至少有一个实现类覆盖这些方法以处理相应的事件。", String.join(", ", unimplementedMethods));
} else {
log.warn("Congratulations, passed the verification");
log.warn("祝贺,已通过必接事件的校验!但仍然请确保您的实现类逻辑正确无误,不允许出现空实现,否则生产问题自行负责!");
}
} }
} }