From bd572ed0543ec3d732287581dd3460c833be1059 Mon Sep 17 00:00:00 2001
From: sunquan <287962685@qq.com>
Date: Wed, 22 Jul 2026 14:05:41 +0800
Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=8A=A0common-f?=
=?UTF-8?q?low=20=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
application-tenant/tenant-admin/pom.xml | 5 +
common/common-flow/pom.xml | 44 +
.../common/flow/Plugin/AbstractAssigneePlugin.java | 11 +
.../common/flow/Plugin/DemoFlowNodePlugin.java | 10 +
.../common/flow/Plugin/FlowNodeExpressionUtil.java | 49 +
.../common/flow/advice/FlowExceptionHandler.java | 58 +
.../flow/base/service/BaseFlowOnlineService.java | 26 +
.../common/flow/base/service/BaseFlowService.java | 273 +++
.../java/apelet/common/flow/cmd/ExpressionCmd.java | 34 +
.../common/flow/cmd/RestartProcessInstanceCmd.java | 162 ++
.../flow/config/CustomEngineConfigurator.java | 48 +
.../apelet/common/flow/config/FlowAutoConfig.java | 13 +
.../apelet/common/flow/config/FlowProperties.java | 20 +
.../common/flow/constant/FlowApprovalType.java | 97 +
.../apelet/common/flow/constant/FlowBackType.java | 25 +
.../flow/constant/FlowBuiltinApprovalStatus.java | 33 +
.../apelet/common/flow/constant/FlowConstant.java | 266 +++
.../common/flow/constant/FlowTaskStatus.java | 49 +
.../apelet/common/flow/constant/FlowTaskType.java | 25 +
.../flow/controller/FlowCategoryController.java | 229 ++
.../flow/controller/FlowEntryController.java | 469 ++++
.../controller/FlowEntryVariableController.java | 156 ++
.../flow/controller/FlowMessageController.java | 113 +
.../flow/controller/FlowNodeTasksController.java | 56 +
.../flow/controller/FlowOperationController.java | 1225 ++++++++++
.../apelet/common/flow/dao/FlowCategoryMapper.java | 26 +
.../apelet/common/flow/dao/FlowEntryMapper.java | 26 +
.../common/flow/dao/FlowEntryPublishMapper.java | 13 +
.../flow/dao/FlowEntryPublishVariableMapper.java | 22 +
.../common/flow/dao/FlowEntryVariableMapper.java | 27 +
.../dao/FlowMessageCandidateIdentityMapper.java | 21 +
.../dao/FlowMessageIdentityOperationMapper.java | 21 +
.../apelet/common/flow/dao/FlowMessageMapper.java | 86 +
.../flow/dao/FlowMultiInstanceTransMapper.java | 13 +
.../common/flow/dao/FlowNodeTasksMapper.java | 9 +
.../common/flow/dao/FlowTaskCommentMapper.java | 13 +
.../apelet/common/flow/dao/FlowTaskExtMapper.java | 22 +
.../common/flow/dao/FlowTaskTimeoutJobMapper.java | 14 +
.../common/flow/dao/FlowTransProducerMapper.java | 13 +
.../common/flow/dao/FlowVariableLogMapper.java | 14 +
.../common/flow/dao/FlowWorkOrderExtMapper.java | 14 +
.../common/flow/dao/FlowWorkOrderMapper.java | 49 +
.../common/flow/dao/mapper/FlowCategoryMapper.xml | 56 +
.../common/flow/dao/mapper/FlowEntryMapper.xml | 95 +
.../flow/dao/mapper/FlowEntryPublishMapper.xml | 18 +
.../dao/mapper/FlowEntryPublishVariableMapper.xml | 30 +
.../flow/dao/mapper/FlowEntryVariableMapper.xml | 41 +
.../mapper/FlowMessageCandidateIdentityMapper.xml | 16 +
.../mapper/FlowMessageIdentityOperationMapper.xml | 17 +
.../common/flow/dao/mapper/FlowMessageMapper.xml | 119 +
.../dao/mapper/FlowMultiInstanceTransMapper.xml | 17 +
.../flow/dao/mapper/FlowTaskCommentMapper.xml | 23 +
.../common/flow/dao/mapper/FlowTaskExtMapper.xml | 36 +
.../flow/dao/mapper/FlowTaskTimeoutJobMapper.xml | 19 +
.../flow/dao/mapper/FlowTransProducerMapper.xml | 23 +
.../flow/dao/mapper/FlowVariableLogMapper.xml | 13 +
.../flow/dao/mapper/FlowWorkOrderExtMapper.xml | 15 +
.../common/flow/dao/mapper/FlowWorkOrderMapper.xml | 82 +
.../apelet/common/flow/dto/FlowCategoryDto.java | 47 +
.../java/apelet/common/flow/dto/FlowEntryDto.java | 114 +
.../common/flow/dto/FlowEntryVariableDto.java | 82 +
.../apelet/common/flow/dto/FlowMessageDto.java | 51 +
.../apelet/common/flow/dto/FlowTaskCommentDto.java | 38 +
.../apelet/common/flow/dto/FlowWorkOrderDto.java | 39 +
.../flow/exception/FlowEmptyUserException.java | 35 +
.../flow/exception/FlowOperationException.java | 35 +
.../common/flow/listener/AutoSkipListener.java | 161 ++
.../common/flow/listener/AutoSkipTaskListener.java | 156 ++
.../flow/listener/DeptPostLeaderListener.java | 27 +
.../flow/listener/FlowEmptyUserHandleListener.java | 74 +
.../common/flow/listener/FlowFinishedListener.java | 70 +
.../flow/listener/FlowTaskNotifyListener.java | 80 +
.../flow/listener/FlowTaskRejectBackListener.java | 26 +
.../flow/listener/FlowTaskReviveListener.java | 55 +
.../flow/listener/FlowTaskTimeoutListener.java | 48 +
.../common/flow/listener/FlowUserTaskListener.java | 32 +
.../flow/listener/UpDeptPostLeaderListener.java | 27 +
.../UpdateLatestApprovalStatusListener.java | 44 +
.../apelet/common/flow/model/FlowCategory.java | 88 +
.../java/apelet/common/flow/model/FlowEntry.java | 192 ++
.../apelet/common/flow/model/FlowEntryPublish.java | 98 +
.../flow/model/FlowEntryPublishVariable.java | 71 +
.../common/flow/model/FlowEntryVariable.java | 88 +
.../java/apelet/common/flow/model/FlowMessage.java | 178 ++
.../flow/model/FlowMessageCandidateIdentity.java | 41 +
.../flow/model/FlowMessageIdentityOperation.java | 50 +
.../common/flow/model/FlowMultiInstanceTrans.java | 99 +
.../apelet/common/flow/model/FlowNodeTasks.java | 55 +
.../apelet/common/flow/model/FlowTaskComment.java | 161 ++
.../java/apelet/common/flow/model/FlowTaskExt.java | 88 +
.../common/flow/model/FlowTaskTimeoutJob.java | 97 +
.../common/flow/model/FlowTransConsumer.java | 33 +
.../common/flow/model/FlowTransProducer.java | 121 +
.../apelet/common/flow/model/FlowVariableLog.java | 61 +
.../apelet/common/flow/model/FlowWorkOrder.java | 172 ++
.../apelet/common/flow/model/FlowWorkOrderExt.java | 72 +
.../flow/model/constant/FlowBindFormType.java | 44 +
.../flow/model/constant/FlowEntryStatus.java | 44 +
.../model/constant/FlowMessageOperationType.java | 21 +
.../flow/model/constant/FlowMessageType.java | 26 +
.../model/constant/FlowTaskTimeoutJobStatus.java | 29 +
.../flow/model/constant/FlowVariableType.java | 44 +
.../apelet/common/flow/object/AnalyzedNode.java | 86 +
.../apelet/common/flow/object/FlowApiOption.java | 18 +
.../common/flow/object/FlowElementExtProperty.java | 18 +
.../common/flow/object/FlowEntryExtensionData.java | 37 +
.../apelet/common/flow/object/FlowRejectData.java | 28 +
.../flow/object/FlowTaskMultiSignAssign.java | 22 +
.../common/flow/object/FlowTaskOperation.java | 34 +
.../flow/object/FlowTaskPostCandidateGroup.java | 64 +
.../common/flow/object/FlowUserTaskExtData.java | 63 +
.../apelet/common/flow/service/FlowApiService.java | 637 +++++
.../common/flow/service/FlowCategoryService.java | 69 +
.../common/flow/service/FlowEntryService.java | 134 ++
.../flow/service/FlowEntryVariableService.java | 68 +
.../common/flow/service/FlowMessageService.java | 113 +
.../service/FlowMultiInstanceTransService.java | 38 +
.../common/flow/service/FlowNodeTasksService.java | 9 +
.../flow/service/FlowTaskCommentService.java | 84 +
.../common/flow/service/FlowTaskExtService.java | 121 +
.../flow/service/FlowTaskTimeoutJobService.java | 52 +
.../flow/service/FlowTransProducerService.java | 40 +
.../flow/service/FlowVariableLogService.java | 32 +
.../common/flow/service/FlowWorkOrderService.java | 172 ++
.../flow/service/impl/FlowApiServiceImpl.java | 2444 ++++++++++++++++++++
.../flow/service/impl/FlowCategoryServiceImpl.java | 132 ++
.../flow/service/impl/FlowEntryServiceImpl.java | 508 ++++
.../service/impl/FlowEntryVariableServiceImpl.java | 138 ++
.../flow/service/impl/FlowMessageServiceImpl.java | 395 ++++
.../impl/FlowMultiInstanceTransServiceImpl.java | 87 +
.../service/impl/FlowNodeTasksServiceImpl.java | 30 +
.../service/impl/FlowTaskCommentServiceImpl.java | 144 ++
.../flow/service/impl/FlowTaskExtServiceImpl.java | 616 +++++
.../impl/FlowTaskTimeoutJobServiceImpl.java | 137 ++
.../service/impl/FlowTransProducerServiceImpl.java | 70 +
.../service/impl/FlowVariableLogServiceImpl.java | 58 +
.../service/impl/FlowWorkOrderServiceImpl.java | 382 +++
.../common/flow/timer/FlowTaskTimeoutTimer.java | 71 +
.../flow/util/BaseBusinessDataExtHelper.java | 124 +
.../flow/util/BaseFlowIdentityExtHelper.java | 253 ++
.../common/flow/util/BaseFlowNotifyExtHelper.java | 28 +
.../flow/util/BaseOnlineBusinessDataExtHelper.java | 51 +
.../common/flow/util/FlowCustomExtFactory.java | 78 +
.../common/flow/util/FlowOperationHelper.java | 430 ++++
.../apelet/common/flow/util/FlowRedisKeyUtil.java | 52 +
.../java/apelet/common/flow/vo/FlowCategoryVo.java | 71 +
.../apelet/common/flow/vo/FlowEntryPublishVo.java | 59 +
.../apelet/common/flow/vo/FlowEntryVariableVo.java | 77 +
.../java/apelet/common/flow/vo/FlowEntryVo.java | 163 ++
.../java/apelet/common/flow/vo/FlowMessageVo.java | 137 ++
.../apelet/common/flow/vo/FlowTaskCommentVo.java | 113 +
.../java/apelet/common/flow/vo/FlowTaskVo.java | 125 +
.../java/apelet/common/flow/vo/FlowUserInfoVo.java | 77 +
.../apelet/common/flow/vo/FlowWorkOrderVo.java | 158 ++
.../java/apelet/common/flow/vo/TaskInfoVo.java | 79 +
....flowable.common.engine.impl.EngineConfigurator | 1 +
.../src/main/resources/META-INF/spring.factories | 2 +
common/pom.xml | 2 +-
158 files changed, 16963 insertions(+), 1 deletion(-)
create mode 100644 common/common-flow/pom.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/Plugin/AbstractAssigneePlugin.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/Plugin/DemoFlowNodePlugin.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/Plugin/FlowNodeExpressionUtil.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/advice/FlowExceptionHandler.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowOnlineService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/cmd/ExpressionCmd.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/cmd/RestartProcessInstanceCmd.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/config/CustomEngineConfigurator.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/config/FlowAutoConfig.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/config/FlowProperties.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowApprovalType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowBackType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowBuiltinApprovalStatus.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowConstant.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowTaskStatus.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/constant/FlowTaskType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowCategoryController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowEntryController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowEntryVariableController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowMessageController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowNodeTasksController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/controller/FlowOperationController.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowCategoryMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowEntryMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowEntryPublishMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowEntryPublishVariableMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowEntryVariableMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowMessageCandidateIdentityMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowMessageIdentityOperationMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowMessageMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowMultiInstanceTransMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowNodeTasksMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowTaskCommentMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowTaskExtMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowTaskTimeoutJobMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowTransProducerMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowVariableLogMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowWorkOrderExtMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/FlowWorkOrderMapper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowCategoryMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowEntryMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowEntryPublishMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowEntryPublishVariableMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowEntryVariableMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowMessageCandidateIdentityMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowMessageIdentityOperationMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowMessageMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowMultiInstanceTransMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTaskCommentMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTaskExtMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTaskTimeoutJobMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowTransProducerMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowVariableLogMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowWorkOrderExtMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dao/mapper/FlowWorkOrderMapper.xml
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowCategoryDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowEntryDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowEntryVariableDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowMessageDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowTaskCommentDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/dto/FlowWorkOrderDto.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/exception/FlowEmptyUserException.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/exception/FlowOperationException.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/AutoSkipListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/AutoSkipTaskListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/DeptPostLeaderListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowEmptyUserHandleListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowFinishedListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowTaskNotifyListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowTaskRejectBackListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowTaskReviveListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowTaskTimeoutListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/FlowUserTaskListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/UpDeptPostLeaderListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/listener/UpdateLatestApprovalStatusListener.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowCategory.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowEntry.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowEntryPublish.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowEntryPublishVariable.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowEntryVariable.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowMessage.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowMessageCandidateIdentity.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowMessageIdentityOperation.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowMultiInstanceTrans.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowNodeTasks.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowTaskComment.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowTaskExt.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowTaskTimeoutJob.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowTransConsumer.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowTransProducer.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowVariableLog.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowWorkOrder.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/FlowWorkOrderExt.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowBindFormType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowEntryStatus.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowMessageOperationType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowMessageType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowTaskTimeoutJobStatus.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/model/constant/FlowVariableType.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/AnalyzedNode.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowApiOption.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowElementExtProperty.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowEntryExtensionData.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowRejectData.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowTaskMultiSignAssign.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowTaskOperation.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowTaskPostCandidateGroup.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/object/FlowUserTaskExtData.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowApiService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowCategoryService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowEntryService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowEntryVariableService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowMessageService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowMultiInstanceTransService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowNodeTasksService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowTaskCommentService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowTaskExtService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowTaskTimeoutJobService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowTransProducerService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowVariableLogService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/FlowWorkOrderService.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowApiServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowCategoryServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowEntryServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowEntryVariableServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowMessageServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowMultiInstanceTransServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowNodeTasksServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskCommentServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskExtServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTaskTimeoutJobServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowTransProducerServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowVariableLogServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/service/impl/FlowWorkOrderServiceImpl.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/timer/FlowTaskTimeoutTimer.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/BaseBusinessDataExtHelper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/BaseFlowIdentityExtHelper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/BaseFlowNotifyExtHelper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/BaseOnlineBusinessDataExtHelper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/FlowCustomExtFactory.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/FlowOperationHelper.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/util/FlowRedisKeyUtil.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowCategoryVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowEntryPublishVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowEntryVariableVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowEntryVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowMessageVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowTaskCommentVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowTaskVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowUserInfoVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/FlowWorkOrderVo.java
create mode 100644 common/common-flow/src/main/java/apelet/common/flow/vo/TaskInfoVo.java
create mode 100644 common/common-flow/src/main/resources/META-INF/services/org.flowable.common.engine.impl.EngineConfigurator
create mode 100644 common/common-flow/src/main/resources/META-INF/spring.factories
diff --git a/application-tenant/tenant-admin/pom.xml b/application-tenant/tenant-admin/pom.xml
index 081c5b8..ef71c3a 100644
--- a/application-tenant/tenant-admin/pom.xml
+++ b/application-tenant/tenant-admin/pom.xml
@@ -57,6 +57,11 @@
apelet
+ common-flow
+ 1.0.0
+
+
+ apelet
common-flow-online
1.0.0
diff --git a/common/common-flow/pom.xml b/common/common-flow/pom.xml
new file mode 100644
index 0000000..8018e84
--- /dev/null
+++ b/common/common-flow/pom.xml
@@ -0,0 +1,44 @@
+
+
+
+ common
+ apelet
+ 1.0.0
+
+ 4.0.0
+
+ common-flow
+ 1.0.0
+ common-flow
+ jar
+
+
+
+ apelet
+ common-datafilter
+ 1.0.0
+
+
+ apelet
+ common-sequence
+ 1.0.0
+
+
+ apelet
+ common-log
+ 1.0.0
+
+
+ apelet
+ common-swagger
+ 1.0.0
+
+
+ org.flowable
+ flowable-spring-boot-starter-basic
+ ${flowable.version}
+
+
+
\ No newline at end of file
diff --git a/common/common-flow/src/main/java/apelet/common/flow/Plugin/AbstractAssigneePlugin.java b/common/common-flow/src/main/java/apelet/common/flow/Plugin/AbstractAssigneePlugin.java
new file mode 100644
index 0000000..35fae03
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/Plugin/AbstractAssigneePlugin.java
@@ -0,0 +1,11 @@
+package apelet.common.flow.Plugin;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AbstractAssigneePlugin {
+
+ public List userStr = new ArrayList<>();
+
+ public void getFlowNodeUser(String parame){}
+}
diff --git a/common/common-flow/src/main/java/apelet/common/flow/Plugin/DemoFlowNodePlugin.java b/common/common-flow/src/main/java/apelet/common/flow/Plugin/DemoFlowNodePlugin.java
new file mode 100644
index 0000000..e799bb3
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/Plugin/DemoFlowNodePlugin.java
@@ -0,0 +1,10 @@
+package apelet.common.flow.Plugin;
+
+public class DemoFlowNodePlugin extends AbstractAssigneePlugin{
+
+ @Override
+ public void getFlowNodeUser(String parame) {
+ System.out.println("-----------DemoFlowNodePlugin:"+parame);
+ this.userStr.add("650");
+ }
+}
\ No newline at end of file
diff --git a/common/common-flow/src/main/java/apelet/common/flow/Plugin/FlowNodeExpressionUtil.java b/common/common-flow/src/main/java/apelet/common/flow/Plugin/FlowNodeExpressionUtil.java
new file mode 100644
index 0000000..b39b58b
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/Plugin/FlowNodeExpressionUtil.java
@@ -0,0 +1,49 @@
+package apelet.common.flow.Plugin;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * 流程实例中表达式解析工具
+ */
+@Component
+@Slf4j
+public class FlowNodeExpressionUtil {
+
+public String getAssigneeByPlugin( String parame){
+
+ List list = new ArrayList<>();
+ String returnStr=",";
+ try {
+ //parame = URLDecoder.decode(parame,"UTF-8");
+ JSONArray josnarr = JSONArray.parseArray(parame);
+ for(int i=0;i aClass = Class.forName(jsono.getString("pluginType"));
+ Method method = aClass.getMethod("getFlowNodeUser", String.class);
+ Object object = aClass.newInstance();
+ method.invoke(object, jsono.toString());
+ list.addAll((List) aClass.getSuperclass().getDeclaredField("userStr").get(object));
+ }
+ if(list.size()>0){
+ for(int i=0;i exceptionHandle(FlowableException ex, HttpServletRequest request) {
+ FlowEmptyUserException flowEmptyUserException = this.findCause(ex, FlowEmptyUserException.class);
+ if (flowEmptyUserException != null) {
+ FlowTaskComment comment = JSON.parseObject(flowEmptyUserException.getMessage(), FlowTaskComment.class);
+ flowTaskCommentService.saveNew(comment);
+ return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, "下一个任务节点的审批人为空,提交被自动驳回!");
+ }
+ log.error("Unhandled FlowException from URL [" + request.getRequestURI() + "]", ex);
+ ContextUtil.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return ResponseResult.error(ErrorCodeEnum.UNHANDLED_EXCEPTION, ex.getMessage());
+ }
+
+ @SuppressWarnings("unchecked")
+ private T findCause(Throwable ex, Class clazz) {
+ if (ex.getCause() == null) {
+ return null;
+ }
+ if (ex.getCause().getClass().equals(clazz)) {
+ return (T) ex.getCause();
+ } else {
+ return this.findCause(ex.getCause(), clazz);
+ }
+ }
+}
diff --git a/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowOnlineService.java b/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowOnlineService.java
new file mode 100644
index 0000000..f86922f
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowOnlineService.java
@@ -0,0 +1,26 @@
+package apelet.common.flow.base.service;
+
+import apelet.common.flow.model.FlowWorkOrder;
+
+/**
+ * 工作流在线表单的服务接口。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+public interface BaseFlowOnlineService {
+
+ /**
+ * 更新在线表单主表数据的流程状态字段值。
+ *
+ * @param workOrder 工单对象。
+ */
+ void updateFlowStatus(FlowWorkOrder workOrder);
+
+ /**
+ * 根据工单对象级联删除业务数据。
+ *
+ * @param workOrder 工单对象。
+ */
+ void deleteBusinessData(FlowWorkOrder workOrder);
+}
diff --git a/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowService.java b/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowService.java
new file mode 100644
index 0000000..146ce9c
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/base/service/BaseFlowService.java
@@ -0,0 +1,273 @@
+package apelet.common.flow.base.service;
+
+import apelet.common.core.base.service.BaseService;
+import apelet.common.core.exception.MyRuntimeException;
+import apelet.common.core.object.CallResult;
+import apelet.common.core.object.MyRelationParam;
+import apelet.common.core.util.MyDateUtil;
+import apelet.common.core.util.MyModelUtil;
+import apelet.common.flow.constant.FlowApprovalType;
+import apelet.common.flow.constant.FlowConstant;
+import apelet.common.flow.constant.FlowTaskStatus;
+import apelet.common.flow.exception.FlowOperationException;
+import apelet.common.flow.model.FlowTaskComment;
+import apelet.common.flow.model.FlowWorkOrder;
+import apelet.common.flow.model.FlowWorkOrderExt;
+import apelet.common.flow.service.FlowApiService;
+import apelet.common.flow.service.FlowWorkOrderService;
+import apelet.common.flow.vo.FlowWorkOrderVo;
+import apelet.common.redis.cache.SessionCacheHelper;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.text.StrFormatter;
+import cn.hutool.core.util.ReflectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 路由表单工作流服务抽象类。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@Slf4j
+public abstract class BaseFlowService extends BaseService {
+
+ @Autowired
+ private FlowApiService flowApiService;
+ @Autowired
+ private FlowWorkOrderService flowWorkOrderService;
+ @Autowired
+ private SessionCacheHelper cacheHelper;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void startWithBusinessKey(String processDefinitionId, K dataId) {
+ ProcessInstance instance = flowApiService.start(processDefinitionId, dataId);
+ flowWorkOrderService.saveNew(instance, dataId, null, super.tableName);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void startAndTakeFirst(
+ String processDefinitionId, K dataId, FlowTaskComment comment, JSONObject variables) {
+ ProcessInstance instance = flowApiService.start(processDefinitionId, dataId);
+ flowWorkOrderService.saveNew(instance, dataId, null, super.tableName);
+ flowApiService.takeFirstTask(instance.getProcessInstanceId(), comment, variables);
+ // 这里需要在创建工单后再次更新一下工单状态,在flowApiService.completeTask中的更新,
+ // 因为当时没有创建工单对象,更新会不起任何作用,所以这里要补偿一下。
+ Integer approvalStatus = MapUtil.getInt(variables, FlowConstant.LATEST_APPROVAL_STATUS_KEY);
+ flowWorkOrderService.updateLatestApprovalStatusByProcessInstanceId(instance.getId(), approvalStatus);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public FlowWorkOrder saveNewDraftAndStartProcess(String processDefinitionId, String masterData, String slaveData) {
+ ProcessInstance instance = flowApiService.start(processDefinitionId, null);
+ Map variableMap = flowApiService.initAndGetProcessInstanceVariables(processDefinitionId);
+ flowApiService.setProcessInstanceVariables(instance.getProcessInstanceId(), variableMap);
+ return flowWorkOrderService.saveNewWithDraft(instance, null, super.tableName, masterData, slaveData);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void takeFirstTask(
+ String processInstanceId, String taskId, K dataId, FlowTaskComment comment, JSONObject variables) {
+ Task task = flowApiService.getProcessInstanceActiveTask(processInstanceId, taskId);
+ flowApiService.setBusinessKeyForProcessInstance(processInstanceId, dataId);
+ ProcessInstance instance = flowApiService.getProcessInstance(processInstanceId);
+ FlowWorkOrder flowWorkOrder =
+ flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(instance.getProcessInstanceId());
+ if (flowWorkOrder == null) {
+ flowWorkOrderService.saveNew(instance, dataId, null, super.tableName);
+ } else {
+ flowWorkOrder.setBusinessKey(dataId.toString());
+ flowWorkOrder.setUpdateTime(new Date());
+ flowWorkOrder.setFlowStatus(FlowTaskStatus.SUBMITTED);
+ flowWorkOrderService.updateById(flowWorkOrder);
+ }
+ flowApiService.completeTask(task, comment, variables, null);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void takeTask(Task task, K dataId, FlowTaskComment comment, JSONObject variables) {
+ int flowStatus = FlowTaskStatus.APPROVING;
+ if (comment.getApprovalType().equals(FlowApprovalType.REFUSE)) {
+ flowStatus = FlowTaskStatus.REFUSED;
+ } else if (comment.getApprovalType().equals(FlowApprovalType.STOP)) {
+ flowStatus = FlowTaskStatus.FINISHED;
+ }
+ if (comment.getApprovalType().equals(FlowApprovalType.STOP)) {
+ Integer s = MapUtil.getInt(variables, FlowConstant.LATEST_APPROVAL_STATUS_KEY);
+ flowWorkOrderService.updateLatestApprovalStatusByProcessInstanceId(task.getProcessInstanceId(), s);
+ CallResult stopResult = flowApiService.stopProcessInstance(
+ task.getProcessInstanceId(), comment.getTaskComment(), flowStatus);
+ if (!stopResult.isSuccess()) {
+ throw new FlowOperationException(stopResult.getErrorMessage());
+ }
+ } else {
+ flowWorkOrderService.updateFlowStatusByProcessInstanceId(task.getProcessInstanceId(), flowStatus);
+ flowApiService.completeTask(task, comment, variables, null);
+ }
+ }
+
+ public void buildDraftData(List draftWorkOrderList) {
+ if (CollUtil.isEmpty(draftWorkOrderList)) {
+ return;
+ }
+ Set workOrderIdSet = draftWorkOrderList.stream()
+ .map(FlowWorkOrderVo::getWorkOrderId).collect(Collectors.toSet());
+ Map workOrderExtMap =
+ flowWorkOrderService.getFlowWorkOrderExtByWorkOrderIds(workOrderIdSet)
+ .stream().collect(Collectors.toMap(FlowWorkOrderExt::getWorkOrderId, c -> c));
+ for (FlowWorkOrderVo workOrder : draftWorkOrderList) {
+ FlowWorkOrderExt workOrderExt = workOrderExtMap.get(workOrder.getWorkOrderId());
+ if (workOrderExt == null) {
+ continue;
+ }
+ JSONObject draftData = JSON.parseObject(workOrderExt.getDraftData());
+ JSONObject masterData = draftData.getJSONObject(FlowConstant.MASTER_DATA_KEY);
+ JSONObject slaveData = draftData.getJSONObject(FlowConstant.SLAVE_DATA_KEY);
+ M model;
+ if (masterData != null) {
+ model = masterData.toJavaObject(modelClass);
+ super.buildRelationForData(model, MyRelationParam.dictOnly());
+ } else {
+ model = ReflectUtil.newInstance(modelClass);
+ }
+ this.bindLocalOneToOneSlaveData(model, slaveData);
+ super.buildLocalOneToOneDictOnly(model);
+ workOrder.setMasterData(BeanUtil.beanToMap(model));
+ }
+ }
+
+ /**
+ * 在流程实例审批结束后,需要进行审批表到发布表数据同步的服务实现子类,需要实现该方法。
+ *
+ * @param workOrder 工单对象。
+ */
+ public void syncBusinessData(FlowWorkOrder workOrder) {
+ // 请自行在子类中实现当前service的数据同步逻辑。
+ }
+
+ /**
+ * 在流程实例审批结束后,需要进行业务表的状态更新,业务Service需要实现该方法。
+ *
+ * @param workOrder 工单对象。
+ */
+ public void updateFlowStatus(FlowWorkOrder workOrder) {
+ if (flowStatusField == null && flowLatestApprovalStatusField == null) {
+ return;
+ }
+ Serializable id = this.convertToKeyValue(workOrder.getBusinessKey());
+ M data = this.getById(id);
+ if (data == null) {
+ String msg = StrFormatter.format(
+ "WorkOrderId [{}] don't find business data by key [{}] while calling [updateFlowStatus].",
+ workOrder.getWorkOrderId(), workOrder.getBusinessKey());
+ log.warn(msg);
+ return;
+ }
+ if (flowStatusField != null) {
+ ReflectUtil.setFieldValue(data, flowStatusField, workOrder.getFlowStatus());
+ }
+ if (flowLatestApprovalStatusField != null) {
+ ReflectUtil.setFieldValue(data, flowLatestApprovalStatusField, workOrder.getLatestApprovalStatus());
+ }
+ mapper().updateById(data);
+ }
+
+ /**
+ * 根据工单对象删除流程业务数据。
+ *
+ * @param workOrder 工单对象。
+ */
+ @SuppressWarnings("unchecked")
+ public void removeByWorkOrder(FlowWorkOrder workOrder) {
+ Serializable id = this.convertToKeyValue(workOrder.getBusinessKey());
+ M data = this.getById(id);
+ if (data == null) {
+ String msg = StrFormatter.format(
+ "WorkOrderId [{}] don't find business data by key [{}] while calling [removeByWorkOrder].",
+ workOrder.getWorkOrderId(), workOrder.getBusinessKey());
+ log.warn(msg);
+ return;
+ }
+ // 级联删除业务数据,调用的是橙单默认生成的remove方法,参数类型为主键类型,如Long、String等。
+ // 进一步补充说明,橙单默认生成的remove方法,会根据在生成器中的配置,生成关联从表数据的级联删除代码。
+ this.remove((K) id);
+ }
+
+ /**
+ * 获取业务详情数据。
+ *
+ * @param processInstanceId 流程实例Id。
+ * @param businessKey 业务主键Id。如果与实际主键值类型不同,需要在子类中自行完成类型转换。
+ * @return 业务主表数据,以及关联从表数据。
+ */
+ @SuppressWarnings("unchecked")
+ public String getBusinessData(String processInstanceId, String businessKey) {
+ Serializable id = this.convertToKeyValue(businessKey);
+ M data = this.getByIdWithRelation((K) id, MyRelationParam.full());
+ return JSON.toJSONStringWithDateFormat(data, MyDateUtil.COMMON_SHORT_DATETIME_FORMAT);
+ }
+
+ /**
+ * 规格化工单扩展表中保存的草稿数据。如果仅仅包含主表数据,可以使用当前的缺省实现。
+ *
+ * @param processInstanceId 流程实例Id。
+ * @param masterData 草稿中的主表数据。
+ * @param slaveData 草稿中的全部关联从表数据。
+ * @return 格式化后用于前端显示的业务草稿数据。
+ */
+ public String getNormalizedDraftData(String processInstanceId, JSONObject masterData, JSONObject slaveData) {
+ // 看到这个异常千万别慌,这是及时的提示您,如果草稿中包含了关联从表数据,就一定要在业务的ServiceImpl中实现该方法。
+ // 在子类中实现主表和关联从表数据的数据组装。通用的方法中,只能解析主表数据,关联从表各式各样,所以需要在子类中实现。
+ if (slaveData != null) {
+ throw new UnsupportedOperationException(
+ "Please implement getNormalizedDraftData by self, because draft data includes related slaveData");
+ }
+ if (masterData == null) {
+ return JSON.toJSONString(ReflectUtil.newInstance(modelClass));
+ }
+ M model = BeanUtil.toBean(masterData, modelClass);
+ // 这里会缺省缓存主表中上传字段的下载地址,以便在显示草稿数据时,这些上传字段对应的download方法,不会被数据权限过滤。
+ Set cachedDownableFilename =
+ new HashSet<>(MyModelUtil.extractDownloadFileName(model, modelClass));
+ cacheHelper.putSessionDownloadableFileNameSet(cachedDownableFilename);
+ return JSON.toJSONStringWithDateFormat(model, MyDateUtil.COMMON_SHORT_DATETIME_FORMAT);
+ }
+
+ private Serializable convertToKeyValue(String businessKey) {
+ if (idFieldClass.equals(String.class)) {
+ return businessKey;
+ } else if (idFieldClass.equals(Long.class)) {
+ return Long.valueOf(businessKey);
+ } else if (idFieldClass.equals(Integer.class)) {
+ return Integer.valueOf(businessKey);
+ } else {
+ throw new MyRuntimeException("Unsupported Primary Key Field Type.");
+ }
+ }
+
+ private void bindLocalOneToOneSlaveData(M model, JSONObject slaveData) {
+ if (slaveData == null) {
+ return;
+ }
+ for (BaseService.RelationStruct relationStruct : super.localRelationOneToOneStructList) {
+ Field relationField = relationStruct.getRelationField();
+ JSONObject slaveObject = slaveData.getJSONObject(relationField.getName());
+ if (slaveObject != null) {
+ ReflectUtil.setFieldValue(model, relationField,
+ slaveObject.toJavaObject(relationStruct.getRelationOneToOne().slaveModelClass()));
+ }
+ }
+ }
+}
diff --git a/common/common-flow/src/main/java/apelet/common/flow/cmd/ExpressionCmd.java b/common/common-flow/src/main/java/apelet/common/flow/cmd/ExpressionCmd.java
new file mode 100644
index 0000000..99551cb
--- /dev/null
+++ b/common/common-flow/src/main/java/apelet/common/flow/cmd/ExpressionCmd.java
@@ -0,0 +1,34 @@
+package apelet.common.flow.cmd;
+
+import lombok.AllArgsConstructor;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.common.engine.api.variable.VariableContainer;
+import org.flowable.common.engine.impl.el.VariableContainerWrapper;
+import org.flowable.common.engine.impl.interceptor.Command;
+import org.flowable.common.engine.impl.interceptor.CommandContext;
+import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.flowable.engine.impl.util.CommandContextUtil;
+
+import java.util.Map;
+
+/**
+ * EL表达式解析和执行的命令。
+ *
+ * @author guifc
+ * @date 2024-08-27
+ */
+@AllArgsConstructor
+public class ExpressionCmd implements Command