From d2ed296d638aad1d7016fc8c816ae49f20dda73e Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 1 Nov 2023 14:33:23 +0800 Subject: [PATCH] =?UTF-8?q?update=20-=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E5=86=85=E9=83=A8=E6=96=87=E4=BB=B6=E5=91=BD=E5=90=8D?= =?UTF-8?q?,=20=E8=A1=A5=E5=85=85=E5=B7=A5=E7=A8=8B=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectDesc.md | 32 +++++++ README.md | 11 +-- imgs/start-config.png | Bin 0 -> 90567 bytes .../{BpmConstants.java => BpmnConstants.java} | 2 +- ...lowNodeType.java => BpmnFlowNodeType.java} | 4 +- ...ava => BpmnProcessInstanceResultEnum.java} | 6 +- .../model/request/bpmn/BpmnJsonNode.java | 8 +- .../BpmnProcessInstanceMyPageReqVO.java | 4 +- .../bpmn/task/BpmnTaskPageSearchDTO.java | 4 +- .../BpmnProcessInstancePageItemVO.java | 4 +- .../bpmn/process/BpmnProcessInstanceVO.java | 4 +- .../task/BpmnHistoricTaskInstanceGroupVO.java | 4 +- .../bpmn/task/BpmnHistoricTaskInstanceVO.java | 4 +- .../bpmn/task/BpmnTaskDonePageItemVO.java | 4 +- .../{BpmErrorCode.java => BpmnErrorCode.java} | 2 +- ...ava => BpmnProcessInstanceStatusEnum.java} | 4 +- .../core/common/utils/BpmTransformUtil.java | 28 +++--- ...ionUtils.java => BpmnCollectionUtils.java} | 14 ++- .../common/utils/BpmnJsonConverterUtil.java | 12 +-- ...yBatisUtils.java => BpmnMyBatisUtils.java} | 6 +- ...ortingField.java => BpmnSortingField.java} | 10 +-- .../json/AbstractBpmnJsonConverter.java | 2 +- .../converter/json/EndEventJsonConverter.java | 2 +- .../converter/json/NotSupportConverter.java | 2 +- .../json/SequenceFlowJsonConverter.java | 2 +- .../json/StartEventJsonConverter.java | 2 +- .../converter/json/UserTaskJsonConverter.java | 2 +- ...lateDTO.java => BpmnTaskCalculateDTO.java} | 2 +- ...askDelegate.java => BpmnTaskDelegate.java} | 4 +- .../listener/EngineActivityEventListener.java | 8 +- .../EngineExecutionStartListener.java | 18 ++-- .../EngineProcessInstanceEventListener.java | 26 +++--- .../listener/EngineTaskEventListener.java | 12 +-- ...er.java => BpmnActivityEventListener.java} | 2 +- ...ner.java => BpmnProcessEventListener.java} | 2 +- ...stener.java => BpmnTaskEventListener.java} | 2 +- .../core/repository/mapper/BaseMapperX.java | 4 +- .../mapper/BpmLambdaQueryWrapperX.java | 85 ------------------ .../mapper/BpmnLambdaQueryWrapperX.java | 85 ++++++++++++++++++ .../BpmnTaskDonePageItemConverter.java | 11 ++- .../BpmnProcessDefinitionServiceImpl.java | 21 +++-- .../impl/BpmnProcessInstanceServiceImpl.java | 44 ++++----- .../impl/BpmnProcessModelServiceImpl.java | 10 +-- .../service/impl/BpmnTaskServiceImpl.java | 50 ++++++----- .../service/impl/CategoryServiceImpl.java | 8 +- .../impl/FormDefinitionServiceImpl.java | 5 +- .../service/impl/FormInstanceServiceImpl.java | 4 +- .../service/impl/FormModelServiceImpl.java | 4 +- .../support/ExpressionConditionCmd.java | 2 +- .../support/FlowNodeForecastService.java | 2 +- .../delegate/BpmnDefaultTaskDelegateImpl.java | 10 +-- .../CustomBpmActivityEventListener.java | 4 +- ...va => CustomBpmnProcessEventListener.java} | 4 +- ... => RocketMqBpmnProcessEventListener.java} | 6 +- ...ava => RocketMqBpmnTaskEventListener.java} | 8 +- ...=> SnapshotBpmnTaskTaskEventListener.java} | 8 +- .../StartNodeAutoCompleteEventListener.java | 10 +-- .../bpmn/BpmnProcessInstanceController.java | 2 +- .../resources/工作流引擎事件触发时机说明.md | 0 59 files changed, 350 insertions(+), 292 deletions(-) create mode 100644 ProjectDesc.md create mode 100644 imgs/start-config.png rename workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/{BpmConstants.java => BpmnConstants.java} (98%) rename workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/{BpmFlowNodeType.java => BpmnFlowNodeType.java} (93%) rename workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/{BpmProcessInstanceResultEnum.java => BpmnProcessInstanceResultEnum.java} (85%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/{BpmErrorCode.java => BpmnErrorCode.java} (99%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/{BpmProcessInstanceStatusEnum.java => BpmnProcessInstanceStatusEnum.java} (79%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/{BpmCollectionUtils.java => BpmnCollectionUtils.java} (95%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/{BpmMyBatisUtils.java => BpmnMyBatisUtils.java} (95%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/{BpmSortingField.java => BpmnSortingField.java} (68%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/{BpmTaskCalculateDTO.java => BpmnTaskCalculateDTO.java} (96%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/{BpmTaskDelegate.java => BpmnTaskDelegate.java} (74%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/{BpmActivityEventListener.java => BpmnActivityEventListener.java} (96%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/{BpmProcessEventListener.java => BpmnProcessEventListener.java} (95%) rename workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/{BpmTaskEventListener.java => BpmnTaskEventListener.java} (94%) delete mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmLambdaQueryWrapperX.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmnLambdaQueryWrapperX.java rename workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/{CustomBpmProcessEventListener.java => CustomBpmnProcessEventListener.java} (92%) rename workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/{RocketMqBpmProcessEventListener.java => RocketMqBpmnProcessEventListener.java} (98%) rename workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/{RocketMqBpmTaskEventListener.java => RocketMqBpmnTaskEventListener.java} (93%) rename workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/{SnapshotBpmTaskTaskEventListener.java => SnapshotBpmnTaskTaskEventListener.java} (78%) delete mode 100644 workflow-engine-server/src/main/resources/工作流引擎事件触发时机说明.md diff --git a/ProjectDesc.md b/ProjectDesc.md new file mode 100644 index 000000000..5d7db5e59 --- /dev/null +++ b/ProjectDesc.md @@ -0,0 +1,32 @@ +## 1. 本工程结构说明 + +- workflow-engine-api: Feign 接口 module, 采用 SpringBoot Starter 方式对外提供, 该报中使用对象模型, 都引用自 common 模块. + 需要特别注意的是, 由于绝大部分的 Feign API 都会提供对应的 WebApi, 但由于 MVC 与 OpenFeign 默认不会同时解析对应的 + MappingAdapter, 而目前所有的 Feign API 的实现都是 Server 模块中的 Controller, 所以在 Server 模块中的 Controller 需要单独设置 + Feign 的请求路径. +- workflow-engine-common: 通用的公共模型以及常量 +- workflow-engine-core: 该 module 的目的是以 jar 包的方式,提供给二/三方应用集成,而不依赖本工程. +- workflow-engine-server: 本工程的启动目录, 提供 Web 相关功能以及特性 + +## 2. 启动方式 + +> 在 workflow-engine-server 模块下, 设置好了 bootstrap.yml, 一般情况直接设置对应的 active profiles 即可. +> 由于各个环境中的组件地址可能存在配置的是基于 K8S DNS 的内网域名,本地启动会无法连接, 所以建议通过 VM Options/ Program +> arguments/ Environment 等方式对 Nacos 中的默认配置进行覆盖即可. +> +> **严禁随意调整 Bootstrap.yml 配置文件内容** + +目前提供了四种 Profile 的 nacos 地址配置信息 + +- local: 一般用于本地开发 + > 该环境比较特殊, 用于连接自己本地的数据库, 注意账号密码请用本地覆盖 + > ```text + > -Dspring.datasource.username=root -Dspring.datasource.password=123456 + > ``` + > ![start-config.png](imgs/start-config.png) + +- dev: 一般用于开发联调 +- test: 一般用于提测 +- pre: 一般用于上线前验收 + + diff --git a/README.md b/README.md index 296c865d6..d909f3ea9 100644 --- a/README.md +++ b/README.md @@ -269,9 +269,9 @@ act_ge_bytearray (很多元数据) **广播的事件接口** -- cn.axzo.workflow.core.listener.BpmActivityEventListener -- cn.axzo.workflow.core.listener.BpmTaskEventListener -- cn.axzo.workflow.core.listener.BpmProcessEventListener +- cn.axzo.workflow.core.listener.BpmnActivityEventListener +- cn.axzo.workflow.core.listener.BpmnTaskEventListener +- cn.axzo.workflow.core.listener.BpmnProcessEventListener **以下总结下哪些接口触发哪些事件** @@ -301,12 +301,7 @@ act_ge_bytearray (很多元数据) > 1. 当前审批任务会触发 process-task-deleted 事件 > 2. 当前流程实例会触发 process-instance-rejected 事件 -## 7. 本工程结构说明 -- workflow-engine-api: Feign 接口包,采用 SpringBoot Starter 方式对外提供 -- workflow-engine-common: 通用的公共模型以及常量 -- workflow-engine-core: -- workflow-engine-server ## 99.建设状态(过时) diff --git a/imgs/start-config.png b/imgs/start-config.png new file mode 100644 index 0000000000000000000000000000000000000000..1462b173cabbe58a95bcce1e7969f50a342f91e2 GIT binary patch literal 90567 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 rsDO|`z10VD0{@IRwY6fOLSG9X13#J it.getStatus().equals(status)).findFirst() .orElse(null); } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNode.java index 692e416cd..a5a90ce08 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNode.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/BpmnJsonNode.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.request.bpmn; -import cn.axzo.workflow.common.enums.BpmFlowNodeType; +import cn.axzo.workflow.common.enums.BpmnFlowNodeType; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -28,7 +28,7 @@ public class BpmnJsonNode { @ApiModelProperty(value = "父节点ID") private String parentId; @ApiModelProperty(value = "节点类型") - private BpmFlowNodeType type; + private BpmnFlowNodeType type; @ApiModelProperty(value = "节点名称") private String name; @ApiModelProperty(value = "子节点信息") @@ -60,11 +60,11 @@ public class BpmnJsonNode { this.parentId = parentId; } - public BpmFlowNodeType getType() { + public BpmnFlowNodeType getType() { return type; } - public void setType(BpmFlowNodeType type) { + public void setType(BpmnFlowNodeType type) { this.type = type; } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java index 829585a87..881a3821a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceMyPageReqVO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.request.bpmn.process; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.BpmPageParam; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -31,7 +31,7 @@ public class BpmnProcessInstanceMyPageReqVO extends BpmPageParam { private String businessKey; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "自定义分类") private String category; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskPageSearchDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskPageSearchDTO.java index 45a577224..46c7cb999 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskPageSearchDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskPageSearchDTO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.request.bpmn.task; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.BpmPageParam; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -37,7 +37,7 @@ public class BpmnTaskPageSearchDTO extends BpmPageParam { private String businessKey; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private List results; + private List results; @ApiModelProperty(value = "流程任务名", example = "芋道") private String name; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstancePageItemVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstancePageItemVO.java index 8ae3f4380..487c78bf3 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstancePageItemVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstancePageItemVO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.response.bpmn.process; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,7 +24,7 @@ public class BpmnProcessInstancePageItemVO { private String category; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "提交时间", required = true) private Date startTime; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java index ab4fb81b5..2322b949e 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/BpmnProcessInstanceVO.java @@ -1,7 +1,7 @@ package cn.axzo.workflow.common.model.response.bpmn.process; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -27,7 +27,7 @@ public class BpmnProcessInstanceVO { private String category; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "提交时间") private Date createAt; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceGroupVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceGroupVO.java index c639486d2..0c272a2e5 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceGroupVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceGroupVO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.response.bpmn.task; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,7 +24,7 @@ public class BpmnHistoricTaskInstanceGroupVO { private String processInstanceId; @ApiModelProperty(value = "审批任务节点的最终的状态") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "该审批节点下的所有任务") private List tasks; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceVO.java index 57f720f59..f4e6ea713 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnHistoricTaskInstanceVO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.response.bpmn.task; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -50,7 +50,7 @@ public class BpmnHistoricTaskInstanceVO { private String tenantId; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "任务审批意见") private String advice; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskDonePageItemVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskDonePageItemVO.java index eef6e5411..de5299ab6 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskDonePageItemVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskDonePageItemVO.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.common.model.response.bpmn.task; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,7 +22,7 @@ public class BpmnTaskDonePageItemVO extends BpmnTaskTodoPageItemVO { private Long durationInMillis; @ApiModelProperty(value = "审核状态(PROCESSING:审核中,APPROVED:已通过,REJECTED:已拒绝,CANCELLED:已取消)", example = "APPROVED") - private BpmProcessInstanceResultEnum result; + private BpmnProcessInstanceResultEnum result; @ApiModelProperty(value = "审批建议", required = true, example = "不请假了!") private String comment; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmErrorCode.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java similarity index 99% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmErrorCode.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java index ba466ba76..d9f33bc8e 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmErrorCode.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java @@ -11,7 +11,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum BpmErrorCode implements IProjectRespCode { +public enum BpmnErrorCode implements IProjectRespCode { // ========== category 01-001 ========== CATEGORY_VALUE_EXISTS("01001", "分类值【{}】已经存在"), CATEGORY_ID_NOT_EXISTS("01002", "指定分类【{}】不存在"), diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmProcessInstanceStatusEnum.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessInstanceStatusEnum.java similarity index 79% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmProcessInstanceStatusEnum.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessInstanceStatusEnum.java index 2cf497adf..0afd6d7d7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmProcessInstanceStatusEnum.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnProcessInstanceStatusEnum.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.core.common.enums; -public enum BpmProcessInstanceStatusEnum { +public enum BpmnProcessInstanceStatusEnum { RUNNING(1, "进行中"), FINISH(2, "已完成"); @@ -13,7 +13,7 @@ public enum BpmProcessInstanceStatusEnum { */ private final String desc; - BpmProcessInstanceStatusEnum(Integer status, String desc) { + BpmnProcessInstanceStatusEnum(Integer status, String desc) { this.status = status; this.desc = desc; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java index 2d15ceccd..77c365b3b 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java @@ -1,7 +1,7 @@ package cn.axzo.workflow.core.common.utils; -import cn.axzo.workflow.common.enums.BpmFlowNodeType; import cn.axzo.workflow.common.enums.BpmnFlowNodeMode; +import cn.axzo.workflow.common.enums.BpmnFlowNodeType; import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode; import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; @@ -35,13 +35,13 @@ import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; -import static cn.axzo.workflow.common.constant.BpmConstants.AND_SIGN_EXPRESSION; -import static cn.axzo.workflow.common.constant.BpmConstants.BPM_ALLOW_SKIP_USER_TASK; -import static cn.axzo.workflow.common.constant.BpmConstants.END_EVENT_ID; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; -import static cn.axzo.workflow.common.constant.BpmConstants.OR_SIGN_EXPRESSION; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_META_DATA_FORMAT_ERROR; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_UNKNOW_NODE_TYPE; +import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION; +import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK; +import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; +import static cn.axzo.workflow.common.constant.BpmnConstants.OR_SIGN_EXPRESSION; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CONVERTOR_META_DATA_FORMAT_ERROR; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CONVERTOR_UNKNOW_NODE_TYPE; import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_END; import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_START; @@ -60,7 +60,7 @@ public class BpmTransformUtil { process.setId(model.getKey()); process.setName(model.getName()); - if (BpmFlowNodeType.NODE_STARTER.equals(bpmnJson.getType())) { + if (BpmnFlowNodeType.NODE_STARTER.equals(bpmnJson.getType())) { process.addFlowElement(createStartEvent(bpmnJson.getId(), Objects.nonNull(bpmnJson.getProperty()) ? bpmnJson.getProperty().getFormKey() : "")); } @@ -114,7 +114,7 @@ public class BpmTransformUtil { if (StringUtils.isNotBlank(parentId)) { BpmnJsonNode parentNode = childNodeMap.get(parentId); if (parentNode != null) { - if (BpmFlowNodeType.NODE_CONDITION.equals(parentNode.getType())) { + if (BpmnFlowNodeType.NODE_CONDITION.equals(parentNode.getType())) { sequenceFlowId = parentNode.getId(); flow.setName(parentNode.getName()); if (!ObjectUtils.isEmpty(parentNode.getProperty()) && !Boolean.TRUE.equals(parentNode.getProperty().getDefaultBranch())) { @@ -162,9 +162,9 @@ public class BpmTransformUtil { public static String create(String fromId, BpmnJsonNode flowNode, Process process, BpmnModel bpmnModel, List sequenceFlows, Map childNodeMap) throws InvocationTargetException, IllegalAccessException { String nodeType = flowNode.getType().getType(); - if (BpmFlowNodeType.NODE_EXCLUSIVE_GATEWAY.isEqual(nodeType)) { + if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.isEqual(nodeType)) { return createExclusiveGatewayBuilder(fromId, flowNode, process, bpmnModel, sequenceFlows, childNodeMap); - } else if (BpmFlowNodeType.NODE_TASK.isEqual(nodeType)) { + } else if (BpmnFlowNodeType.NODE_TASK.isEqual(nodeType)) { childNodeMap.put(flowNode.getId(), flowNode); Map incoming = flowNode.getIncoming(); incoming.put("incoming", Collections.singletonList(fromId)); @@ -176,7 +176,7 @@ public class BpmTransformUtil { } else { return id; } - } else if (BpmFlowNodeType.NODE_STARTER.isEqual(nodeType)) { + } else if (BpmnFlowNodeType.NODE_STARTER.isEqual(nodeType)) { childNodeMap.put(flowNode.getId(), flowNode); Map incoming = flowNode.getIncoming(); incoming.put("incoming", Collections.singletonList(fromId)); @@ -277,7 +277,7 @@ public class BpmTransformUtil { if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) { String parentId = childNode.getParentId(); BpmnJsonNode parentChildNode = childNodeMap.get(parentId); - if (BpmFlowNodeType.NODE_EXCLUSIVE_GATEWAY.equals(parentChildNode.getType())) { + if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.equals(parentChildNode.getType())) { String endExId = parentChildNode.getId() + "end"; process.addFlowElement(createExclusiveGateWayEnd(endExId)); if (incoming == null || incoming.isEmpty()) { diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmCollectionUtils.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnCollectionUtils.java similarity index 95% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmCollectionUtils.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnCollectionUtils.java index 97e8152c8..a49d56ff3 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmCollectionUtils.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnCollectionUtils.java @@ -4,14 +4,24 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.ImmutableMap; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; -public class BpmCollectionUtils { +public class BpmnCollectionUtils { public static boolean containsAny(Object source, Object... targets) { return Arrays.asList(targets).contains(source); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java index 0647fde4d..2c92ab533 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnJsonConverterUtil.java @@ -44,12 +44,12 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; -import static cn.axzo.workflow.common.constant.BpmConstants.END_EVENT_ID; -import static cn.axzo.workflow.common.constant.BpmConstants.FLOW_NODE_JSON; -import static cn.axzo.workflow.common.constant.BpmConstants.SEQUENCE_FLOW_ID; -import static cn.axzo.workflow.common.constant.BpmConstants.START_EVENT_ID; -import static cn.axzo.workflow.common.enums.BpmFlowNodeType.NODE_EMPTY; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_COMMON_ERROR; +import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON; +import static cn.axzo.workflow.common.constant.BpmnConstants.SEQUENCE_FLOW_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.START_EVENT_ID; +import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CONVERTOR_COMMON_ERROR; /** * BPMN json 格式转换工具 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmMyBatisUtils.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMyBatisUtils.java similarity index 95% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmMyBatisUtils.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMyBatisUtils.java index d9c9595c8..0b3747726 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmMyBatisUtils.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnMyBatisUtils.java @@ -15,17 +15,17 @@ import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -public class BpmMyBatisUtils { +public class BpmnMyBatisUtils { private static final String MYSQL_ESCAPE_CHARACTER = "`"; - public BpmMyBatisUtils() { + public BpmnMyBatisUtils() { } public static Page buildPage(BpmPageParam pageParam) { return buildPage(pageParam, (Collection)null); } - public static Page buildPage(BpmPageParam pageParam, Collection sortingFields) { + public static Page buildPage(BpmPageParam pageParam, Collection sortingFields) { Page page = new Page((long)pageParam.getPageNo(), (long)pageParam.getPageSize()); if (!CollectionUtil.isEmpty(sortingFields)) { page.addOrder((List)sortingFields.stream().map((sortingField) -> { diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmSortingField.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnSortingField.java similarity index 68% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmSortingField.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnSortingField.java index e7014ecad..d18b77753 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmSortingField.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmnSortingField.java @@ -2,16 +2,16 @@ package cn.axzo.workflow.core.common.utils; import java.io.Serializable; -public class BpmSortingField implements Serializable { +public class BpmnSortingField implements Serializable { public static final String ORDER_ASC = "asc"; public static final String ORDER_DESC = "desc"; private String field; private String order; - public BpmSortingField() { + public BpmnSortingField() { } - public BpmSortingField(String field, String order) { + public BpmnSortingField(String field, String order) { this.field = field; this.order = order; } @@ -20,7 +20,7 @@ public class BpmSortingField implements Serializable { return this.field; } - public BpmSortingField setField(String field) { + public BpmnSortingField setField(String field) { this.field = field; return this; } @@ -29,7 +29,7 @@ public class BpmSortingField implements Serializable { return this.order; } - public BpmSortingField setOrder(String order) { + public BpmnSortingField setOrder(String order) { this.order = order; return this; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/AbstractBpmnJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/AbstractBpmnJsonConverter.java index a86a560b2..769aadade 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/AbstractBpmnJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/AbstractBpmnJsonConverter.java @@ -7,7 +7,7 @@ import org.flowable.bpmn.model.ExtensionAttribute; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; -import static cn.axzo.workflow.common.constant.BpmConstants.FLOW_NODE_JSON; +import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON; /** * TODO diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java index 7612c3f4f..f8241eb6c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/EndEventJsonConverter.java @@ -4,7 +4,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode; import org.flowable.bpmn.model.EndEvent; import org.flowable.bpmn.model.Process; -import static cn.axzo.workflow.common.constant.BpmConstants.END_EVENT_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID; /** * 结束节点 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/NotSupportConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/NotSupportConverter.java index 88423a964..82b45fd07 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/NotSupportConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/NotSupportConverter.java @@ -5,7 +5,7 @@ import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_NODE_TYPE_NOT_SUPPORT; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CONVERTOR_NODE_TYPE_NOT_SUPPORT; /** * 默认的不支持的节点转换器 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/SequenceFlowJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/SequenceFlowJsonConverter.java index 94a67a4fd..500258a96 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/SequenceFlowJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/SequenceFlowJsonConverter.java @@ -6,7 +6,7 @@ import org.flowable.bpmn.model.SequenceFlow; import java.util.List; -import static cn.axzo.workflow.common.constant.BpmConstants.SEQUENCE_FLOW_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.SEQUENCE_FLOW_ID; import static cn.axzo.workflow.core.common.utils.BpmnJsonConverterUtil.id; /** diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java index e2b2c9249..643959f0f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/StartEventJsonConverter.java @@ -5,7 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.StartEvent; -import static cn.axzo.workflow.common.constant.BpmConstants.START_EVENT_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.START_EVENT_ID; /** * 开始节点 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/UserTaskJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/UserTaskJsonConverter.java index b4b43288e..3ee8a655a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/UserTaskJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/UserTaskJsonConverter.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import static cn.axzo.workflow.common.enums.BpmFlowNodeType.NODE_STARTER; +import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; /** diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskCalculateDTO.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskCalculateDTO.java similarity index 96% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskCalculateDTO.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskCalculateDTO.java index a4bb8b7a6..3e607c354 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskCalculateDTO.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskCalculateDTO.java @@ -5,7 +5,7 @@ import lombok.Data; import java.util.Map; @Data -public class BpmTaskCalculateDTO { +public class BpmnTaskCalculateDTO { /** * 任务 ID, 工作流实例运行过程中产生的任务编号,用于对指定任务通过或拒绝 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskDelegate.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskDelegate.java similarity index 74% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskDelegate.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskDelegate.java index 81517feaf..82692fd92 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmTaskDelegate.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/deletage/BpmnTaskDelegate.java @@ -5,6 +5,6 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import java.util.List; -public interface BpmTaskDelegate { - List calculateAssignerAtExecution(BpmTaskCalculateDTO delegateTask); +public interface BpmnTaskDelegate { + List calculateAssignerAtExecution(BpmnTaskCalculateDTO delegateTask); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityEventListener.java index ecab96fcc..5dafe6c1e 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityEventListener.java @@ -1,7 +1,7 @@ package cn.axzo.workflow.core.engine.listener; import cn.axzo.framework.jackson.utility.JSON; -import cn.axzo.workflow.core.listener.BpmActivityEventListener; +import cn.axzo.workflow.core.listener.BpmnActivityEventListener; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.AbstractFlowableEventListener; @@ -30,7 +30,7 @@ import static org.flowable.common.engine.api.delegate.event.FlowableEngineEventT public class EngineActivityEventListener extends AbstractFlowableEventListener { @Resource - ObjectProvider> activityListeners; + ObjectProvider> activityListeners; @Override public Collection getTypes() { @@ -49,8 +49,8 @@ public class EngineActivityEventListener extends AbstractFlowableEventListener { return false; } - private List getOrderedListeners() { - List orderListeners = new ArrayList<>(); + private List getOrderedListeners() { + List orderListeners = new ArrayList<>(); activityListeners.ifAvailable(orderListeners::addAll); if (log.isDebugEnabled()) { log.debug("Order Lists: {}", JSON.toJSONString(orderListeners)); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java index beccd2169..eee4a7e7e 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java @@ -1,9 +1,9 @@ package cn.axzo.workflow.core.engine.listener; -import cn.axzo.workflow.common.constant.BpmConstants; +import cn.axzo.workflow.common.constant.BpmnConstants; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import cn.axzo.workflow.core.deletage.BpmTaskCalculateDTO; -import cn.axzo.workflow.core.deletage.BpmTaskDelegate; +import cn.axzo.workflow.core.deletage.BpmnTaskCalculateDTO; +import cn.axzo.workflow.core.deletage.BpmnTaskDelegate; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.Process; @@ -20,9 +20,9 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; -import static cn.axzo.workflow.common.constant.BpmConstants.BPM_ALLOW_SKIP_USER_TASK; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; /** @@ -36,7 +36,7 @@ public class EngineExecutionStartListener implements ExecutionListener { @Resource private RepositoryService repositoryService; @Resource - private ObjectProvider bpmTaskDelegate; + private ObjectProvider bpmTaskDelegate; @Override public void notify(DelegateExecution execution) { @@ -48,7 +48,7 @@ public class EngineExecutionStartListener implements ExecutionListener { Process mainProcess = repositoryService.getBpmnModel(execution.getProcessDefinitionId()).getMainProcess(); UserTask userTask = (UserTask) mainProcess.getFlowElement(currentActivityId); - BpmTaskCalculateDTO calculateDTO = new BpmTaskCalculateDTO(); + BpmnTaskCalculateDTO calculateDTO = new BpmnTaskCalculateDTO(); calculateDTO.setTaskId(userTask.getId()); calculateDTO.setCategory(userTask.getCategory()); calculateDTO.setProcessDefinitionId(execution.getProcessDefinitionId()); @@ -69,7 +69,7 @@ public class EngineExecutionStartListener implements ExecutionListener { // 审批人为空并且当前节点设置了自动跳过条件 } else if (StringUtils.hasLength(userTask.getSkipExpression())) { // 自动通过的默认引擎参数必须设置为 true - execution.setTransientVariable(BpmConstants.FLOWABLE_SKIP_EXPRESSION_ENABLE, true); + execution.setTransientVariable(BpmnConstants.FLOWABLE_SKIP_EXPRESSION_ENABLE, true); // 设置当前 UserTask 使用的 skip 表达式 execution.setTransientVariable(BPM_ALLOW_SKIP_USER_TASK, true); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineProcessInstanceEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineProcessInstanceEventListener.java index a36dc68de..2d7c62a48 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineProcessInstanceEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineProcessInstanceEventListener.java @@ -1,8 +1,8 @@ package cn.axzo.workflow.core.engine.listener; import cn.axzo.framework.jackson.utility.JSON; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; -import cn.axzo.workflow.core.listener.BpmProcessEventListener; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; +import cn.axzo.workflow.core.listener.BpmnProcessEventListener; import com.google.common.collect.ImmutableSet; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; @@ -22,11 +22,11 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_DELETE_PROCESS_FLAG; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_PROCESS_TYPE_CANCEL; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_PROCESS_TYPE_REJECT; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.CANCELLED; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.REJECTED; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_CANCEL; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_REJECT; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.CANCELLED; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED; /** * 引擎全局的流程实例事件监听 @@ -35,7 +35,7 @@ import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.REJECTE @Component public class EngineProcessInstanceEventListener extends AbstractFlowableEngineEventListener { @Resource - ObjectProvider> processEventListeners; + ObjectProvider> processEventListeners; @Resource @Lazy @@ -60,14 +60,14 @@ public class EngineProcessInstanceEventListener extends AbstractFlowableEngineEv @Override protected void processStarted(FlowableProcessStartedEvent event) { runtimeService.updateBusinessStatus(((FlowableProcessStartedEventImpl) event).getProcessInstanceId(), - BpmProcessInstanceResultEnum.PROCESSING.getStatus()); + BpmnProcessInstanceResultEnum.PROCESSING.getStatus()); getOrderedListeners().forEach(i -> i.onStarted(event)); } @Override protected void processCompleted(FlowableEngineEntityEvent event) { runtimeService.updateBusinessStatus(event.getProcessInstanceId(), - BpmProcessInstanceResultEnum.APPROVED.getStatus()); + BpmnProcessInstanceResultEnum.APPROVED.getStatus()); getOrderedListeners().forEach(i -> i.onCompleted(event)); } @@ -75,7 +75,7 @@ public class EngineProcessInstanceEventListener extends AbstractFlowableEngineEv protected void processCancelled(FlowableCancelledEvent event) { String deleteProcessType = String.valueOf(runtimeService.getVariable(event.getExecutionId(), INTERNAL_DELETE_PROCESS_FLAG)); - BpmProcessInstanceResultEnum resultEnum; + BpmnProcessInstanceResultEnum resultEnum; switch (deleteProcessType) { case INTERNAL_PROCESS_TYPE_CANCEL: resultEnum = CANCELLED; @@ -98,8 +98,8 @@ public class EngineProcessInstanceEventListener extends AbstractFlowableEngineEv }); } - private List getOrderedListeners() { - List orderListeners = new ArrayList<>(); + private List getOrderedListeners() { + List orderListeners = new ArrayList<>(); processEventListeners.ifAvailable(orderListeners::addAll); if (log.isDebugEnabled()) { log.debug("Order Lists: {}", JSON.toJSONString(orderListeners)); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineTaskEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineTaskEventListener.java index 4c43834d1..e1607e9a7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineTaskEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineTaskEventListener.java @@ -1,8 +1,8 @@ package cn.axzo.workflow.core.engine.listener; import cn.axzo.framework.jackson.utility.JSON; -import cn.axzo.workflow.core.deletage.BpmTaskDelegate; -import cn.axzo.workflow.core.listener.BpmTaskEventListener; +import cn.axzo.workflow.core.deletage.BpmnTaskDelegate; +import cn.axzo.workflow.core.listener.BpmnTaskEventListener; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask; @@ -24,11 +24,11 @@ import java.util.List; public class EngineTaskEventListener implements TaskListener { @Resource - ObjectProvider> taskEventListeners; + ObjectProvider> taskEventListeners; @Resource @Lazy - private BpmTaskDelegate taskDelegate; + private BpmnTaskDelegate taskDelegate; @Override public void notify(DelegateTask delegateTask) { @@ -56,8 +56,8 @@ public class EngineTaskEventListener implements TaskListener { } - private List getOrderedListeners() { - List orderListeners = new ArrayList<>(); + private List getOrderedListeners() { + List orderListeners = new ArrayList<>(); taskEventListeners.ifAvailable(orderListeners::addAll); if (log.isDebugEnabled()) { log.debug("Order Lists: {}", JSON.toJSONString(orderListeners)); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmActivityEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnActivityEventListener.java similarity index 96% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmActivityEventListener.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnActivityEventListener.java index c6b99711b..7db057c1e 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmActivityEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnActivityEventListener.java @@ -14,7 +14,7 @@ import org.springframework.core.Ordered; * @author wangli * @since 2023/7/24 17:27 */ -public interface BpmActivityEventListener extends Ordered { +public interface BpmnActivityEventListener extends Ordered { /** * 由于Flowable BPMN Engine 没有直接对 UserTask 直接做相关事件, diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmProcessEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnProcessEventListener.java similarity index 95% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmProcessEventListener.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnProcessEventListener.java index 3143aca3f..c7e932ebb 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmProcessEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnProcessEventListener.java @@ -10,7 +10,7 @@ import org.springframework.core.Ordered; *

* 微服版本使用, 统一在 Server module 中进行实现扩展, 不在该 module 中实现 */ -public interface BpmProcessEventListener extends Ordered { +public interface BpmnProcessEventListener extends Ordered { /** * 流程实例创建成功后回调 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnTaskEventListener.java similarity index 94% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnTaskEventListener.java index 47fd3cbf2..48ee06e08 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmnTaskEventListener.java @@ -10,7 +10,7 @@ import org.springframework.core.Ordered; * * @author shao_hua */ -public interface BpmTaskEventListener extends Ordered { +public interface BpmnTaskEventListener extends Ordered { /** * 用户任务已创建,未指派审核人 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BaseMapperX.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BaseMapperX.java index 73002949a..f815a31b9 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BaseMapperX.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BaseMapperX.java @@ -2,7 +2,7 @@ package cn.axzo.workflow.core.repository.mapper; import cn.axzo.workflow.common.model.request.BpmPageParam; import cn.axzo.workflow.common.model.response.BpmPageResult; -import cn.axzo.workflow.core.common.utils.BpmMyBatisUtils; +import cn.axzo.workflow.core.common.utils.BpmnMyBatisUtils; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -16,7 +16,7 @@ import java.util.List; public interface BaseMapperX extends BaseMapper { default BpmPageResult selectPage(BpmPageParam pageParam, @Param("ew") Wrapper queryWrapper) { - IPage mpPage = BpmMyBatisUtils.buildPage(pageParam); + IPage mpPage = BpmnMyBatisUtils.buildPage(pageParam); this.selectPage(mpPage, queryWrapper); return new BpmPageResult(mpPage.getRecords(), mpPage.getTotal()); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmLambdaQueryWrapperX.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmLambdaQueryWrapperX.java deleted file mode 100644 index 68f480c2b..000000000 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmLambdaQueryWrapperX.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.axzo.workflow.core.repository.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import org.springframework.util.StringUtils; - -import java.util.Collection; - -public class BpmLambdaQueryWrapperX extends LambdaQueryWrapper { - public BpmLambdaQueryWrapperX() { - } - - public BpmLambdaQueryWrapperX likeIfPresent(SFunction column, String val) { - return StringUtils.hasText(val) ? (BpmLambdaQueryWrapperX)super.like(column, val) : this; - } - - public BpmLambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { - return !CollectionUtils.isEmpty(values) ? (BpmLambdaQueryWrapperX)super.in(column, values) : this; - } - - public BpmLambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { - return !ArrayUtils.isEmpty(values) ? (BpmLambdaQueryWrapperX)super.in(column, values) : this; - } - - public BpmLambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.eq(column, val) : this; - } - - public BpmLambdaQueryWrapperX neIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.ne(column, val) : this; - } - - public BpmLambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.gt(column, val) : this; - } - - public BpmLambdaQueryWrapperX geIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.ge(column, val) : this; - } - - public BpmLambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.lt(column, val) : this; - } - - public BpmLambdaQueryWrapperX leIfPresent(SFunction column, Object val) { - return val != null ? (BpmLambdaQueryWrapperX)super.le(column, val) : this; - } - - public BpmLambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { - if (val1 != null && val2 != null) { - return (BpmLambdaQueryWrapperX)super.between(column, val1, val2); - } else if (val1 != null) { - return (BpmLambdaQueryWrapperX)this.ge(column, val1); - } else { - return val2 != null ? (BpmLambdaQueryWrapperX)this.le(column, val2) : this; - } - } - - public BpmLambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { - super.eq(condition, column, val); - return this; - } - - public BpmLambdaQueryWrapperX eq(SFunction column, Object val) { - super.eq(column, val); - return this; - } - - public BpmLambdaQueryWrapperX orderByDesc(SFunction column) { - super.orderByDesc(true, column); - return this; - } - - public BpmLambdaQueryWrapperX last(String lastSql) { - super.last(lastSql); - return this; - } - - public BpmLambdaQueryWrapperX in(SFunction column, Collection coll) { - super.in(column, coll); - return this; - } -} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmnLambdaQueryWrapperX.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmnLambdaQueryWrapperX.java new file mode 100644 index 000000000..f5af8fcfd --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/BpmnLambdaQueryWrapperX.java @@ -0,0 +1,85 @@ +package cn.axzo.workflow.core.repository.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +public class BpmnLambdaQueryWrapperX extends LambdaQueryWrapper { + public BpmnLambdaQueryWrapperX() { + } + + public BpmnLambdaQueryWrapperX likeIfPresent(SFunction column, String val) { + return StringUtils.hasText(val) ? (BpmnLambdaQueryWrapperX) super.like(column, val) : this; + } + + public BpmnLambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { + return !CollectionUtils.isEmpty(values) ? (BpmnLambdaQueryWrapperX) super.in(column, values) : this; + } + + public BpmnLambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { + return !ArrayUtils.isEmpty(values) ? (BpmnLambdaQueryWrapperX) super.in(column, values) : this; + } + + public BpmnLambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.eq(column, val) : this; + } + + public BpmnLambdaQueryWrapperX neIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.ne(column, val) : this; + } + + public BpmnLambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.gt(column, val) : this; + } + + public BpmnLambdaQueryWrapperX geIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.ge(column, val) : this; + } + + public BpmnLambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.lt(column, val) : this; + } + + public BpmnLambdaQueryWrapperX leIfPresent(SFunction column, Object val) { + return val != null ? (BpmnLambdaQueryWrapperX) super.le(column, val) : this; + } + + public BpmnLambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (BpmnLambdaQueryWrapperX) super.between(column, val1, val2); + } else if (val1 != null) { + return (BpmnLambdaQueryWrapperX) this.ge(column, val1); + } else { + return val2 != null ? (BpmnLambdaQueryWrapperX) this.le(column, val2) : this; + } + } + + public BpmnLambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + public BpmnLambdaQueryWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + public BpmnLambdaQueryWrapperX orderByDesc(SFunction column) { + super.orderByDesc(true, column); + return this; + } + + public BpmnLambdaQueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + public BpmnLambdaQueryWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskDonePageItemConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskDonePageItemConverter.java index 4d67f1926..e168afac1 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskDonePageItemConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskDonePageItemConverter.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.core.service.converter; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO; import org.flowable.engine.history.HistoricProcessInstance; @@ -9,7 +9,12 @@ import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import org.springframework.beans.BeanUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; import static cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter.DELETE_REASON_END; import static org.mapstruct.NullValueCheckStrategy.ALWAYS; @@ -59,7 +64,7 @@ public interface BpmnTaskDonePageItemConverter extends EntityConverter getProcessInstanceMap(Set ids) { - return BpmCollectionUtils.convertMap(getProcessInstances(ids), + return BpmnCollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); } @@ -386,7 +386,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic * @return 历史的流程实例列表 Map */ public Map getHistoricProcessInstanceMap(Set ids) { - return BpmCollectionUtils.convertMap(getHistoricProcessInstances(ids), + return BpmnCollectionUtils.convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessModelServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessModelServiceImpl.java index 83bd76525..119c59feb 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessModelServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessModelServiceImpl.java @@ -41,11 +41,11 @@ import java.util.Objects; import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_DESCRIPTION; import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE; import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.MODEL_ID_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.MODEL_KEY_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.MODEL_KEY_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.MODEL_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.PROCESS_DEFINITION_BPMN_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.MODEL_ID_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.MODEL_KEY_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.MODEL_KEY_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.MODEL_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_DEFINITION_BPMN_NOT_EXISTS; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.countSql; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.sqlConnectors; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java index ca3f7fbf7..ee6b0c23f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.core.service.impl; -import cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAssigneeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; @@ -65,27 +65,27 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import static cn.axzo.workflow.common.constant.BpmConstants.APPROVAL_ENDS_AUTOMATICALLY; -import static cn.axzo.workflow.common.constant.BpmConstants.COMMENT_TYPE_ADVICE; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_DELETE_PROCESS_FLAG; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_END_TENANT_ID; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_END_USER_ID; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_END_USER_NAME; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_PROCESS_TYPE_REJECT; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_SPECIFY_NEXT_APPROVER; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; -import static cn.axzo.workflow.common.constant.BpmConstants.MULTI_INSTANCE_LOOP_COUNTER; -import static cn.axzo.workflow.common.constant.BpmConstants.NUMBER_OF_INSTANCES; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.APPROVED; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.CANCELLED; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.PROCESSING; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.REJECTED; -import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.valueOfStatus; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.PROCESS_INSTANCE_ID_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.PROCESS_INSTANCE_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.TASK_COMPLETE_FAIL_NOT_EXISTS; -import static cn.axzo.workflow.core.common.utils.BpmCollectionUtils.convertSet; +import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVAL_ENDS_AUTOMATICALLY; +import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_TENANT_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_NAME; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_REJECT; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.MULTI_INSTANCE_LOOP_COUNTER; +import static cn.axzo.workflow.common.constant.BpmnConstants.NUMBER_OF_INSTANCES; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.CANCELLED; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.valueOfStatus; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_ID_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_COMPLETE_FAIL_NOT_EXISTS; +import static cn.axzo.workflow.core.common.utils.BpmnCollectionUtils.convertSet; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.countSql; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.sqlConnectors; import static org.flowable.engine.impl.persistence.entity.CommentEntity.TYPE_COMMENT; @@ -396,11 +396,13 @@ public class BpmnTaskServiceImpl implements BpmnTaskService { .stream().collect(Collectors.groupingBy(Comment::getTaskId)); Map variableInstanceMap = - historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).list().stream().collect(Collectors.toMap(HistoricVariableInstance::getVariableName, Function.identity(), (s, t) -> s)); + historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).list() + .stream().collect(Collectors.toMap(HistoricVariableInstance::getVariableName, + Function.identity(), (s, t) -> s)); Set taskDefinitionKeys = new HashSet<>(); int count = 0; - BpmProcessInstanceResultEnum finalBusinessStatus = valueOfStatus(instance.getBusinessStatus()); + BpmnProcessInstanceResultEnum finalBusinessStatus = valueOfStatus(instance.getBusinessStatus()); for (BpmnHistoricTaskInstanceVO vo : vos) { if (count == 0 || taskDefinitionKeys.contains(vo.getTaskDefinitionKey())) { vo.setResult(finalBusinessStatus); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java index ed4a96949..aa24ff92c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.core.service.impl; -import cn.axzo.workflow.common.constant.BpmConstants; +import cn.axzo.workflow.common.constant.BpmnConstants; import cn.axzo.workflow.common.model.request.category.CategoryCreateDTO; import cn.axzo.workflow.common.model.request.category.CategorySearchDTO; import cn.axzo.workflow.common.model.request.category.CategoryUpdateDTO; @@ -25,14 +25,14 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CATEGORY_ID_NOT_EXISTS; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CATEGORY_VALUE_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CATEGORY_ID_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.CATEGORY_VALUE_EXISTS; @Service @RequiredArgsConstructor @Slf4j public class CategoryServiceImpl extends ServiceImpl implements CategoryService - , BpmConstants { + , BpmnConstants { @Resource private ExtAxDictMapper bpmDictDataMapper; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormDefinitionServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormDefinitionServiceImpl.java index 298e99564..4d08a7273 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormDefinitionServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormDefinitionServiceImpl.java @@ -18,7 +18,10 @@ import javax.annotation.Nullable; import javax.annotation.Resource; import java.util.Objects; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.*; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.FORM_DEFINITION_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.FORM_DEFINITION_PARSER_ERROR; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.FORM_MODEL_ID_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.FORM_MODEL_NOT_EXISTS; /** * 表单定义 Service 实现 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormInstanceServiceImpl.java index 1f7794cb2..62d6e803c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormInstanceServiceImpl.java @@ -17,8 +17,8 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.Objects; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.TASK_COMPLETE_FAIL_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_COMPLETE_FAIL_NOT_EXISTS; /** * 表单实例 Service 实现 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormModelServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormModelServiceImpl.java index 643e678ed..8e039162a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormModelServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormModelServiceImpl.java @@ -28,10 +28,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import static cn.axzo.workflow.common.constant.BpmConstants.FORM_FILE_SUFFIX; +import static cn.axzo.workflow.common.constant.BpmnConstants.FORM_FILE_SUFFIX; import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE; import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_FORM; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.FORM_MODEL_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.FORM_MODEL_NOT_EXISTS; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.countSql; import static cn.axzo.workflow.core.common.utils.BpmnNativeQueryUtil.sqlConnectors; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java index fd9a40cb0..04f3fa8e7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java @@ -11,7 +11,7 @@ import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import java.io.Serializable; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.ENGINE_EXECUTION_LOST_ID_ERROR; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.ENGINE_EXECUTION_LOST_ID_ERROR; /** * 流程定义内部的表达式评估命令器 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/FlowNodeForecastService.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/FlowNodeForecastService.java index 48001a7b0..9039081fc 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/FlowNodeForecastService.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/FlowNodeForecastService.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.PROCESS_INSTANCE_NOT_EXISTS; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_NOT_EXISTS; /** * 审批实例的运行节点预测/推断 diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java index 43f539385..537b8ded3 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java @@ -1,8 +1,8 @@ package cn.axzo.workflow.server.controller.delegate; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import cn.axzo.workflow.core.deletage.BpmTaskCalculateDTO; -import cn.axzo.workflow.core.deletage.BpmTaskDelegate; +import cn.axzo.workflow.core.deletage.BpmnTaskCalculateDTO; +import cn.axzo.workflow.core.deletage.BpmnTaskDelegate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -13,15 +13,15 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_SPECIFY_NEXT_APPROVER; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NEXT_APPROVER; @Service -public class BpmnDefaultTaskDelegateImpl implements BpmTaskDelegate { +public class BpmnDefaultTaskDelegateImpl implements BpmnTaskDelegate { private static final Logger log = LoggerFactory.getLogger(BpmnDefaultTaskDelegateImpl.class); @Override - public List calculateAssignerAtExecution(BpmTaskCalculateDTO delegateTask) { + public List calculateAssignerAtExecution(BpmnTaskCalculateDTO delegateTask) { // 这里的上层应该需要使用 Chain, 类似 Servlet 中的 Filter 模式,有一个有限策略, 例如此处的设置审批人, 第一个策略是优先获取上级直接指定 // 第二个策略是根据配置规则设置审批人. // 而整体为了保证维护性和扩展性,需要内置整个链路有限策略,只要有一个策略已经有人了,则不再执行后续逻辑. diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmActivityEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmActivityEventListener.java index a9b256ffd..7cbb20828 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmActivityEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmActivityEventListener.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.server.controller.listener; -import cn.axzo.workflow.core.listener.BpmActivityEventListener; +import cn.axzo.workflow.core.listener.BpmnActivityEventListener; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEvent; import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl; @@ -15,7 +15,7 @@ import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl; */ @Slf4j //@Component -public class CustomBpmActivityEventListener implements BpmActivityEventListener { +public class CustomBpmActivityEventListener implements BpmnActivityEventListener { @Override public void onEvent(FlowableEvent event) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmProcessEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmnProcessEventListener.java similarity index 92% rename from workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmProcessEventListener.java rename to workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmnProcessEventListener.java index 370847a8b..e1ac9d74c 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmProcessEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/CustomBpmnProcessEventListener.java @@ -1,6 +1,6 @@ package cn.axzo.workflow.server.controller.listener.process; -import cn.axzo.workflow.core.listener.BpmProcessEventListener; +import cn.axzo.workflow.core.listener.BpmnProcessEventListener; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; @@ -17,7 +17,7 @@ import org.flowable.engine.delegate.event.FlowableProcessStartedEvent; */ @Slf4j //@Component -public class CustomBpmProcessEventListener implements BpmProcessEventListener { +public class CustomBpmnProcessEventListener implements BpmnProcessEventListener { @Override public void onCreated(FlowableEngineEntityEvent event) { log.info("Process onCreated: ClassName: {}, event: {}", event.getClass().getName(), JSON.toJSONString(event)); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmProcessEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java similarity index 98% rename from workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmProcessEventListener.java rename to workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java index 885b31cbb..3d97342e0 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmProcessEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java @@ -5,7 +5,7 @@ import cn.axzo.framework.rocketmq.EventProducer; import cn.axzo.workflow.common.enums.ProcessInstanceEventEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO; -import cn.axzo.workflow.core.listener.BpmProcessEventListener; +import cn.axzo.workflow.core.listener.BpmnProcessEventListener; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_INITIATOR; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_CANCELLED; import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_COMPLETED; import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_CREATED; @@ -35,7 +35,7 @@ import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INS */ @Slf4j @Component -public class RocketMqBpmProcessEventListener implements BpmProcessEventListener { +public class RocketMqBpmnProcessEventListener implements BpmnProcessEventListener { @Resource private EventProducer eventProducer; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmnTaskEventListener.java similarity index 93% rename from workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmTaskEventListener.java rename to workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmnTaskEventListener.java index 0a26a38d7..502a5336d 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/RocketMqBpmnTaskEventListener.java @@ -5,7 +5,7 @@ import cn.axzo.framework.rocketmq.EventProducer; import cn.axzo.workflow.common.enums.ProcessTaskEventEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.response.mq.ProcessTaskDTO; -import cn.axzo.workflow.core.listener.BpmTaskEventListener; +import cn.axzo.workflow.core.listener.BpmnTaskEventListener; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; @@ -16,8 +16,8 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_INITIATOR; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_ASSIGNED; import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_COMPLETED; import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_CREATED; @@ -32,7 +32,7 @@ import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_DE */ @Slf4j @Component -public class RocketMqBpmTaskEventListener implements BpmTaskEventListener { +public class RocketMqBpmnTaskEventListener implements BpmnTaskEventListener { @Resource private EventProducer eventProducer; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmTaskTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmnTaskTaskEventListener.java similarity index 78% rename from workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmTaskTaskEventListener.java rename to workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmnTaskTaskEventListener.java index 9af999423..aca61b42e 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmTaskTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/SnapshotBpmnTaskTaskEventListener.java @@ -1,7 +1,7 @@ package cn.axzo.workflow.server.controller.listener.task; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import cn.axzo.workflow.core.listener.BpmTaskEventListener; +import cn.axzo.workflow.core.listener.BpmnTaskEventListener; import lombok.extern.slf4j.Slf4j; import org.flowable.task.service.delegate.DelegateTask; import org.springframework.stereotype.Component; @@ -10,8 +10,8 @@ import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Objects; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; /** * 任务节点关联的处理人快照保持 @@ -23,7 +23,7 @@ import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATI */ @Slf4j @Component -public class SnapshotBpmTaskTaskEventListener implements BpmTaskEventListener { +public class SnapshotBpmnTaskTaskEventListener implements BpmnTaskEventListener { @Override public void onAssigned(DelegateTask delegateTask) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/StartNodeAutoCompleteEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/StartNodeAutoCompleteEventListener.java index 0d8b3ee6f..5024ea3aa 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/StartNodeAutoCompleteEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/StartNodeAutoCompleteEventListener.java @@ -1,7 +1,7 @@ package cn.axzo.workflow.server.controller.listener.task; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import cn.axzo.workflow.core.listener.BpmTaskEventListener; +import cn.axzo.workflow.core.listener.BpmnTaskEventListener; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.RuntimeService; @@ -12,9 +12,9 @@ import org.springframework.util.StringUtils; import java.util.Objects; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_INITIATOR; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; -import static cn.axzo.workflow.common.enums.BpmFlowNodeType.NODE_STARTER; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; /** * 仿钉钉版本的 发起人 节点自动通过处理 @@ -25,7 +25,7 @@ import static cn.axzo.workflow.common.enums.BpmFlowNodeType.NODE_STARTER; @Slf4j @Component @AllArgsConstructor -public class StartNodeAutoCompleteEventListener implements BpmTaskEventListener { +public class StartNodeAutoCompleteEventListener implements BpmnTaskEventListener { private final TaskService taskService; private final RuntimeService runtimeService; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java index 8fba07dff..1a6006db2 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java @@ -36,7 +36,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; -import static cn.axzo.workflow.core.common.enums.BpmErrorCode.PROCESS_OPERATION_PARAM_VALID_ERROR; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_OPERATION_PARAM_VALID_ERROR; import static cn.azxo.framework.common.model.CommonResponse.success; @Slf4j diff --git a/workflow-engine-server/src/main/resources/工作流引擎事件触发时机说明.md b/workflow-engine-server/src/main/resources/工作流引擎事件触发时机说明.md deleted file mode 100644 index e69de29bb..000000000