From 1c62711f743064f5f8c39e8b3d67f98b33c67aac Mon Sep 17 00:00:00 2001 From: ranke <213539@qq.com> Date: Fri, 30 Jan 2026 11:46:25 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8E=20ztcloud=20?= =?UTF-8?q?=E7=9A=84=20bpm=20=20=E4=B8=AD=E9=87=8D=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81,=20=E6=94=B9=E4=B8=BA=E4=BB=A5jar=E5=8C=85?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=BC=95=E5=85=A5=20ztcloud=20=E7=9A=84bpm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 + ...‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md | 0 zt-module-bpm/pom.xml | 2 +- zt-module-bpm/zt-module-bpm-api/pom.xml | 4 +- .../bpm/api/definition/BpmCategoryApi.java | 55 - .../module/bpm/api/definition/BpmFormApi.java | 50 - .../bpm/api/definition/BpmUserGroupApi.java | 29 - .../definition/dto/BpmCategoryPageReqDTO.java | 32 - .../definition/dto/BpmCategoryRespDTO.java | 33 - .../definition/dto/BpmCategorySaveReqDTO.java | 37 - .../api/definition/dto/BpmFormPageReqDTO.java | 18 - .../api/definition/dto/BpmFormRespDTO.java | 33 - .../api/definition/dto/BpmFormSaveReqDTO.java | 32 - .../definition/dto/BpmUserGroupRespDTO.java | 31 - .../event/BpmProcessInstanceStatusEvent.java | 41 - ...BpmProcessInstanceStatusEventListener.java | 34 - .../bpm/api/task/BpmProcessInstanceApi.java | 67 - .../plat/module/bpm/api/task/BpmTaskApi.java | 53 - .../api/task/dto/BpmApprovalDetailReqDTO.java | 40 - .../task/dto/BpmApprovalDetailRespDTO.java | 110 - .../task/dto/BpmProcessDefinitionRespDTO.java | 55 - ...pmProcessInstanceBpmnModelViewRespDTO.java | 41 - .../dto/BpmProcessInstanceCancelReqDTO.java | 19 - .../dto/BpmProcessInstanceCreateReqDTO.java | 35 - .../dto/BpmProcessInstancePageReqDTO.java | 51 - .../task/dto/BpmProcessInstanceRespDTO.java | 92 - .../api/task/dto/BpmSimpleModelNodeDTO.java | 31 - .../api/task/dto/BpmTaskApproveReqDTO.java | 33 - .../bpm/api/task/dto/BpmTaskPageReqDTO.java | 29 - .../bpm/api/task/dto/BpmTaskRejectReqDTO.java | 18 - .../bpm/api/task/dto/BpmTaskRespDTO.java | 133 -- .../bpm/api/task/dto/UserSimpleDTO.java | 25 - .../plat/module/bpm/enums/ApiConstants.java | 23 - .../module/bpm/enums/DictTypeConstants.java | 10 - .../module/bpm/enums/ErrorCodeConstants.java | 87 - .../definition/BpmAutoApproveTypeEnum.java | 32 - .../definition/BpmBoundaryEventTypeEnum.java | 27 - ...ildProcessMultiInstanceSourceTypeEnum.java | 37 - ...BpmChildProcessStartUserEmptyTypeEnum.java | 36 - .../BpmChildProcessStartUserTypeEnum.java | 35 - .../definition/BpmDelayTimerTypeEnum.java | 31 - .../definition/BpmFieldPermissionEnum.java | 33 - .../BpmHttpRequestParamTypeEnum.java | 31 - .../definition/BpmModelFormTypeEnum.java | 32 - .../enums/definition/BpmModelTypeEnum.java | 31 - .../BpmProcessListenerTypeEnum.java | 21 - .../BpmProcessListenerValueTypeEnum.java | 22 - .../BpmSimpleModeConditionTypeEnum.java | 36 - .../BpmSimpleModelNodeTypeEnum.java | 70 - .../enums/definition/BpmTriggerTypeEnum.java | 46 - .../BpmUserTaskApproveMethodEnum.java | 47 - .../BpmUserTaskApproveTypeEnum.java | 31 - ...BpmUserTaskAssignEmptyHandlerTypeEnum.java | 33 - ...serTaskAssignStartUserHandlerTypeEnum.java | 31 - .../BpmUserTaskRejectHandlerTypeEnum.java | 35 - .../BpmUserTaskTimeoutHandlerTypeEnum.java | 32 - .../bpm/enums/message/BpmMessageEnum.java | 27 - .../bpm/enums/task/BpmCommentTypeEnum.java | 46 - .../task/BpmProcessInstanceStatusEnum.java | 80 - .../module/bpm/enums/task/BpmReasonEnum.java | 52 - .../bpm/enums/task/BpmTaskSignTypeEnum.java | 47 - .../bpm/enums/task/BpmTaskStatusEnum.java | 100 - zt-module-bpm/zt-module-bpm-server/pom.xml | 14 +- .../druid/pool/DruidPooledStatement.java | 778 ------- .../api/definition/BpmCategoryApiImpl.java | 79 - .../bpm/api/definition/BpmFormApiImpl.java | 76 - .../api/definition/BpmUserGroupApiImpl.java | 41 - .../zt/plat/module/bpm/api/package-info.java | 4 - .../api/task/BpmProcessInstanceApiImpl.java | 150 -- .../module/bpm/api/task/BpmTaskApiImpl.java | 203 -- .../admin/base/dept/DeptSimpleBaseVO.java | 15 - .../controller/admin/base/package-info.java | 4 - .../admin/base/user/UserSimpleBaseVO.java | 22 - .../definition/BpmCategoryController.java | 95 - .../admin/definition/BpmFormController.java | 83 - .../admin/definition/BpmModelController.java | 200 -- .../BpmProcessDefinitionController.java | 133 -- .../BpmProcessExpressionController.java | 73 - .../BpmProcessListenerController.java | 73 - .../definition/BpmUserGroupController.java | 83 - .../vo/category/BpmCategoryPageReqVO.java | 32 - .../vo/category/BpmCategoryRespVO.java | 33 - .../vo/category/BpmCategorySaveReqVO.java | 37 - .../BpmProcessExpressionPageReqVO.java | 33 - .../BpmProcessExpressionRespVO.java | 30 - .../BpmProcessExpressionSaveReqVO.java | 27 - .../definition/vo/form/BpmFormFieldVO.java | 24 - .../definition/vo/form/BpmFormPageReqVO.java | 14 - .../definition/vo/form/BpmFormRespVO.java | 39 - .../definition/vo/form/BpmFormSaveReqVO.java | 35 - .../vo/group/BpmUserGroupPageReqVO.java | 28 - .../vo/group/BpmUserGroupRespVO.java | 31 - .../vo/group/BpmUserGroupSaveReqVO.java | 31 - .../listener/BpmProcessListenerPageReqVO.java | 30 - .../vo/listener/BpmProcessListenerRespVO.java | 36 - .../listener/BpmProcessListenerSaveReqVO.java | 39 - .../vo/model/BpmModeUpdateBpmnReqVO.java | 19 - .../vo/model/BpmModelMetaInfoVO.java | 184 -- .../definition/vo/model/BpmModelRespVO.java | 58 - .../vo/model/BpmModelSaveReqVO.java | 35 - .../vo/model/BpmModelUpdateStateReqVO.java | 19 - .../vo/model/simple/BpmSimpleModelNodeVO.java | 526 ----- .../simple/BpmSimpleModelUpdateReqVO.java | 23 - .../BpmProcessDefinitionPageReqVO.java | 14 - .../process/BpmProcessDefinitionRespVO.java | 71 - .../admin/oa/BpmOALeaveController.http | 12 - .../admin/oa/BpmOALeaveController.java | 62 - .../bpm/controller/admin/oa/package-info.java | 5 - .../admin/oa/vo/BpmOALeaveCreateReqVO.java | 43 - .../admin/oa/vo/BpmOALeavePageReqVO.java | 29 - .../admin/oa/vo/BpmOALeaveRespVO.java | 36 - .../task/BpmProcessInstanceController.http | 16 - .../task/BpmProcessInstanceController.java | 237 -- .../BpmProcessInstanceCopyController.java | 89 - .../admin/task/BpmTaskController.java | 252 -- .../task/vo/activity/BpmActivityRespVO.java | 25 - .../vo/cc/BpmProcessInstanceCopyRespVO.java | 48 - .../vo/instance/BpmApprovalDetailReqVO.java | 40 - .../vo/instance/BpmApprovalDetailRespVO.java | 112 - ...BpmProcessInstanceBpmnModelViewRespVO.java | 43 - .../BpmProcessInstanceCancelReqVO.java | 19 - .../BpmProcessInstanceCopyPageReqVO.java | 23 - .../vo/instance/BpmProcessInstanceCopyVO.java | 88 - .../BpmProcessInstanceCreateReqVO.java | 24 - .../instance/BpmProcessInstancePageReqVO.java | 45 - .../vo/instance/BpmProcessInstanceRespVO.java | 86 - .../task/vo/task/BpmTaskApproveReqVO.java | 33 - .../admin/task/vo/task/BpmTaskCopyReqVO.java | 23 - .../task/vo/task/BpmTaskDelegateReqVO.java | 24 - .../admin/task/vo/task/BpmTaskPageReqVO.java | 28 - .../task/vo/task/BpmTaskRejectReqVO.java | 18 - .../admin/task/vo/task/BpmTaskRespVO.java | 130 -- .../task/vo/task/BpmTaskReturnReqVO.java | 23 - .../task/vo/task/BpmTaskSignCreateReqVO.java | 29 - .../task/vo/task/BpmTaskSignDeleteReqVO.java | 19 - .../task/vo/task/BpmTaskTransferReqVO.java | 24 - .../bpm/controller/app/package-info.java | 4 - .../module/bpm/controller/package-info.java | 6 - .../convert/definition/BpmModelConvert.java | 132 -- .../BpmProcessDefinitionConvert.java | 99 - .../convert/message/BpmMessageConvert.java | 21 - .../plat/module/bpm/convert/package-info.java | 6 - .../task/BpmProcessInstanceConvert.java | 305 --- .../task/BpmProcessInstanceDTOConvert.java | 67 - .../bpm/convert/task/BpmTaskConvert.java | 316 --- .../dataobject/definition/BpmCategoryDO.java | 54 - .../dal/dataobject/definition/BpmFormDO.java | 57 - .../BpmProcessDefinitionInfoDO.java | 226 -- .../definition/BpmProcessExpressionDO.java | 45 - .../definition/BpmProcessListenerDO.java | 74 - .../dataobject/definition/BpmUserGroupDO.java | 52 - .../bpm/dal/dataobject/oa/BpmOALeaveDO.java | 78 - .../task/BpmProcessInstanceCopyDO.java | 98 - .../dal/mysql/category/BpmCategoryMapper.java | 46 - .../dal/mysql/definition/BpmFormMapper.java | 25 - .../BpmProcessDefinitionInfoMapper.java | 27 - .../BpmProcessExpressionMapper.java | 26 - .../definition/BpmProcessListenerMapper.java | 27 - .../mysql/definition/BpmUserGroupMapper.java | 32 - .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 29 - .../task/BpmProcessInstanceCopyMapper.java | 31 - .../bpm/dal/redis/BpmProcessIdRedisDAO.java | 61 - .../bpm/dal/redis/RedisKeyConstants.java | 15 - .../config/BpmFlowableConfiguration.java | 136 -- .../behavior/BpmActivityBehaviorFactory.java | 44 - .../BpmParallelMultiInstanceBehavior.java | 91 - .../BpmSequentialMultiInstanceBehavior.java | 95 - .../behavior/BpmUserTaskActivityBehavior.java | 86 - .../candidate/BpmTaskCandidateInvoker.java | 207 -- .../candidate/BpmTaskCandidateStrategy.java | 85 - .../BpmTaskAssignLeaderExpression.java | 79 - .../BpmTaskAssignStartUserExpression.java | 36 - ...actBpmTaskCandidateDeptLeaderStrategy.java | 95 - ...askCandidateApproveUserSelectStrategy.java | 78 - ...mTaskCandidateDeptLeaderMultiStrategy.java | 45 - .../BpmTaskCandidateDeptLeaderStrategy.java | 45 - .../BpmTaskCandidateDeptMemberStrategy.java | 48 - ...idateStartUserDeptLeaderMultiStrategy.java | 70 - ...kCandidateStartUserDeptLeaderStrategy.java | 71 - ...mTaskCandidateStartUserSelectStrategy.java | 73 - ...pmTaskCandidateFormDeptLeaderStrategy.java | 56 - .../BpmTaskCandidateFormUserStrategy.java | 47 - .../BpmTaskCandidateAssignEmptyStrategy.java | 73 - .../BpmTaskCandidateExpressionStrategy.java | 58 - .../user/BpmTaskCandidateGroupStrategy.java | 46 - .../user/BpmTaskCandidatePostStrategy.java | 48 - .../user/BpmTaskCandidateRoleStrategy.java | 43 - .../BpmTaskCandidateStartUserStrategy.java | 57 - .../user/BpmTaskCandidateUserStrategy.java | 39 - ...riableConvertByTypeExpressionFunction.java | 32 - .../enums/BpmTaskCandidateStrategyEnum.java | 59 - .../core/enums/BpmnModelConstants.java | 146 -- .../core/enums/BpmnVariableConstants.java | 99 - .../BpmProcessInstanceEventPublisher.java | 24 - .../core/listener/BpmCopyTaskDelegate.java | 47 - .../BpmProcessInstanceEventListener.java | 54 - .../core/listener/BpmTaskEventListener.java | 125 - .../core/listener/BpmTriggerTaskDelegate.java | 55 - .../DemoDelegateClassExecutionListener.java | 21 - ...moDelegateExpressionExecutionListener.java | 23 - ...DemoSpringExpressionExecutionListener.java | 21 - .../task/DemoDelegateClassTaskListener.java | 20 - .../DemoDelegateExpressionTaskListener.java | 22 - .../DemoSpringExpressionTaskListener.java | 20 - .../core/util/BpmHttpRequestUtils.java | 158 -- .../flowable/core/util/BpmnModelUtils.java | 1025 --------- .../flowable/core/util/FlowableUtils.java | 362 --- .../flowable/core/util/SimpleModelUtils.java | 1007 -------- .../module/bpm/framework/package-info.java | 6 - .../rpc/config/DscBpmRpcConfiguration.java | 16 + .../rpc/config/RpcConfiguration.java | 23 - .../bpm/framework/rpc/package-info.java | 4 - .../config/SecurityConfiguration.java | 40 - .../framework/security/core/package-info.java | 4 - .../web/config/BpmWebConfiguration.java | 30 - .../framework/web/core/FlowableWebFilter.java | 36 - .../bpm/framework/web/package-info.java | 4 - .../definition/BpmCategoryService.java | 92 - .../definition/BpmCategoryServiceImpl.java | 130 -- .../service/definition/BpmFormService.java | 85 - .../definition/BpmFormServiceImpl.java | 114 - .../service/definition/BpmModelService.java | 134 -- .../definition/BpmModelServiceImpl.java | 432 ---- .../BpmProcessDefinitionService.java | 181 -- .../BpmProcessDefinitionServiceImpl.java | 248 -- .../BpmProcessExpressionService.java | 54 - .../BpmProcessExpressionServiceImpl.java | 70 - .../definition/BpmProcessListenerService.java | 54 - .../BpmProcessListenerServiceImpl.java | 102 - .../definition/BpmUserGroupService.java | 82 - .../definition/BpmUserGroupServiceImpl.java | 107 - .../definition/dto/BpmFormFieldRespDTO.java | 25 - .../dto/BpmModelMetaInfoRespDTO.java | 46 - .../dto/BpmProcessDefinitionCreateReqDTO.java | 81 - .../service/message/BpmMessageService.java | 46 - .../message/BpmMessageServiceImpl.java | 79 - ...eSendWhenProcessInstanceApproveReqDTO.java | 26 - ...geSendWhenProcessInstanceRejectReqDTO.java | 32 - .../BpmMessageSendWhenTaskCreatedReqDTO.java | 45 - .../BpmMessageSendWhenTaskTimeoutReqDTO.java | 41 - .../bpm/service/oa/BpmOALeaveService.java | 52 - .../bpm/service/oa/BpmOALeaveServiceImpl.java | 89 - .../oa/listener/BpmOALeaveStatusListener.java | 33 - .../task/BpmProcessInstanceCopyService.java | 69 - .../BpmProcessInstanceCopyServiceImpl.java | 101 - .../task/BpmProcessInstanceService.java | 191 -- .../task/BpmProcessInstanceServiceImpl.java | 964 -------- .../bpm/service/task/BpmTaskService.java | 316 --- .../bpm/service/task/BpmTaskServiceImpl.java | 1535 ------------- .../listener/BpmCallActivityListener.java | 96 - .../task/listener/BpmUserTaskListener.java | 59 - .../bpm/service/task/trigger/BpmTrigger.java | 30 - .../trigger/form/BpmFormDeleteTrigger.java | 73 - .../trigger/form/BpmFormUpdateTrigger.java | 66 - .../http/BpmAbstractHttpRequestTrigger.java | 14 - .../trigger/http/BpmHttpCallbackTrigger.java | 51 - .../http/BpmSyncHttpRequestTrigger.java | 46 - .../liquibase/database/core/DmDatabase.java | 572 ----- .../liquibase/datatype/core/BooleanType.java | 148 -- .../datatype/core/DmBooleanType.java | 32 - .../snapshot/JdbcDatabaseSnapshot.java | 1957 ---------------- .../impl/AbstractEngineConfiguration.java | 2038 ----------------- .../engine/impl/db/DbSqlSessionFactory.java | 354 --- .../main/resources/META-INF/package-info.md | 1 - .../services/liquibase.database.Database | 21 - .../liquibase.datatype.LiquibaseDataType | 1 - .../create/flowable.oracle.create.batch.sql | 41 - .../db/drop/flowable.oracle.drop.batch.sql | 4 - .../create/flowable.oracle.create.common.sql | 23 - .../db/drop/flowable.oracle.drop.common.sql | 2 - .../create/flowable.oracle.create.engine.sql | 355 --- .../create/flowable.oracle.create.history.sql | 114 - .../db/drop/flowable.oracle.drop.engine.sql | 148 -- .../db/drop/flowable.oracle.drop.history.sql | 23 - ...wable.oracle.create.entitylink.history.sql | 23 - .../flowable.oracle.create.entitylink.sql | 26 - ...lowable.oracle.drop.entitylink.history.sql | 4 - .../drop/flowable.oracle.drop.entitylink.sql | 4 - ...owable.oracle.create.eventsubscription.sql | 28 - ...flowable.oracle.drop.eventsubscription.sql | 5 - ...ble.oracle.create.identitylink.history.sql | 20 - .../flowable.oracle.create.identitylink.sql | 24 - ...wable.oracle.drop.identitylink.history.sql | 6 - .../flowable.oracle.drop.identitylink.sql | 7 - .../flowable.oracle.create.identity.sql | 108 - .../db/drop/flowable.oracle.drop.identity.sql | 22 - .../db/create/flowable.oracle.create.job.sql | 261 --- .../db/drop/flowable.oracle.drop.job.sql | 74 - .../flowable.oracle.create.task.history.sql | 64 - .../db/create/flowable.oracle.create.task.sql | 48 - .../flowable.oracle.drop.task.history.sql | 8 - .../db/drop/flowable.oracle.drop.task.sql | 6 - ...lowable.oracle.create.variable.history.sql | 26 - .../flowable.oracle.create.variable.sql | 31 - .../flowable.oracle.drop.variable.history.sql | 6 - .../db/drop/flowable.oracle.drop.variable.sql | 9 - 296 files changed, 44 insertions(+), 27720 deletions(-) rename zt-module-bpm/{zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert => docs}/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md (100%) delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApi.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApi.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApi.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryPageReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategorySaveReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormPageReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormSaveReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmUserGroupRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEvent.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApi.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApi.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceBpmnModelViewRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCancelReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstancePageReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmSimpleModelNodeDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskApproveReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskPageReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRejectReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ApiConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/DictTypeConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ErrorCodeConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessMultiInstanceSourceTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserEmptyTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmFieldPermissionEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelFormTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmTriggerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/message/BpmMessageEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmCommentTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmReasonEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskSignTypeEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskStatusEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApiImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApiImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApiImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApiImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/dept/DeptSimpleBaseVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/user/UserSimpleBaseVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmCategoryController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmFormController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmModelController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessExpressionController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessListenerController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmUserGroupController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionSaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormSaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerSaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModeUpdateBpmnReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelSaveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelUpdateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.http delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.http delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmTaskController.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceBpmnModelViewRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskCopyReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskDelegateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignCreateReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignDeleteReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskTransferReqVO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/app/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmModelConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmProcessDefinitionConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/message/BpmMessageConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceDTOConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmCategoryDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmFormDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessExpressionDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/category/BpmCategoryMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmFormMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessExpressionMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessListenerMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/BpmProcessIdRedisDAO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/RedisKeyConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignLeaderExpression.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignStartUserExpression.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateApproveUserSelectStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderMultiStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptMemberStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderMultiStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserSelectStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormDeptLeaderStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormUserStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateAssignEmptyStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateExpressionStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateGroupStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidatePostStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateRoleStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateStartUserStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateUserStrategy.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/el/VariableConvertByTypeExpressionFunction.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/event/BpmProcessInstanceEventPublisher.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmCopyTaskDelegate.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateClassExecutionListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateExpressionExecutionListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoSpringExpressionExecutionListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateClassTaskListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateExpressionTaskListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoSpringExpressionTaskListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmnModelUtils.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/FlowableUtils.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/SimpleModelUtils.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/package-info.java create mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/DscBpmRpcConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/config/SecurityConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/core/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/config/BpmWebConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/core/FlowableWebFilter.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/package-info.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskTimeoutReqDTO.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmCallActivityListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmUserTaskListener.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/BpmTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmAbstractHttpRequestTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmHttpCallbackTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmSyncHttpRequestTrigger.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/database/core/DmDatabase.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/package-info.md delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.database.Database delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.datatype.LiquibaseDataType delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/create/flowable.oracle.create.batch.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/drop/flowable.oracle.drop.batch.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/create/flowable.oracle.create.common.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/drop/flowable.oracle.drop.common.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.engine.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.engine.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/create/flowable.oracle.create.eventsubscription.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/drop/flowable.oracle.drop.eventsubscription.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/create/flowable.oracle.create.identity.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/drop/flowable.oracle.drop.identity.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/create/flowable.oracle.create.job.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/drop/flowable.oracle.drop.job.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.history.sql delete mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.sql diff --git a/pom.xml b/pom.xml index a3077b0..6e7f004 100644 --- a/pom.xml +++ b/pom.xml @@ -278,6 +278,19 @@ 1.0.0 + + klw-dev + + dev + + 172.16.46.63:30848 + klw + DEFAULT_GROUP + nacos + P@ssword25 + 1.0.0 + + diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md b/zt-module-bpm/docs/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md similarity index 100% rename from zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md rename to zt-module-bpm/docs/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md diff --git a/zt-module-bpm/pom.xml b/zt-module-bpm/pom.xml index 10db3bb..0338397 100644 --- a/zt-module-bpm/pom.xml +++ b/zt-module-bpm/pom.xml @@ -12,7 +12,7 @@ zt-module-bpm-api zt-module-bpm-server - zt-module-bpm + zt-module-bpm-dsc pom ${project.artifactId} diff --git a/zt-module-bpm/zt-module-bpm-api/pom.xml b/zt-module-bpm/zt-module-bpm-api/pom.xml index 2aa75a5..0110883 100644 --- a/zt-module-bpm/zt-module-bpm-api/pom.xml +++ b/zt-module-bpm/zt-module-bpm-api/pom.xml @@ -4,11 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> com.zt.plat - zt-module-bpm + zt-module-bpm-dsc ${revision} 4.0.0 - zt-module-bpm-api + zt-module-bpm-api-dsc jar ${project.artifactId} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApi.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApi.java deleted file mode 100644 index 19f885c..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApi.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategoryPageReqDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategoryRespDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategorySaveReqDTO; -import com.zt.plat.module.bpm.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC æœåŠ¡ - BPM æµç¨‹åˆ†ç±»") -public interface BpmCategoryApi { - - String PREFIX = ApiConstants.PREFIX + "/category"; - - @PostMapping(PREFIX + "/create") - @Operation(summary = "创建æµç¨‹åˆ†ç±»") - CommonResult createCategory(@Valid @RequestBody BpmCategorySaveReqDTO createReqDTO); - - @PutMapping(PREFIX + "/update") - @Operation(summary = "æ›´æ–°æµç¨‹åˆ†ç±»") - CommonResult updateCategory(@Valid @RequestBody BpmCategorySaveReqDTO updateReqDTO); - - @PutMapping(PREFIX + "/update-sort-batch") - @Operation(summary = "æ‰¹é‡æ›´æ–°æµç¨‹åˆ†ç±»çš„æŽ’åº") - @Parameter(name = "ids", description = "分类编å·åˆ—表", required = true, example = "1,2,3") - CommonResult updateCategorySortBatch(@RequestParam("ids") List ids); - - @DeleteMapping(PREFIX + "/delete") - @Operation(summary = "删除æµç¨‹åˆ†ç±»") - @Parameter(name = "id", description = "ç¼–å·", required = true) - CommonResult deleteCategory(@RequestParam("id") Long id); - - @GetMapping(PREFIX + "/get") - @Operation(summary = "获得æµç¨‹åˆ†ç±»") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - CommonResult getCategory(@RequestParam("id") Long id); - - @PostMapping(PREFIX + "/page") - @Operation(summary = "获得æµç¨‹åˆ†ç±»åˆ†é¡µ") - CommonResult> getCategoryPage(@Valid @RequestBody BpmCategoryPageReqDTO pageReqDTO); - - @GetMapping(PREFIX + "/simple-list") - @Operation(summary = "èŽ·å–æµç¨‹åˆ†ç±»çš„精简信æ¯åˆ—表", description = "åªåŒ…å«è¢«å¼€å¯çš„分类,主è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - CommonResult> getCategorySimpleList(); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApi.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApi.java deleted file mode 100644 index b21f94a..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApi.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormPageReqDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormRespDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormSaveReqDTO; -import com.zt.plat.module.bpm.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC æœåŠ¡ - 动æ€è¡¨å•") -public interface BpmFormApi { - - String PREFIX = ApiConstants.PREFIX + "/form"; - - @PostMapping(PREFIX + "/create") - @Operation(summary = "创建动æ€è¡¨å•") - CommonResult createForm(@Valid @RequestBody BpmFormSaveReqDTO createReqDTO); - - @PutMapping(PREFIX + "/update") - @Operation(summary = "更新动æ€è¡¨å•") - CommonResult updateForm(@Valid @RequestBody BpmFormSaveReqDTO updateReqDTO); - - @DeleteMapping(PREFIX + "/delete") - @Operation(summary = "删除动æ€è¡¨å•") - @Parameter(name = "id", description = "ç¼–å·", required = true) - CommonResult deleteForm(@RequestParam("id") Long id); - - @GetMapping(PREFIX + "/get") - @Operation(summary = "获得动æ€è¡¨å•") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - CommonResult getForm(@RequestParam("id") Long id); - - @PostMapping(PREFIX + "/page") - @Operation(summary = "获得动æ€è¡¨å•分页") - CommonResult> getFormPage(@Valid @RequestBody BpmFormPageReqDTO pageReqDTO); - - @GetMapping(PREFIX + "/simple-list") - @Operation(summary = "获得动æ€è¡¨å•的精简列表", description = "用于表å•下拉框") - CommonResult> getFormSimpleList(); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApi.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApi.java deleted file mode 100644 index dbf25d9..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApi.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.module.bpm.api.definition.dto.BpmUserGroupRespDTO; -import com.zt.plat.module.bpm.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC æœåŠ¡ - 用户组") -public interface BpmUserGroupApi { - - String PREFIX = ApiConstants.PREFIX + "/user-group"; - - @GetMapping(PREFIX + "/get") - @Operation(summary = "获得用户组") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - CommonResult getUserGroup(@RequestParam("id") Long id); - - @GetMapping(PREFIX + "/simple-list") - @Operation(summary = "获å–用户组精简信æ¯åˆ—表", description = "åªåŒ…å«è¢«å¼€å¯çš„用户组,主è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - CommonResult> getUserGroupSimpleList(); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryPageReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryPageReqDTO.java deleted file mode 100644 index df35f7a..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryPageReqDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "RPC æœåŠ¡ - BPM æµç¨‹åˆ†ç±»åˆ†é¡µ Request DTO") -@Data -public class BpmCategoryPageReqDTO extends PageParam { - - @Schema(description = "分类å", example = "王五") - private String name; - - @Schema(description = "分类标志", example = "OA") - private String code; - - @Schema(description = "分类状æ€", example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryRespDTO.java deleted file mode 100644 index 8831550..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategoryRespDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "RPC æœåŠ¡ - BPM æµç¨‹åˆ†ç±» Response DTO") -@Data -public class BpmCategoryRespDTO { - - @Schema(description = "分类编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") - private Long id; - - @Schema(description = "分类å", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - private String name; - - @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA") - private String code; - - @Schema(description = "分类æè¿°", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String description; - - @Schema(description = "分类状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "分类排åº", requiredMode = Schema.RequiredMode.REQUIRED) - private Integer sort; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategorySaveReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategorySaveReqDTO.java deleted file mode 100644 index 39c84e5..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmCategorySaveReqDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "RPC æœåŠ¡ - BPM æµç¨‹åˆ†ç±»æ–°å¢ž/修改 Request DTO") -@Data -public class BpmCategorySaveReqDTO { - - @Schema(description = "分类编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") - private Long id; - - @Schema(description = "分类å", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - @NotEmpty(message = "分类åä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "分类æè¿°", example = "你猜") - private String description; - - @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA") - @NotEmpty(message = "分类标志ä¸èƒ½ä¸ºç©º") - private String code; - - @Schema(description = "分类状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "分类状æ€ä¸èƒ½ä¸ºç©º") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "分类排åº", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "分类排åºä¸èƒ½ä¸ºç©º") - private Integer sort; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormPageReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormPageReqDTO.java deleted file mode 100644 index d75ff78..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormPageReqDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "动æ€è¡¨å•分页 Request DTO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmFormPageReqDTO extends PageParam { - - @Schema(description = "表å•åç§°", example = "ZT") - private String name; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormRespDTO.java deleted file mode 100644 index e33b513..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormRespDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "RPC æœåŠ¡ - 动æ€è¡¨å• Response DTO") -@Data -public class BpmFormRespDTO { - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "表å•å", example = "ZT") - private String name; - - @Schema(description = "表å•状æ€", example = "1") - private Integer status; - - @Schema(description = "表å•çš„é…ç½®") - private String conf; - - @Schema(description = "表å•项的数组") - private String fields; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormSaveReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormSaveReqDTO.java deleted file mode 100644 index a2b4ab3..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmFormSaveReqDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "RPC æœåŠ¡ - 动æ€è¡¨å•新增/修改 Request DTO") -@Data -public class BpmFormSaveReqDTO { - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "表å•å", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - @NotEmpty(message = "表å•åä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "表å•状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "表å•çš„é…ç½®", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @Schema(description = "表å•项的数组", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "表å•项的数组ä¸èƒ½ä¸ºç©º") - private String fields; - - @Schema(description = "备注", example = "我是备注") - private String remark; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmUserGroupRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmUserGroupRespDTO.java deleted file mode 100644 index f8acdeb..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/definition/dto/BpmUserGroupRespDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.api.definition.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Set; - -@Schema(description = "RPC æœåŠ¡ - 用户组 Response DTO") -@Data -public class BpmUserGroupRespDTO { - - @Schema(description = "ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "组å", example = "ZT") - private String name; - - @Schema(description = "æè¿°", example = "ZT") - private String description; - - @Schema(description = "æˆå‘˜ç”¨æˆ·ç¼–å·æ•°ç»„", example = "1,2,3") - private Set memberUserIds; - - @Schema(description = "状æ€", example = "1") - private Integer status; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEvent.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEvent.java deleted file mode 100644 index 4a4316c..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zt.plat.module.bpm.api.event; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.springframework.context.ApplicationEvent; - -/** - * æµç¨‹å®žä¾‹çš„状æ€ï¼ˆç»“果)å‘生å˜åŒ–çš„ Event - * - * @author ZT - */ -@SuppressWarnings("ALL") -@Data -public class BpmProcessInstanceStatusEvent extends ApplicationEvent { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - /** - * æµç¨‹å®žä¾‹çš„ key - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„ key ä¸èƒ½ä¸ºç©º") - private String processDefinitionKey; - /** - * æµç¨‹å®žä¾‹çš„结果 - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„状æ€ä¸èƒ½ä¸ºç©º") - private Integer status; - /** - * æµç¨‹å®žä¾‹å¯¹åº”的业务标识 - * ä¾‹å¦‚è¯´ï¼Œè¯·å‡ - */ - private String businessKey; - - public BpmProcessInstanceStatusEvent(Object source) { - super(source); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java deleted file mode 100644 index 553096a..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.zt.plat.module.bpm.api.event; - -import org.springframework.context.ApplicationListener; - -import java.util.List; - -/** - * {@link BpmProcessInstanceStatusEvent} 的监å¬å™¨ - * - * @author ZT - */ -public abstract class BpmProcessInstanceStatusEventListener - implements ApplicationListener { - - @Override - public final void onApplicationEvent(BpmProcessInstanceStatusEvent event) { - if (getProcessDefinitionKey().contains(event.getProcessDefinitionKey())){ - onEvent(event); - } - } - - /** - * @return 返回监å¬çš„æµç¨‹å®šä¹‰ Key - */ - protected abstract List getProcessDefinitionKey(); - - /** - * 处ç†äº‹ä»¶ - * - * @param event 事件 - */ - protected abstract void onEvent(BpmProcessInstanceStatusEvent event); - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApi.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApi.java deleted file mode 100644 index 5a2d905..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApi.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.zt.plat.module.bpm.api.task; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.module.bpm.api.task.dto.*; -import com.zt.plat.module.bpm.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@FeignClient(name = ApiConstants.NAME) // TODO ZT:fallbackFactory = -@Tag(name = "RPC æœåŠ¡ - æµç¨‹å®žä¾‹") -public interface BpmProcessInstanceApi { - - String PREFIX = ApiConstants.PREFIX + "/process-instance"; - - @PostMapping(PREFIX + "/create") - @Operation(summary = "创建æµç¨‹å®žä¾‹ï¼ˆæä¾›ç»™å†…部),返回实例编å·") - @Parameter(name = "userId", description = "用户编å·", required = true, example = "1") - CommonResult createProcessInstance(@RequestParam("userId") Long userId, - @Valid @RequestBody BpmProcessInstanceCreateReqDTO reqDTO); - - @GetMapping(PREFIX + "/get") - @Operation(summary = "获得指定æµç¨‹å®žä¾‹", description = "åœ¨ã€æµç¨‹è¯¦ç»†ã€‘界é¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - CommonResult getProcessInstance(@RequestParam("id") String id); - - @DeleteMapping(PREFIX + "/cancel-by-start-user") - @Operation(summary = "ç”¨æˆ·å–æ¶ˆæµç¨‹å®žä¾‹", description = "å–æ¶ˆå‘èµ·çš„æµç¨‹") - CommonResult cancelProcessInstanceByStartUser( - @RequestParam("userId") Long userId, - @Valid @RequestBody BpmProcessInstanceCancelReqDTO cancelReqDTO); - - @DeleteMapping(PREFIX + "/cancel-by-admin") - @Operation(summary = "管ç†å‘˜å–消æµç¨‹å®žä¾‹", description = "管ç†å‘˜æ’¤å›žæµç¨‹") - CommonResult cancelProcessInstanceByAdmin( - @RequestParam("userId") Long userId, - @Valid @RequestBody BpmProcessInstanceCancelReqDTO cancelReqDTO); - - @PostMapping(PREFIX + "/get-approval-detail") - @Operation(summary = "获得审批详情") - CommonResult getApprovalDetail(@RequestParam("userId") Long userId, - @Valid BpmApprovalDetailReqDTO reqDTO); - - @PostMapping(PREFIX + "/get-next-approval-nodes") - @Operation(summary = "获å–下一个执行的æµç¨‹èŠ‚ç‚¹") - CommonResult> getNextApprovalNodes(@RequestParam("userId") Long userId, - @Valid BpmApprovalDetailReqDTO reqDTO); - - @PostMapping(PREFIX + "/get-bpmn-model-view") - @Operation(summary = "èŽ·å–æµç¨‹å®žä¾‹çš„ BPMN 模型视图", description = "åœ¨ã€æµç¨‹è¯¦ç»†ã€‘界é¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - CommonResult getProcessInstanceBpmnModelView(@RequestParam(value = "id") String id); - - @PutMapping(PREFIX + "/approveTask") - @Operation(summary = "通过任务") - CommonResult approveTask(@Valid @RequestBody BpmTaskApproveReqDTO reqVO); - - @PutMapping(PREFIX + "/rejectTask") - @Operation(summary = "ä¸é€šè¿‡ä»»åŠ¡") - CommonResult rejectTask(@Valid @RequestBody BpmTaskRejectReqDTO reqVO); - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApi.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApi.java deleted file mode 100644 index b55ae5c..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApi.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.zt.plat.module.bpm.api.task; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.module.bpm.api.task.dto.BpmTaskPageReqDTO; -import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; -import com.zt.plat.module.bpm.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC æœåŠ¡ - æµç¨‹ä»»åŠ¡å®žä¾‹") -public interface BpmTaskApi { - - String PREFIX = ApiConstants.PREFIX + "/task"; - - @PostMapping(PREFIX + "/todo-page") - @Operation(summary = "èŽ·å– Todo 待办任务分页") - CommonResult> getTaskTodoPage(@Valid @RequestBody BpmTaskPageReqDTO pageReqDTO); - - @PostMapping(PREFIX + "/done-page") - @Operation(summary = "èŽ·å– Done 已办任务分页") - CommonResult> getTaskDonePage(@Valid @RequestBody BpmTaskPageReqDTO pageReqDTO); - - @PostMapping(PREFIX + "/manager-page") - @Operation(summary = "获å–全部任务的分页", description = "ç”¨äºŽã€æµç¨‹ä»»åŠ¡ã€‘èœå•") - CommonResult> getTaskManagerPage(@Valid @RequestBody BpmTaskPageReqDTO pageReqDTO); - - @GetMapping(PREFIX + "/list-by-process-instance-id") - @Operation(summary = "获得指定æµç¨‹å®žä¾‹çš„任务列表", description = "包括完æˆçš„ã€æœªå®Œæˆçš„") - @Parameter(name = "processInstanceId", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - CommonResult> getTaskListByProcessInstanceId( - @RequestParam("processInstanceId") String processInstanceId); - - @GetMapping(PREFIX + "/list-by-return") - @Operation(summary = "èŽ·å–æ‰€æœ‰å¯é€€å›žçš„节点", description = "ç”¨äºŽã€æµç¨‹è¯¦æƒ…】的ã€é€€å›žã€‘按钮") - @Parameter(name = "id", description = "当å‰ä»»åŠ¡ID", required = true) - CommonResult> getTaskListByReturn(@RequestParam("id") String id); - - @GetMapping(PREFIX + "/list-by-parent-task-id") - @Operation(summary = "获得指定父级任务的å­ä»»åŠ¡åˆ—è¡¨") // ç›®å‰ç”¨äºŽï¼Œå‡ç­¾çš„æ—¶å€™ï¼ŒèŽ·å¾—å­ä»»åŠ¡åˆ—è¡¨ - @Parameter(name = "parentTaskId", description = "父级任务编å·", required = true) - CommonResult> getTaskListByParentTaskId(@RequestParam("parentTaskId") String parentTaskId); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailReqDTO.java deleted file mode 100644 index 2dc63a6..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailReqDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.AssertTrue; -import lombok.Data; - -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - 审批详情 Request DTO") -@Data -public class BpmApprovalDetailReqDTO { - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "1024") - private String processDefinitionId; // 使用场景:å‘èµ·æµç¨‹æ—¶ï¼Œä¼ æµç¨‹å®šä¹‰ ID - - @Schema(description = "æµç¨‹å˜é‡") - private Map processVariables; // ä½¿ç”¨åœºæ™¯ï¼šåŒ processDefinitionId,用于æµç¨‹é¢„测 - - @Schema(description = "æµç¨‹å˜é‡") - private String processVariablesStr; // 解决 GET æ— æ³•ä¼ é€’å¯¹è±¡çš„é—®é¢˜ï¼Œæœ€ç»ˆè½¬æ¢æˆ processVariables å˜é‡ - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", example = "1024") - private String processInstanceId; // 使用场景:æµç¨‹å·²å‘起时候传æµç¨‹å®žä¾‹ ID - - // TODO @ZTï¼šå¦‚æžœæœªæ¥ BPMN 增加æµç¨‹å›¾ï¼Œå®ƒæ²¡æœ‰å‘起人节点,会有问题。 - @Schema(description = "æµç¨‹æ´»åŠ¨ç¼–å·", example = "StartUserNode") - private String activityId; // 用于获å–è¡¨å•æƒé™ã€‚1)å‘èµ·æµç¨‹æ—¶ï¼Œä¼ "å‘起人节点" activityId å¯èŽ·å–å‘èµ·äººçš„è¡¨å•æƒé™ï¼›2)从抄é€åˆ—表界é¢è¿›æ¥æ—¶ï¼Œä¼ æŠ„é€çš„ activityId å¯è޷喿Єé€äººçš„è¡¨å•æƒé™ï¼› - - @Schema(description = "æµç¨‹ä»»åŠ¡ç¼–å·", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b") - private String taskId; // 用于获å–è¡¨å•æƒé™ã€‚1)从待审批/已审批界é¢è¿›æ¥æ—¶ï¼Œä¼ é€’ taskId 任务编å·ï¼Œå¯èŽ·å–任务节点的å˜å¾—æƒé™ - - @AssertTrue(message = "æµç¨‹å®šä¹‰çš„ç¼–å·å’Œæµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½åŒæ—¶ä¸ºç©º") - @JsonIgnore - public boolean isValidProcessParam() { - return StrUtil.isNotEmpty(processDefinitionId) || StrUtil.isNotEmpty(processInstanceId); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailRespDTO.java deleted file mode 100644 index 3183561..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmApprovalDetailRespDTO.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - - -@Schema(description = "RPC æœåŠ¡ - 审批详情 Response DTO") -@Data -public class BpmApprovalDetailRespDTO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmProcessInstanceStatusEnum 枚举 - - @Schema(description = "活动节点列表", requiredMode = Schema.RequiredMode.REQUIRED) - private List activityNodes; - - @Schema(description = "表å•字段æƒé™") - private Map formFieldsPermission; - - @Schema(description = "待办任务") - private BpmTaskRespDTO todoTask; - - /** - * 所属æµç¨‹å®šä¹‰ä¿¡æ¯ - */ - private BpmProcessDefinitionRespDTO processDefinition; - - /** - * 所属æµç¨‹å®žä¾‹ä¿¡æ¯ - */ - private BpmProcessInstanceRespDTO processInstance; - - @Schema(description = "活动节点信æ¯") - @Data - public static class ActivityNode { - - @Schema(description = "节点编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode") - private String id; - - @Schema(description = "节点åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "å‘起人") - private String name; - - @Schema(description = "节点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer nodeType; // å‚è§ BpmSimpleModelNodeType 枚举 - - @Schema(description = "节点状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; // å‚è§ BpmTaskStatusEnum 枚举 - - @Schema(description = "节点的开始时间") - private LocalDateTime startTime; - @Schema(description = "èŠ‚ç‚¹çš„ç»“æŸæ—¶é—´") - private LocalDateTime endTime; - - @Schema(description = "审批节点的任务信æ¯") - private List tasks; - - @Schema(description = "候选人策略", example = "35") - private Integer candidateStrategy; // å‚è§ BpmTaskCandidateStrategyEnum 枚举。主è¦ç”¨äºŽå‘èµ·æ—¶ï¼Œå®¡æ‰¹èŠ‚ç‚¹ã€æŠ„é€èŠ‚ç‚¹è‡ªé€‰ - - @Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 candidateUsers - private List candidateUserIds; - - @Schema(description = "候选人用户列表") - private List candidateUsers; // åªåŒ…嫿œªç”Ÿæˆ ApprovalTaskInfo 的用户列表 - - @Schema(description = "æµç¨‹ç¼–å·", example = "8761d8e0-0922-11f0-bd37-00ff1db677bf") - private String processInstanceId; // å½“ä¸”ä»…å½“ï¼Œè¯¥èŠ‚ç‚¹æ˜¯å­æµç¨‹èŠ‚ç‚¹æ—¶ï¼Œæ‰ä¼šæœ‰å€¼ï¼ˆCallActivity çš„ processInstanceId 字段) - - } - - @Schema(description = "活动节点的任务信æ¯") - @Data - public static class ActivityNodeTask { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String id; - - @Schema(description = "任务所属人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 ownerUser - private Long owner; - - @Schema(description = "任务所属人", example = "1024") - private UserSimpleDTO ownerUser; - - @Schema(description = "任务分é…人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 assigneeUser - private Long assignee; - - @Schema(description = "任务分é…人", example = "2048") - private UserSimpleDTO assigneeUser; - - @Schema(description = "任务状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmTaskStatusEnum 枚举 - - @Schema(description = "审批æ„è§", example = "åŒæ„") - private String reason; - - @Schema(description = "ç­¾å", example = "https://www.iocoder.cn/sign.png") - private String signPicUrl; - - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java deleted file mode 100644 index 81aec42..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹å®šä¹‰ Response DTO") -@Data -public class BpmProcessDefinitionRespDTO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "æµç¨‹æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_order") - private String key; - - @Schema(description = "æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "è¯·å‡æµç¨‹") - private String name; - - @Schema(description = "æµç¨‹æè¿°", example = "è¯·å‡æµç¨‹æè¿°") - private String description; - - @Schema(description = "æµç¨‹åˆ†ç±»", requiredMode = Schema.RequiredMode.REQUIRED, example = "oa") - private String category; - - @Schema(description = "表å•类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer formType; - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long formId; - - @Schema(description = "表å•çš„é…ç½®", requiredMode = Schema.RequiredMode.REQUIRED) - private String formConf; - - @Schema(description = "表å•项的数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List formFields; - - @Schema(description = "表å•项的 JSON 数组字符串", requiredMode = Schema.RequiredMode.REQUIRED) - private String formFieldsStr; - - @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) - private String bpmnXml; - - @Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer version; - - @Schema(description = "æ˜¯å¦æŒ‚èµ·", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Integer suspensionState; - - @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime deploymentTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceBpmnModelViewRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceBpmnModelViewRespDTO.java deleted file mode 100644 index 9b1f2c3..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceBpmnModelViewRespDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; -import java.util.Set; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹ç¤ºä¾‹çš„ BPMN 视图 Response DTO") -@Data -public class BpmProcessInstanceBpmnModelViewRespDTO { - - // ========== åŸºæœ¬ä¿¡æ¯ ========== - - @Schema(description = "æµç¨‹å®žä¾‹ä¿¡æ¯", requiredMode = Schema.RequiredMode.REQUIRED) - private BpmProcessInstanceRespDTO processInstance; - - @Schema(description = "任务列表", requiredMode = Schema.RequiredMode.REQUIRED) - private List tasks; - - @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) - private String bpmnXml; - - @Schema(description = "SIMPLE 模型") - private BpmSimpleModelNodeDTO simpleModel; - - // ========== è¿›åº¦ä¿¡æ¯ ========== - - @Schema(description = "进行中的活动节点编å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set unfinishedTaskActivityIds; // åªåŒ…括 UserTask - - @Schema(description = "å·²ç»å®Œæˆçš„æ´»åŠ¨èŠ‚ç‚¹ç¼–å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set finishedTaskActivityIds; // 包括 UserTaskã€Gateway 等,ä¸åŒ…括 SequenceFlow - - @Schema(description = "å·²ç»å®Œæˆçš„连线节点编å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set finishedSequenceFlowActivityIds; // åªåŒ…括 SequenceFlow - - @Schema(description = "å·²ç»æ‹’ç»çš„æ´»åŠ¨èŠ‚ç‚¹ç¼–å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set rejectedTaskActivityIds; // åªåŒ…括 UserTask - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCancelReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCancelReqDTO.java deleted file mode 100644 index 15316d0..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCancelReqDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹å®žä¾‹çš„å–æ¶ˆ Request DTO") -@Data -public class BpmProcessInstanceCancelReqDTO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "å–æ¶ˆåŽŸå› ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¸è¯·å‡äº†ï¼") - @NotEmpty(message = "å–æ¶ˆåŽŸå› ä¸èƒ½ä¸ºç©º") - private String reason; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java deleted file mode 100644 index 24b08a4..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹å®žä¾‹çš„创建 Request DTO") -@Data -public class BpmProcessInstanceCreateReqDTO { - - @Schema(description = "æµç¨‹å®šä¹‰çš„æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "leave") - @NotEmpty(message = "æµç¨‹å®šä¹‰çš„æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String processDefinitionKey; - - @Schema(description = "å˜é‡å®žä¾‹", requiredMode = Schema.RequiredMode.REQUIRED) - private Map variables; - - @Schema(description = "业务的唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "业务的唯一标识ä¸èƒ½ä¸ºç©º") - private String businessKey; // 例如说,请å‡ç”³è¯·çš„ç¼–å·ã€‚通过它,å¯ä»¥æŸ¥è¯¢åˆ°å¯¹åº”的实例 - - /** - * å‘起人自选审批人 Map - * - * key:taskKey ä»»åŠ¡ç¼–ç  - * value:审批人的数组 - * 例如:{ taskKey1 :[1, 2] },则表示 taskKey1 这个任务,æå‰è®¾å®šäº†ï¼Œç”± userId 为 1,2 的用户进行审批 - */ - @Schema(description = "å‘起人自选审批人 Map") - private Map> startUserSelectAssignees; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstancePageReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstancePageReqDTO.java deleted file mode 100644 index f23c182..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstancePageReqDTO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹å®žä¾‹åˆ†é¡µ Request DTO") -@Data -public class BpmProcessInstancePageReqDTO extends PageParam { - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", example = "1024") - private String id; - - @Schema(description = "æµç¨‹å®žä¾‹çš„åå­—", example = "ZT") - private String name; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @Schema(description = "æµç¨‹å®šä¹‰çš„æ ‡è¯†", example = "2048") - private String processDefinitionKey; // ç²¾å‡†åŒ¹é… - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", example = "1") - private Integer status; - - @Schema(description = "æµç¨‹å®žä¾‹çš„结果", example = "1") - private Integer result; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "ç»“æŸæ—¶é—´") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] endTime; - - @Schema(description = "å‘起用户编å·", example = "1024") - private Long startUserId; // 注æ„ï¼Œåªæœ‰åœ¨ã€æµç¨‹å®žä¾‹ã€‘èœå•,æ‰ä½¿ç”¨è¯¥å‚æ•° - - @Schema(description = "动æ€è¡¨å•字段查询 JSON Str", example = "{}") - private String formFieldsParams; // SpringMVC 在 get 请求下,无法方便的定义 Map ç±»åž‹çš„å‚æ•°ï¼Œæ‰€ä»¥é€šè¿‡ String 接收åŽï¼Œé€»è¾‘里é¢è½¬æ¢ - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java deleted file mode 100644 index eabc038..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import com.zt.plat.framework.common.core.KeyValue; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹å®žä¾‹ Response DTO") -@Data -public class BpmProcessInstanceRespDTO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", example = "1024") - private String id; - - @Schema(description = "æµç¨‹å®žä¾‹çš„åå­—", example = "ZT") - private String name; - - @Schema(description = "æµç¨‹æ‘˜è¦") - private List> summary; // åªæœ‰æµç¨‹è¡¨å•ï¼Œæ‰æœ‰æ‘˜è¦ï¼ - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "æµç¨‹åˆ†ç±»åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "请å‡") - private String categoryName; - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", example = "1") - private Integer status; - - @Schema(description = "æµç¨‹å®žä¾‹çš„结果", example = "1") - private Integer result; - - @Schema(description = "å‘èµ·æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - - @Schema(description = "ç»“æŸæ—¶é—´") - private LocalDateTime endTime; - - @Schema(description = "æŒç»­æ—¶é—´", example = "1000") - private Long durationInMillis; - - @Schema(description = "æäº¤çš„表å•值", example = "{\"name\": \"ZT\"}") - private Map formVariables; - - @Schema(description = "业务的唯一标识", example = "1") - private String businessKey; - - /** - * å‘èµ·æµç¨‹çš„用户 - */ - private UserSimpleDTO startUser; - - /** - * æµç¨‹å®šä¹‰ - */ - private BpmProcessDefinitionRespDTO processDefinition; - - /** - * 当å‰å®¡æ‰¹ä¸­çš„任务 - */ - private List tasks; // 仅在æµç¨‹å®žä¾‹åˆ†é¡µæ‰è¿”回 - - @Schema(description = "æµç¨‹ä»»åŠ¡") - @Data - public static class Task { - - @Schema(description = "æµç¨‹ä»»åŠ¡çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "任务åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "任务分é…人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 assigneeUser - private Long assignee; - - @Schema(description = "任务分é…人", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - private UserSimpleDTO assigneeUser; - - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmSimpleModelNodeDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmSimpleModelNodeDTO.java deleted file mode 100644 index a01c60d..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmSimpleModelNodeDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - ç®€å•æ¨¡åž‹èŠ‚ç‚¹ DTO") -@Data -public class BpmSimpleModelNodeDTO { - - @Schema(description = "节点编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartNode") - private String id; - - @Schema(description = "节点åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "开始节点") - private String name; - - @Schema(description = "节点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - @Schema(description = "节点属性") - private Map attributes; - - @Schema(description = "å­èŠ‚ç‚¹åˆ—è¡¨") - private List childNode; - - @Schema(description = "æ¡ä»¶èŠ‚ç‚¹åˆ—è¡¨") - private List conditionNodes; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskApproveReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskApproveReqDTO.java deleted file mode 100644 index 705f930..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskApproveReqDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - 通过æµç¨‹ä»»åŠ¡çš„ Request DTO") -@Data -public class BpmTaskApproveReqDTO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "审批æ„è§", example = "ä¸é”™ä¸é”™ï¼") - private String reason; - - @Schema(description = "ç­¾å", example = "https://www.iocoder.cn/sign.png") - private String signPicUrl; - - @Schema(description = "å˜é‡å®žä¾‹ï¼ˆåЍæ€è¡¨å•)", requiredMode = Schema.RequiredMode.REQUIRED) - private Map variables; - - @Schema(description = "下一个节点审批人", example = "{nodeId:[1, 2]}") - private Map> nextAssignees; // 为什么是 Mapï¼Œè€Œä¸æ˜¯ List 呢?因为下一个节点å¯èƒ½æ˜¯å¤šä¸ªï¼Œä¾‹å¦‚说并行网关的情况 - - // 新增任务å˜é‡å®žä¾‹ï¼Œä¸šåŠ¡è¡¨å• - @Schema(description = "任务å˜é‡å®žä¾‹ï¼Œä¸šåŠ¡è¡¨å•", example = "{'formField1': 'value1', 'formField2': 'value2'}") - private Map taskVariables; -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskPageReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskPageReqDTO.java deleted file mode 100644 index 6ed4a8c..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskPageReqDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹ä»»åŠ¡åˆ†é¡µ Request DTO") -@Data -public class BpmTaskPageReqDTO extends PageParam { - - @Schema(description = "æµç¨‹ä»»åŠ¡å", example = "ZT") - private String name; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRejectReqDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRejectReqDTO.java deleted file mode 100644 index 94f73bf..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRejectReqDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "RPC æœåŠ¡ - ä¸é€šè¿‡æµç¨‹ä»»åŠ¡çš„ Request DTO") -@Data -public class BpmTaskRejectReqDTO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "审批æ„è§", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¸é”™ä¸é”™ï¼") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java deleted file mode 100644 index 17c5a44..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import com.zt.plat.framework.common.core.KeyValue; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -@Schema(description = "RPC æœåŠ¡ - æµç¨‹ä»»åŠ¡ Response DTO") -@Data -public class BpmTaskRespDTO { - - @Schema(description = "任务编å·", example = "1024") - private String id; - - @Schema(description = "任务åå­—", example = "ZT") - private String name; - - @Schema(description = "接收人的用户编å·", example = "1") - private Long assigneeUserId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - - @Schema(description = "ç»“æŸæ—¶é—´") - private LocalDateTime endTime; - - @Schema(description = "æŒç»­æ—¶é—´", example = "1000") - private Long durationInMillis; - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", example = "1024") - private String processInstanceId; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @Schema(description = "任务状æ€", example = "1") - private Integer status; - - @Schema(description = "审批建议", example = "ä¸é”™ä¸é”™ï¼") - private String reason; - - @Schema(description = "任务定义的标识", example = "Activity_one") - private String taskDefinitionKey; - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long formId; - - @Schema(description = "表å•路径", example = "/form/leave") - private String formPath; - - @Schema(description = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - - @Schema(description = "表å•çš„é…ç½®", example = "[]") - private String formConf; - - @Schema(description = "表å•项的数组", example = "[]") - private List formFields; - - @Schema(description = "æäº¤çš„表å•值", example = "{\"name\": \"ZT\"}") - private Map formVariables; - - @Schema(description = "任务负责人编å·", example = "2048") - private Long owner; - - @Schema(description = "负责人的用户信æ¯") - private UserSimpleDTO ownerUser; - - @Schema(description = "任务分é…人编å·", example = "2048") - private Long assignee; - - @Schema(description = "审核的用户信æ¯") - private UserSimpleDTO assigneeUser; - - @Schema(description = "父任务编å·", example = "1024") - private String parentTaskId; - - @Schema(description = "å­ä»»åŠ¡åˆ—è¡¨ï¼ˆç”±åŠ ç­¾ç”Ÿæˆï¼‰") - private List children; - - @Schema(description = "所属æµç¨‹å®žä¾‹") - private ProcessInstanceDTO processInstance; - - @Schema(description = "æ“作按钮设置值") - private Map buttonsSetting; - - @Schema(description = "是å¦éœ€è¦ç­¾å", example = "false") - private Boolean signEnable; - - @Schema(description = "是å¦å¡«å†™å®¡æ‰¹æ„è§", example = "false") - private Boolean reasonRequire; - - @Schema(description = "节点类型", example = "10") - private Integer nodeType; - - @Data - @Schema(description = "æµç¨‹å®žä¾‹ä¿¡æ¯") - public static class ProcessInstanceDTO { - - @Schema(description = "æµç¨‹å®žä¾‹ç¼–å·", example = "1024") - private String id; - - @Schema(description = "æµç¨‹å®žä¾‹åç§°", example = "ZT") - private String name; - - @Schema(description = "æäº¤æ—¶é—´") - private LocalDateTime createTime; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @Schema(description = "æµç¨‹æ‘˜è¦", example = "[]") - private List> summary; - - @Schema(description = "å‘起人的用户信æ¯") - private UserSimpleDTO startUser; - } - - @Data - @Schema(description = "æ“作按钮设置") - public static class OperationButtonSettingDTO { - - @Schema(description = "显示åç§°", example = "审批") - private String displayName; - - @Schema(description = "是å¦å¯ç”¨", example = "true") - private Boolean enable; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java deleted file mode 100644 index 295d43b..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.zt.plat.module.bpm.api.task.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "RPC æœåŠ¡ - ç”¨æˆ·ç²¾ç®€ä¿¡æ¯ DTO") -@Data -public class UserSimpleDTO { - - @Schema(description = "用户编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String nickname; - - @Schema(description = "用户头åƒ", example = "https://www.iocoder.cn/1.png") - private String avatar; - - @Schema(description = "部门编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long deptId; - - @Schema(description = "部门åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ç ”å‘部") - private String deptName; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ApiConstants.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ApiConstants.java deleted file mode 100644 index 3c4bac9..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ApiConstants.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.enums; - -import com.zt.plat.framework.common.enums.RpcConstants; - -/** - * API 相关的枚举 - * - * @author ZT - */ -public class ApiConstants { - - /** - * æœåŠ¡å - * - * 注æ„,需è¦ä¿è¯å’Œ spring.application.name ä¿æŒä¸€è‡´ - */ - public static final String NAME = "bpm-server"; - - public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/bpm"; - - public static final String VERSION = "1.0.0"; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/DictTypeConstants.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/DictTypeConstants.java deleted file mode 100644 index 13dcf72..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/DictTypeConstants.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zt.plat.module.bpm.enums; - -/** - * BPM 字典类型的枚举类 - * - * @author ZT - */ -public interface DictTypeConstants { - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ErrorCodeConstants.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ErrorCodeConstants.java deleted file mode 100644 index b9db1ed..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.zt.plat.module.bpm.enums; - -import com.zt.plat.framework.common.exception.ErrorCode; - -/** - * Bpm é”™è¯¯ç æžšä¸¾ç±» - *

- * bpm 系统,使用 1-009-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 通用æµç¨‹å¤„ç† æ¨¡å— 1-009-000-000 ========== - - // ========== OA æµç¨‹æ¨¡å— 1-009-001-000 ========== - ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1_009_001_001, "请å‡ç”³è¯·ä¸å­˜åœ¨"); - - // ========== æµç¨‹æ¨¡åž‹ 1-009-002-000 ========== - ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "å·²ç»å­˜åœ¨æµç¨‹æ ‡è¯†ä¸ºã€{}】的æµç¨‹"); - ErrorCode MODEL_NOT_EXISTS = new ErrorCode(1_009_002_001, "æµç¨‹æ¨¡åž‹ä¸å­˜åœ¨"); - ErrorCode MODEL_KEY_VALID = new ErrorCode(1_009_002_002, "æµç¨‹æ ‡è¯†æ ¼å¼ä¸æ­£ç¡®ï¼Œéœ€è¦ä»¥å­—æ¯æˆ–ä¸‹åˆ’çº¿å¼€å¤´ï¼ŒåŽæŽ¥ä»»æ„å­—æ¯ã€æ•°å­—ã€ä¸­åˆ’线ã€ä¸‹åˆ’线ã€å¥ç‚¹ï¼"); - ErrorCode MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG = new ErrorCode(1_009_002_003, "部署æµç¨‹å¤±è´¥ï¼ŒåŽŸå› ï¼šæµç¨‹è¡¨å•未é…置,请点击ã€ä¿®æ”¹æµç¨‹ã€‘按钮进行é…ç½®"); - ErrorCode MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG = new ErrorCode(1_009_002_004, "部署æµç¨‹å¤±è´¥ï¼Œ" + - "原因:用户任务({})未é…ç½®å®¡æ‰¹äººï¼Œè¯·ç‚¹å‡»ã€æµç¨‹è®¾è®¡ã€‘按钮,选择该它的ã€ä»»åŠ¡ï¼ˆå®¡æ‰¹äººï¼‰ã€‘è¿›è¡Œé…ç½®"); - ErrorCode MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS = new ErrorCode(1_009_002_005, "部署æµç¨‹å¤±è´¥ï¼ŒåŽŸå› ï¼šBPMN æµç¨‹å›¾ä¸­ï¼Œæ²¡æœ‰å¼€å§‹äº‹ä»¶"); - ErrorCode MODEL_DEPLOY_FAIL_BPMN_USER_TASK_NAME_NOT_EXISTS = new ErrorCode(1_009_002_006, "部署æµç¨‹å¤±è´¥ï¼ŒåŽŸå› ï¼šBPMN æµç¨‹å›¾ä¸­ï¼Œç”¨æˆ·ä»»åŠ¡({})çš„åå­—ä¸å­˜åœ¨"); - ErrorCode MODEL_UPDATE_FAIL_NOT_MANAGER = new ErrorCode(1_009_002_007, "æ“作æµç¨‹å¤±è´¥ï¼ŒåŽŸå› ï¼šä½ ä¸æ˜¯è¯¥æµç¨‹({})的管ç†å‘˜"); - ErrorCode MODEL_DEPLOY_FAIL_FIRST_USER_TASK_CANDIDATE_STRATEGY_ERROR = new ErrorCode(1_009_002_008, "部署æµç¨‹å¤±è´¥ï¼ŒåŽŸå› ï¼šé¦–ä¸ªä»»åŠ¡({})的审批人ä¸èƒ½æ˜¯ã€å®¡æ‰¹äººè‡ªé€‰ã€‘"); - - // ========== æµç¨‹å®šä¹‰ 1-009-003-000 ========== - ErrorCode PROCESS_DEFINITION_KEY_NOT_MATCH = new ErrorCode(1_009_003_000, "æµç¨‹å®šä¹‰çš„æ ‡è¯†æœŸæœ›æ˜¯({})ï¼Œå½“å‰æ˜¯({}),请修改 BPMN æµç¨‹å›¾"); - ErrorCode PROCESS_DEFINITION_NAME_NOT_MATCH = new ErrorCode(1_009_003_001, "æµç¨‹å®šä¹‰çš„å字期望是({})ï¼Œå½“å‰æ˜¯({}),请修改 BPMN æµç¨‹å›¾"); - ErrorCode PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_009_003_002, "æµç¨‹å®šä¹‰ä¸å­˜åœ¨"); - ErrorCode PROCESS_DEFINITION_IS_SUSPENDED = new ErrorCode(1_009_003_003, "æµç¨‹å®šä¹‰å¤„于挂起状æ€"); - - // ========== æµç¨‹å®žä¾‹ 1-009-004-000 ========== - ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_004_000, "æµç¨‹å®žä¾‹ä¸å­˜åœ¨"); - ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS = new ErrorCode(1_009_004_001, "æµç¨‹å–消失败,æµç¨‹ä¸å¤„于è¿è¡Œä¸­"); - ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "æµç¨‹å–消失败,该æµç¨‹ä¸æ˜¯ä½ å‘èµ·çš„"); - ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "任务({})的候选人未é…ç½®"); - ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "任务({})的候选人({})ä¸å­˜åœ¨"); - ErrorCode PROCESS_INSTANCE_START_USER_CAN_START = new ErrorCode(1_009_004_005, "å‘èµ·æµç¨‹å¤±è´¥ï¼Œä½ æ²¡æœ‰æƒé™å‘起该æµç¨‹"); - ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW = new ErrorCode(1_009_004_005, "æµç¨‹å–消失败,该æµç¨‹ä¸å…è®¸å–æ¶ˆ"); - ErrorCode PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR = new ErrorCode(1_009_004_006, "æµç¨‹ Http 触å‘器请求调用失败"); - ErrorCode PROCESS_INSTANCE_APPROVE_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_007, "下一个任务({})的审批人未é…ç½®"); - ErrorCode PROCESS_INSTANCE_CANCEL_CHILD_FAIL_NOT_ALLOW = new ErrorCode(1_009_004_008, "å­æµç¨‹å–æ¶ˆå¤±è´¥ï¼Œå­æµç¨‹ä¸å…è®¸å–æ¶ˆ"); - - // ========== æµç¨‹ä»»åŠ¡ 1-009-005-000 ========== - ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "æ“ä½œå¤±è´¥ï¼ŒåŽŸå› ï¼šè¯¥ä»»åŠ¡çš„å®¡æ‰¹äººä¸æ˜¯ä½ "); - ErrorCode TASK_NOT_EXISTS = new ErrorCode(1_009_005_002, "æµç¨‹ä»»åŠ¡ä¸å­˜åœ¨"); - ErrorCode TASK_IS_PENDING = new ErrorCode(1_009_005_003, "当å‰ä»»åŠ¡å¤„äºŽæŒ‚èµ·çŠ¶æ€ï¼Œä¸èƒ½æ“作"); - ErrorCode TASK_TARGET_NODE_NOT_EXISTS = new ErrorCode(1_009_005_004, " 目标节点ä¸å­˜åœ¨"); - ErrorCode TASK_RETURN_FAIL_SOURCE_TARGET_ERROR = new ErrorCode(1_009_005_006, "退回任务失败,目标节点是在并行网关上或éžåŒä¸€è·¯çº¿ä¸Šï¼Œä¸å¯è·³è½¬"); - ErrorCode TASK_DELEGATE_FAIL_USER_REPEAT = new ErrorCode(1_009_005_007, "任务委派失败,委派人和当å‰å®¡æ‰¹äººä¸ºåŒä¸€äºº"); - ErrorCode TASK_DELEGATE_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_008, "任务委派失败,被委派人ä¸å­˜åœ¨"); - ErrorCode TASK_SIGN_CREATE_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户ä¸å­˜åœ¨"); - ErrorCode TASK_SIGN_CREATE_TYPE_ERROR = new ErrorCode(1_009_005_010, "任务加签:当å‰ä»»åС已ç»{},ä¸èƒ½{}"); - ErrorCode TASK_SIGN_CREATE_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]é‡å¤"); - ErrorCode TASK_SIGN_DELETE_NO_PARENT = new ErrorCode(1_009_005_012, "任务å‡ç­¾å¤±è´¥ï¼Œè¢«å‡ç­¾çš„任务必须是通过加签生æˆçš„任务"); - ErrorCode TASK_TRANSFER_FAIL_USER_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当å‰å®¡æ‰¹äººä¸ºåŒä¸€äºº"); - ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人ä¸å­˜åœ¨"); - ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "æ“作失败,原因:找ä¸åˆ°ä»»åŠ¡çš„å®¡æ‰¹äººï¼"); - ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "ç­¾åä¸èƒ½ä¸ºç©ºï¼"); - ErrorCode TASK_REASON_REQUIRE = new ErrorCode(1_009_005_016, "审批æ„è§ä¸èƒ½ä¸ºç©ºï¼"); - - // ========== 动æ€è¡¨å•æ¨¡å— 1-009-010-000 ========== - ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动æ€è¡¨å•ä¸å­˜åœ¨"); - ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表å•项({}) å’Œ ({}) 使用了相åŒçš„字段å({})"); - - // ========== ç”¨æˆ·ç»„æ¨¡å— 1-009-011-000 ========== - ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1_009_011_000, "用户分组ä¸å­˜åœ¨"); - ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1_009_011_001, "å字为ã€{}】的用户分组已被ç¦ç”¨"); - - // ========== ç”¨æˆ·ç»„æ¨¡å— 1-009-012-000 ========== - ErrorCode CATEGORY_NOT_EXISTS = new ErrorCode(1_009_012_000, "æµç¨‹åˆ†ç±»ä¸å­˜åœ¨"); - ErrorCode CATEGORY_NAME_DUPLICATE = new ErrorCode(1_009_012_001, "æµç¨‹åˆ†ç±»åå­—ã€{}】é‡å¤"); - ErrorCode CATEGORY_CODE_DUPLICATE = new ErrorCode(1_009_012_002, "æµç¨‹åˆ†ç±»ç¼–ç ã€{}】é‡å¤"); - - // ========== BPM æµç¨‹ç›‘å¬å™¨ 1-009-013-000 ========== - ErrorCode PROCESS_LISTENER_NOT_EXISTS = new ErrorCode(1_009_013_000, "æµç¨‹ç›‘å¬å™¨ä¸å­˜åœ¨"); - ErrorCode PROCESS_LISTENER_CLASS_NOT_FOUND = new ErrorCode(1_009_013_001, "æµç¨‹ç›‘å¬å™¨ç±»({})ä¸å­˜åœ¨"); - ErrorCode PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR = new ErrorCode(1_009_013_002, "æµç¨‹ç›‘å¬å™¨ç±»({})没有实现接å£({})"); - ErrorCode PROCESS_LISTENER_EXPRESSION_INVALID = new ErrorCode(1_009_013_003, "æµç¨‹ç›‘å¬å™¨è¡¨è¾¾å¼({})ä¸åˆæ³•"); - - // ========== BPM æµç¨‹è¡¨è¾¾å¼ 1-009-014-000 ========== - ErrorCode PROCESS_EXPRESSION_NOT_EXISTS = new ErrorCode(1_009_014_000, "æµç¨‹è¡¨è¾¾å¼ä¸å­˜åœ¨"); - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java deleted file mode 100644 index 2611d38..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 自动去é‡çš„类型的枚举 - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmAutoApproveTypeEnum implements ArrayValuable { - - NONE(0, "ä¸è‡ªåŠ¨é€šè¿‡"), - APPROVE_ALL(1, "仅审批一次,åŽç»­é‡å¤çš„审批节点å‡è‡ªåŠ¨é€šè¿‡"), - APPROVE_SEQUENT(2, "仅针对连续审批的节点自动通过"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmAutoApproveTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java deleted file mode 100644 index d168f66..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM 边界事件 (boundary event) 自定义类型枚举 - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmBoundaryEventTypeEnum { - - USER_TASK_TIMEOUT(1, "用户任务超时"), - DELAY_TIMER_TIMEOUT(2, "延迟器超时"), - CHILD_PROCESS_TIMEOUT(3, "å­æµç¨‹è¶…æ—¶"); - - private final Integer type; - private final String name; - - public static BpmBoundaryEventTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(eventType -> eventType.getType().equals(type), values()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessMultiInstanceSourceTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessMultiInstanceSourceTypeEnum.java deleted file mode 100644 index 68574cb..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessMultiInstanceSourceTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM å­æµç¨‹å¤šå®žä¾‹æ¥æºç±»åž‹æžšä¸¾ - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmChildProcessMultiInstanceSourceTypeEnum implements ArrayValuable { - - FIXED_QUANTITY(1, "固定数é‡"), - NUMBER_FORM(2, "数字表å•"), - MULTIPLE_FORM(3, "多选表å•"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmChildProcessMultiInstanceSourceTypeEnum::getType).toArray(Integer[]::new); - - public static BpmChildProcessMultiInstanceSourceTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserEmptyTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserEmptyTypeEnum.java deleted file mode 100644 index 5b13462..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserEmptyTypeEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 当孿µç¨‹å‘起人为空时类型枚举 - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmChildProcessStartUserEmptyTypeEnum implements ArrayValuable { - - MAIN_PROCESS_START_USER(1, "åŒä¸»æµç¨‹å‘起人"), - CHILD_PROCESS_ADMIN(2, "å­æµç¨‹ç®¡ç†å‘˜"), - MAIN_PROCESS_ADMIN(3, "主æµç¨‹ç®¡ç†å‘˜"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmChildProcessStartUserEmptyTypeEnum::getType).toArray(Integer[]::new); - - public static BpmChildProcessStartUserEmptyTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserTypeEnum.java deleted file mode 100644 index 8470a72..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmChildProcessStartUserTypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM å­æµç¨‹å‘起人类型枚举 - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmChildProcessStartUserTypeEnum implements ArrayValuable { - - MAIN_PROCESS_START_USER(1, "åŒä¸»æµç¨‹å‘起人"), - FROM_FORM(2, "表å•"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmChildProcessStartUserTypeEnum::getType).toArray(Integer[]::new); - - public static BpmChildProcessStartUserTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java deleted file mode 100644 index aabaef0..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 延迟器类型枚举 - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmDelayTimerTypeEnum implements ArrayValuable { - - FIXED_TIME_DURATION(1, "固定时长"), - FIXED_DATE_TIME(2, "固定日期"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmDelayTimerTypeEnum::getType).toArray(Integer[]::new); - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmFieldPermissionEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmFieldPermissionEnum.java deleted file mode 100644 index 8571f90..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmFieldPermissionEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM è¡¨å•æƒé™çš„æžšä¸¾ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmFieldPermissionEnum { - - READ(1, "åªè¯»"), - WRITE(2, "å¯ç¼–辑"), - NONE(3, "éšè—"); - - /** - * æƒé™ - */ - private final Integer permission; - /** - * åå­— - */ - private final String name; - - public static BpmFieldPermissionEnum valueOf(Integer permission) { - return ArrayUtil.firstMatch(item -> item.getPermission().equals(permission), values()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java deleted file mode 100644 index dd1fc50..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM HTTP è¯·æ±‚å‚æ•°è®¾ç½®ç±»åž‹ã€‚用于 Simple 设计器任务监å¬å™¨å’Œè§¦å‘器é…置。 - * - * @author Lesan - */ -@Getter -@AllArgsConstructor -public enum BpmHttpRequestParamTypeEnum implements ArrayValuable { - - FIXED_VALUE(1, "固定值"), - FROM_FORM(2, "表å•"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmHttpRequestParamTypeEnum::getType).toArray(Integer[]::new); - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelFormTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelFormTypeEnum.java deleted file mode 100644 index f28b1ed..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelFormTypeEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 模型的表å•类型的枚举 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmModelFormTypeEnum implements ArrayValuable { - - NORMAL(10, "æµç¨‹è¡¨å•"), // 对应 BpmFormDO - CUSTOM(20, "业务表å•") // 业务自己定义的表å•,自己进行数æ®çš„存储 - ; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmModelFormTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelTypeEnum.java deleted file mode 100644 index 259b365..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmModelTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 模型的类型的枚举 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmModelTypeEnum implements ArrayValuable { - - BPMN(10, "BPMN 设计器"), // https://bpmn.io/toolkit/bpmn-js/ - SIMPLE(20, "SIMPLE 设计器"); // å‚考钉钉ã€é£žä¹¦å·¥ä½œæµçš„设计器 - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmModelTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java deleted file mode 100644 index b1ecfe4..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM æµç¨‹ç›‘å¬å™¨çš„类型 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmProcessListenerTypeEnum { - - EXECUTION("execution", "执行监å¬å™¨"), - TASK("task", "任务执行器"); - - private final String type; - private final String name; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java deleted file mode 100644 index 7ff961b..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM æµç¨‹ç›‘å¬å™¨çš„值类型 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmProcessListenerValueTypeEnum { - - CLASS("class", "Java ç±»"), - DELEGATE_EXPRESSION("delegateExpression", "代ç†è¡¨è¾¾å¼"), - EXPRESSION("expression", "表达å¼"); - - private final String type; - private final String name; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java deleted file mode 100644 index b8c8ee2..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 仿钉钉的æµç¨‹å™¨è®¾è®¡å™¨æ¡ä»¶èŠ‚ç‚¹çš„æ¡ä»¶ç±»åž‹ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmSimpleModeConditionTypeEnum implements ArrayValuable { - - EXPRESSION(1, "æ¡ä»¶è¡¨è¾¾å¼"), - RULE(2, "æ¡ä»¶è§„则"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmSimpleModeConditionTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - - private final String name; - - public static BpmSimpleModeConditionTypeEnum valueOf(Integer type) { - return ArrayUtil.firstMatch(nodeType -> nodeType.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java deleted file mode 100644 index 6590a4c..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; -import java.util.Objects; - -/** - * 仿钉钉的æµç¨‹å™¨è®¾è®¡å™¨çš„æ¨¡åž‹èŠ‚ç‚¹ç±»åž‹ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmSimpleModelNodeTypeEnum implements ArrayValuable { - - // 0 ~ 1 å¼€å§‹å’Œç»“æŸ - START_NODE(0, "开始", "startEvent"), - END_NODE(1, "结æŸ", "endEvent"), - - // 10 ~ 49 å„ç§èŠ‚ç‚¹ - START_USER_NODE(10, "å‘起人", "userTask"), // å‘起人节点。å‰ç«¯çš„开始节点,Id 固定 - APPROVE_NODE(11, "审批人", "userTask"), - COPY_NODE(12, "抄é€äºº", "serviceTask"), - TRANSACTOR_NODE(13, "办ç†äºº", "userTask"), - - DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), - TRIGGER_NODE(15, "触å‘器", "serviceTask"), - - CHILD_PROCESS(20, "å­æµç¨‹", "callActivity"), - - // 50 ~ æ¡ä»¶åˆ†æ”¯ - CONDITION_NODE(50, "æ¡ä»¶", "sequenceFlow"), // 用于构建æµè½¬æ¡ä»¶çš„è¡¨è¾¾å¼ - CONDITION_BRANCH_NODE(51, "æ¡ä»¶åˆ†æ”¯", "exclusiveGateway"), - PARALLEL_BRANCH_NODE(52, "并行分支", "parallelGateway"), - INCLUSIVE_BRANCH_NODE(53, "包容分支", "inclusiveGateway"), - ROUTER_BRANCH_NODE(54, "路由分支", "exclusiveGateway") - ; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmSimpleModelNodeTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - private final String name; - private final String bpmnType; - - /** - * 判断是å¦ä¸ºåˆ†æ”¯èŠ‚ç‚¹ - * - * @param type 节点类型 - */ - public static boolean isBranchNode(Integer type) { - return Objects.equals(CONDITION_BRANCH_NODE.getType(), type) - || Objects.equals(PARALLEL_BRANCH_NODE.getType(), type) - || Objects.equals(INCLUSIVE_BRANCH_NODE.getType(), type) - || Objects.equals(ROUTER_BRANCH_NODE.getType(), type); - } - - public static BpmSimpleModelNodeTypeEnum valueOf(Integer type) { - return ArrayUtil.firstMatch(nodeType -> nodeType.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmTriggerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmTriggerTypeEnum.java deleted file mode 100644 index 72c3c39..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmTriggerTypeEnum.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM Simple 触å‘器类型枚举 - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmTriggerTypeEnum implements ArrayValuable { - - HTTP_REQUEST(1, "å‘èµ· HTTP 请求"), // BPM => 业务,æµç¨‹ç»§ç»­æ‰§è¡Œï¼Œæ— éœ€ç­‰å¾…业务 - HTTP_CALLBACK(2, "接收 HTTP 回调"), // BPM => 业务 => BPM,æµç¨‹å¡ä¸»ï¼Œç­‰å¾…业务回调 - - FORM_UPDATE(10, "æ›´æ–°æµç¨‹è¡¨å•æ•°æ®"), - FORM_DELETE(11, "删除æµç¨‹è¡¨å•æ•°æ®"), - ; - - /** - * 触å‘器执行动作类型 - */ - private final Integer type; - - /** - * 触å‘器执行动作æè¿° - */ - private final String desc; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmTriggerTypeEnum::getType).toArray(Integer[]::new); - - @Override - public Integer[] array() { - return ARRAYS; - } - - public static BpmTriggerTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java deleted file mode 100644 index 065035d..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 多人审批方å¼çš„æžšä¸¾ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmUserTaskApproveMethodEnum implements ArrayValuable { - - RANDOM(1, "éšæœºæŒ‘选一人审批", null), - RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances/nrOfInstances >= %s}"), // 会签(按通过比例) - ANY(3, "多人或签(一人通过或拒ç»)", "${ nrOfCompletedInstances > 0 }"), // 或签(通过åªéœ€ä¸€äººï¼Œæ‹’ç»åªéœ€ä¸€äººï¼‰ - SEQUENTIAL(4, "便¬¡å®¡æ‰¹", "${ nrOfCompletedInstances >= nrOfInstances }"); // 便¬¡å®¡æ‰¹ - - /** - * å®¡æ‰¹æ–¹å¼ - */ - private final Integer method; - /** - * åå­— - */ - private final String name; - /** - * 完æˆè¡¨è¾¾å¼ - */ - private final String completionCondition; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskApproveMethodEnum::getMethod).toArray(Integer[]::new); - - public static BpmUserTaskApproveMethodEnum valueOf(Integer method) { - return ArrayUtil.firstMatch(item -> item.getMethod().equals(method), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java deleted file mode 100644 index df40e18..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 用户任务的审批类型枚举 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmUserTaskApproveTypeEnum implements ArrayValuable { - - USER(1), // 人工审批 - AUTO_APPROVE(2), // 自动通过 - AUTO_REJECT(3); // è‡ªåŠ¨æ‹’ç» - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskApproveTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java deleted file mode 100644 index 237ef8e..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * BPM 用户任务的审批人为空时,处ç†ç±»åž‹æžšä¸¾ - * - * @author ZT - */ -@RequiredArgsConstructor -@Getter -public enum BpmUserTaskAssignEmptyHandlerTypeEnum implements ArrayValuable { - - APPROVE(1), // 自动通过 - REJECT(2), // è‡ªåŠ¨æ‹’ç» - ASSIGN_USER(3), // 指定人员审批 - ASSIGN_ADMIN(4), // 转交给æµç¨‹ç®¡ç†å‘˜ - ; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskAssignEmptyHandlerTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java deleted file mode 100644 index ffed389..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * BPM 用户任务的审批人与å‘èµ·äººç›¸åŒæ—¶ï¼Œå¤„ç†ç±»åž‹æžšä¸¾ - * - * @author ZT - */ -@RequiredArgsConstructor -@Getter -public enum BpmUserTaskAssignStartUserHandlerTypeEnum implements ArrayValuable { - - START_USER_AUDIT(1), // ç”±å‘起人对自己审批 - SKIP(2), // 自动跳过ã€å‚考飞书】:1)如果当å‰èŠ‚ç‚¹è¿˜æœ‰å…¶ä»–å®¡æ‰¹äººï¼Œåˆ™äº¤ç”±å…¶ä»–å®¡æ‰¹äººè¿›è¡Œå®¡æ‰¹ï¼›2)如果当å‰èŠ‚ç‚¹æ²¡æœ‰å…¶ä»–å®¡æ‰¹äººï¼Œåˆ™è¯¥èŠ‚ç‚¹è‡ªåŠ¨é€šè¿‡ - TRANSFER_DEPT_LEADER(3); // 转交给部门负责人审批ã€å‚考飞书】:若部门负责人为空,则自动通过 - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskAssignStartUserHandlerTypeEnum::getType).toArray(Integer[]::new); - - private final Integer type; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java deleted file mode 100644 index f251971..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 用户任务拒ç»å¤„ç†ç±»åž‹æžšä¸¾ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmUserTaskRejectHandlerTypeEnum implements ArrayValuable { - - FINISH_PROCESS_INSTANCE(1, "终止æµç¨‹"), - RETURN_USER_TASK(2, "驳回到指定任务节点"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskRejectHandlerTypeEnum::getType).toArray(Integer[]::new); - - public static BpmUserTaskRejectHandlerTypeEnum typeOf(Integer type) { - return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java deleted file mode 100644 index 8f9460e..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.enums.definition; - -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 用户任务超时处ç†ç±»åž‹æžšä¸¾ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmUserTaskTimeoutHandlerTypeEnum implements ArrayValuable { - - REMINDER(1,"自动æé†’"), - APPROVE(2, "è‡ªåŠ¨åŒæ„"), - REJECT(3, "自动拒ç»"); - - private final Integer type; - private final String name; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskTimeoutHandlerTypeEnum::getType).toArray(Integer[]::new); - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/message/BpmMessageEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/message/BpmMessageEnum.java deleted file mode 100644 index d8db9ae..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/message/BpmMessageEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zt.plat.module.bpm.enums.message; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * Bpm 消æ¯çš„æžšä¸¾ - * - * @author ZT - */ -@AllArgsConstructor -@Getter -public enum BpmMessageEnum { - - PROCESS_INSTANCE_APPROVE("bpm_process_instance_approve"), // æµç¨‹ä»»åŠ¡è¢«å®¡æ‰¹é€šè¿‡æ—¶ï¼Œå‘é€ç»™ç”³è¯·äºº - PROCESS_INSTANCE_REJECT("bpm_process_instance_reject"), // æµç¨‹ä»»åŠ¡è¢«å®¡æ‰¹ä¸é€šè¿‡æ—¶ï¼Œå‘é€ç»™ç”³è¯·äºº - TASK_ASSIGNED("bpm_task_assigned"), // ä»»åŠ¡è¢«åˆ†é…æ—¶ï¼Œå‘é€ç»™å®¡æ‰¹äºº - TASK_TIMEOUT("bpm_task_timeout"); // 任务审批超时时,å‘é€ç»™å®¡æ‰¹äºº - - /** - * 短信模æ¿çš„æ ‡è¯† - * - * å…³è” SmsTemplateDO çš„ code 属性 - */ - private final String smsTemplateCode; - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmCommentTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmCommentTypeEnum.java deleted file mode 100644 index 51a5ffa..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmCommentTypeEnum.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.enums.task; - -import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹ä»»åŠ¡çš„ Comment 评论类型枚举 - * - * @author kehaiyou - */ -@Getter -@AllArgsConstructor -public enum BpmCommentTypeEnum { - - APPROVE("1", "审批通过", "审批通过,原因是:{}"), - REJECT("2", "ä¸é€šè¿‡", "审批ä¸é€šè¿‡ï¼šåŽŸå› æ˜¯ï¼š{}"), - CANCEL("3", "已喿¶ˆ", "ç³»ç»Ÿè‡ªåŠ¨å–æ¶ˆï¼ŒåŽŸå› æ˜¯ï¼š{}"), - RETURN("4", "退回", "任务被退回,原因是:{}"), - DELEGATE_START("5", "委派å‘èµ·", "[{}]将任务委派给[{}],委派ç†ç”±ä¸º:{}"), - DELEGATE_END("6", "委派完æˆ", "[{}]完æˆå§”æ´¾ä»»åŠ¡ï¼Œä»»åŠ¡é‡æ–°å›žåˆ°[{}]手中,审批建议为:{}"), - TRANSFER("7", "转派", "[{}]将任务转派给[{}],转派ç†ç”±ä¸º:{}"), - ADD_SIGN("8", "加签", "[{}]{}给了[{}],ç†ç”±ä¸ºï¼š{}"), - SUB_SIGN("9", "å‡ç­¾", "[{}]æ“作了ã€å‡ç­¾ã€‘,审批人[{}]çš„ä»»åŠ¡è¢«å–æ¶ˆ"), - ; - - /** - * æ“作类型 - * - * 由于 BPM Comment 类型为 String,所以这里就ä¸ä½¿ç”¨ Integer - */ - private final String type; - /** - * æ“作åå­— - */ - private final String name; - /** - * æ“作æè¿° - */ - private final String comment; - - public String formatComment(Object... params) { - return StrUtil.format(comment, params); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java deleted file mode 100644 index 0e61d22..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.zt.plat.module.bpm.enums.task; - -import com.zt.plat.framework.common.core.ArrayValuable; -import com.zt.plat.framework.common.util.object.ObjectUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; - -/** - * æµç¨‹å®žä¾‹ ProcessInstance çš„çŠ¶æ€ - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmProcessInstanceStatusEnum implements ArrayValuable { - - NOT_START(-1, "未开始"), - RUNNING(1, "审批中"), - APPROVE(2, "审批通过"), - REJECT(3, "审批ä¸é€šè¿‡"), - CANCEL(4, "已喿¶ˆ"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmProcessInstanceStatusEnum::getStatus).toArray(Integer[]::new); - - /** - * çŠ¶æ€ - */ - private final Integer status; - /** - * æè¿° - */ - private final String desc; - - @Override - public Integer[] array() { - return ARRAYS; - } - - public static boolean isRejectStatus(Integer status) { - return REJECT.getStatus().equals(status); - } - - public static boolean isProcessEndStatus(Integer status) { - return ObjectUtils.equalsAny(status, - APPROVE.getStatus(), REJECT.getStatus(), CANCEL.getStatus()); - } - - /** - * 通过æµç¨‹çš„状æ€è¿”回对应的枚举 - * @param status æµç¨‹çŠ¶æ€ - * @return - */ - public static BpmProcessInstanceStatusEnum getEnumByStatus(Integer status){ - for (BpmProcessInstanceStatusEnum e : BpmProcessInstanceStatusEnum.values()) { - if (e.getStatus().equals(status)) { - return e; - } - } - return NOT_START; - } - - /** - * 通过枚举æè¿°è¿”回对应的枚举 - * @param desc æè¿° - * @return - */ - public static BpmProcessInstanceStatusEnum getEnumByDesc(String desc){ - if (StringUtils.isEmpty(desc)) return NOT_START; - for (BpmProcessInstanceStatusEnum e : BpmProcessInstanceStatusEnum.values()) { - if (desc.equals(e.getDesc())) { - return e; - } - } - return NOT_START; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmReasonEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmReasonEnum.java deleted file mode 100644 index 8bf768f..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmReasonEnum.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.zt.plat.module.bpm.enums.task; - -import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹å®žä¾‹/任务的的处ç†åŽŸå› æžšä¸¾ - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmReasonEnum { - - // ========== æµç¨‹å®žä¾‹çš„独有原因 ========== - - REJECT_TASK("审批ä¸é€šè¿‡ä»»åŠ¡ï¼ŒåŽŸå› ï¼š{}"), // 场景:用户审批ä¸é€šè¿‡ä»»åŠ¡ã€‚ä¿®æ”¹æ–‡æ¡ˆæ—¶ï¼Œéœ€è¦æ³¨æ„ isRejectReason 方法 - CANCEL_PROCESS_INSTANCE_BY_START_USER("ç”¨æˆ·ä¸»åŠ¨å–æ¶ˆæµç¨‹ï¼ŒåŽŸå› ï¼š{}"), // åœºæ™¯ï¼šç”¨æˆ·ä¸»åŠ¨å–æ¶ˆæµç¨‹ - CANCEL_PROCESS_INSTANCE_BY_ADMIN("管ç†å‘˜ã€{}ã€‘å–æ¶ˆæµç¨‹ï¼ŒåŽŸå› ï¼š{}"), // 场景:管ç†å‘˜å–消æµç¨‹ - CANCEL_CHILD_PROCESS_INSTANCE_BY_MAIN_PROCESS("å­æµç¨‹è‡ªåЍ喿¶ˆï¼ŒåŽŸå› ï¼šä¸»æµç¨‹å·²å–消"), - - // ========== æµç¨‹ä»»åŠ¡çš„ç‹¬æœ‰åŽŸå›  ========== - - CANCEL_BY_SYSTEM("ç³»ç»Ÿè‡ªåŠ¨å–æ¶ˆ"), // 场景:éžå¸¸å¤šï¼Œæ¯”如说:1ï¼‰å¤šä»»åŠ¡å®¡æ‰¹å·²ç»æ»¡è¶³æ¡ä»¶ï¼Œæ— éœ€å®¡æ‰¹è¯¥ä»»åŠ¡ï¼›2)æµç¨‹å®žä¾‹è¢«å–消,无需审批该任务;等等 - TIMEOUT_APPROVE("审批超时,系统自动通过"), - TIMEOUT_REJECT("审批超时,系统自动ä¸é€šè¿‡"), - ASSIGN_START_USER_APPROVE("审批人与æäº¤äººä¸ºåŒä¸€äººæ—¶ï¼Œè‡ªåŠ¨é€šè¿‡"), - ASSIGN_START_USER_APPROVE_WHEN_SKIP("审批人与æäº¤äººä¸ºåŒä¸€äººæ—¶ï¼Œè‡ªåŠ¨é€šè¿‡"), - ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE("å‘起人节点首次自动通过"), // ç›®å‰ä»…â€œå­æµç¨‹â€ä½¿ç”¨ - ASSIGN_START_USER_APPROVE_WHEN_DEPT_LEADER_NOT_FOUND("审批人与æäº¤äººä¸ºåŒä¸€äººæ—¶ï¼Œæ‰¾ä¸åˆ°éƒ¨é—¨è´Ÿè´£äººï¼Œè‡ªåŠ¨é€šè¿‡"), - ASSIGN_START_USER_TRANSFER_DEPT_LEADER("审批人与æäº¤äººä¸ºåŒä¸€äººæ—¶ï¼Œè½¬äº¤ç»™éƒ¨é—¨è´Ÿè´£äººå®¡æ‰¹"), - ASSIGN_EMPTY_APPROVE("审批人为空,自动通过"), - ASSIGN_EMPTY_REJECT("审批人为空,自动ä¸é€šè¿‡"), - APPROVE_TYPE_AUTO_APPROVE("éžäººå·¥å®¡æ ¸ï¼Œè‡ªåŠ¨é€šè¿‡"), - APPROVE_TYPE_AUTO_REJECT("éžäººå·¥å®¡æ ¸ï¼Œè‡ªåЍä¸é€šè¿‡"), - CANCEL_BY_PROCESS_CLEAN("进程清ç†è‡ªåЍ喿¶ˆ"), - ; - - private final String reason; - - /** - * æ ¼å¼åŒ–ç†ç”± - * - * @param args 傿•° - * @return ç†ç”± - */ - public String format(Object... args) { - return StrUtil.format(reason, args); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskSignTypeEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskSignTypeEnum.java deleted file mode 100644 index 40aa2b1..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskSignTypeEnum.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.zt.plat.module.bpm.enums.task; - -import cn.hutool.core.util.ArrayUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹ä»»åŠ¡çš„åŠ ç­¾ç±»åž‹æžšä¸¾ - * - * @author kehaiyou - */ -@Getter -@AllArgsConstructor -public enum BpmTaskSignTypeEnum { - - /** - * å‘å‰åŠ ç­¾ï¼Œéœ€è¦å‰ç½®ä»»åŠ¡å®¡æ‰¹å®Œæˆï¼Œæ‰å›žåˆ°åŽŸå®¡æ‰¹äºº - */ - BEFORE("before", "å‘å‰åŠ ç­¾"), - /** - * å‘åŽåŠ ç­¾ï¼Œéœ€è¦åŽç½®ä»»åŠ¡å…¨éƒ¨å®¡æ‰¹å®Œï¼Œæ‰ä¼šé€šè¿‡åŽŸå®¡æ‰¹äººèŠ‚ç‚¹ - */ - AFTER("after", "å‘åŽåŠ ç­¾"); - - /** - * 类型 - */ - private final String type; - /** - * åå­— - */ - private final String name; - - public static String nameOfType(String type) { - for (BpmTaskSignTypeEnum value : values()) { - if (value.type.equals(type)) { - return value.name; - } - } - return null; - } - - public static BpmTaskSignTypeEnum of(String type) { - return ArrayUtil.firstMatch(value -> value.getType().equals(type), values()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskStatusEnum.java b/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskStatusEnum.java deleted file mode 100644 index 42ac7df..0000000 --- a/zt-module-bpm/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/enums/task/BpmTaskStatusEnum.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.zt.plat.module.bpm.enums.task; - -import cn.hutool.core.util.ObjUtil; -import com.zt.plat.framework.common.util.object.ObjectUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.apache.commons.lang3.StringUtils; - -/** - * æµç¨‹ä»»åŠ¡ Task çš„çŠ¶æ€æžšä¸¾ - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmTaskStatusEnum { - - NOT_START(-1, "未开始"), - RUNNING(1, "审批中"), - APPROVE(2, "审批通过"), - REJECT(3, "审批ä¸é€šè¿‡"), - CANCEL(4, "已喿¶ˆ"), - - RETURN(5, "已退回"), - - /** - * 使用场景: - * 1. 任务被å‘åŽã€åŠ ç­¾ã€‘æ—¶ï¼Œå®ƒåœ¨å®¡æ‰¹é€šè¿‡åŽï¼Œä¼šå˜æˆ APPROVING 这个状æ€ï¼Œç„¶åŽç­‰åˆ°ã€åŠ ç­¾ã€‘å‡ºæ¥çš„任务都被审批åŽï¼Œæ‰ä¼šå˜æˆ APPROVE 审批通过 - */ - APPROVING(7, "审批通过中"), - /** - * 使用场景: - * 1. 任务被å‘å‰ã€åŠ ç­¾ã€‘æ—¶ï¼Œå®ƒä¼šå˜æˆ WAIT 状æ€ï¼Œéœ€è¦ç­‰å¾…ã€åŠ ç­¾ã€‘å‡ºæ¥çš„任务被审批åŽï¼Œå®ƒæ‰èƒ½ç»§ç»­å˜ä¸º RUNNING 继续审批 - * 2. 任务被å‘åŽã€åŠ ç­¾ã€‘æ—¶ï¼Œã€åŠ ç­¾ã€‘å‡ºæ¥çš„任务处于 WAIT 状æ€ï¼Œå®ƒä»¬éœ€è¦ç­‰å¾…该任务被审批åŽï¼Œå®ƒä»¬æ‰èƒ½ç»§ç»­å˜ä¸º RUNNING 继续审批 - */ - WAIT(0, "待审批"); - - /** - * çŠ¶æ€ - *

- * å¦‚æžœæ–°å¢žæ—¶ï¼Œæ³¨æ„ {@link #isEndStatus(Integer)} 是å¦éœ€è¦å˜æ›´ - */ - private final Integer status; - /** - * åå­— - */ - private final String name; - - public static boolean isRejectStatus(Integer status) { - return REJECT.getStatus().equals(status); - } - - /** - * åˆ¤æ–­è¯¥çŠ¶æ€æ˜¯å¦å·²ç»å¤„于 End æœ€ç»ˆçŠ¶æ€ - *

- * 主è¦ç”¨äºŽä¸€äº›çŠ¶æ€æ›´æ–°çš„é€»è¾‘ï¼Œå¦‚æžœå·²ç»æ˜¯æœ€ç»ˆçжæ€ï¼Œå°±ä¸å†è¿›è¡Œæ›´æ–° - * - * @param status çŠ¶æ€ - * @return æ˜¯å¦ - */ - public static boolean isEndStatus(Integer status) { - return ObjectUtils.equalsAny(status, - APPROVE.getStatus(), REJECT.getStatus(), CANCEL.getStatus(), - RETURN.getStatus(), APPROVING.getStatus()); - } - - public static boolean isCancelStatus(Integer status) { - return ObjUtil.equal(status, CANCEL.getStatus()); - } - - - /** - * 通过æµç¨‹çš„状æ€è¿”回对应的枚举 - * @param status æµç¨‹çŠ¶æ€ - * @return - */ - public static BpmTaskStatusEnum getEnumByStatus(Integer status){ - for (BpmTaskStatusEnum e : BpmTaskStatusEnum.values()) { - if (e.getStatus().equals(status)) { - return e; - } - } - return NOT_START; - } - - /** - * 通过枚举æè¿°è¿”回对应的枚举 - * @param name æè¿° - * @return - */ - public static BpmTaskStatusEnum getEnumByName(String name){ - if (StringUtils.isEmpty(name)) return NOT_START; - for (BpmTaskStatusEnum e : BpmTaskStatusEnum.values()) { - if (name.equals(e.getName())) { - return e; - } - } - return NOT_START; - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/pom.xml b/zt-module-bpm/zt-module-bpm-server/pom.xml index 72239fb..cebf709 100644 --- a/zt-module-bpm/zt-module-bpm-server/pom.xml +++ b/zt-module-bpm/zt-module-bpm-server/pom.xml @@ -4,11 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> com.zt.plat - zt-module-bpm + zt-module-bpm-dsc ${revision} 4.0.0 - zt-module-bpm-server + zt-module-bpm-server-dsc ${project.artifactId} @@ -28,6 +28,16 @@ zt-module-bpm-api ${revision} + + com.zt.plat + zt-module-bpm-server + ${revision} + + + com.zt.plat + zt-module-bpm-api-dsc + ${revision} + com.zt.plat zt-module-system-api diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java deleted file mode 100644 index fe4cc83..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java +++ /dev/null @@ -1,778 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package com.alibaba.druid.pool; - -import com.alibaba.cloud.commons.lang.StringUtils; -import com.alibaba.druid.VERSION; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.JdbcUtils; -import com.alibaba.druid.util.MySqlUtils; - -import java.net.SocketTimeoutException; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -public class DruidPooledStatement extends PoolableWrapper implements Statement { - private static final Log LOG = LogFactory.getLog(DruidPooledStatement.class); - private final Statement stmt; - protected DruidPooledConnection conn; - protected List resultSetTrace; - protected boolean closed; - protected int fetchRowPeak = -1; - protected int exceptionCount; - - public DruidPooledStatement(DruidPooledConnection conn, Statement stmt) { - super(stmt); - this.conn = conn; - this.stmt = stmt; - } - - protected void addResultSetTrace(ResultSet resultSet) { - if (this.resultSetTrace == null) { - this.resultSetTrace = new ArrayList(1); - } else if (this.resultSetTrace.size() > 0) { - int lastIndex = this.resultSetTrace.size() - 1; - ResultSet lastResultSet = (ResultSet)this.resultSetTrace.get(lastIndex); - - try { - if (lastResultSet.isClosed()) { - this.resultSetTrace.set(lastIndex, resultSet); - return; - } - } catch (SQLException var5) { - } - } - - this.resultSetTrace.add(resultSet); - } - - protected void recordFetchRowCount(int fetchRowCount) { - if (this.fetchRowPeak < fetchRowCount) { - this.fetchRowPeak = fetchRowCount; - } - - } - - public int getFetchRowPeak() { - return this.fetchRowPeak; - } - - protected SQLException checkException(Throwable error) throws SQLException { - String sql = null; - if (this instanceof DruidPooledPreparedStatement) { - sql = ((DruidPooledPreparedStatement)this).getSql(); - } - - this.handleSocketTimeout(error); - ++this.exceptionCount; - return this.conn.handleException(error, sql); - } - - protected SQLException checkException(Throwable error, String sql) throws SQLException { - this.handleSocketTimeout(error); - ++this.exceptionCount; - return this.conn.handleException(error, sql); - } - - protected void handleSocketTimeout(Throwable error) throws SQLException { - if (this.conn != null && this.conn.transactionInfo == null && this.conn.holder != null) { - DruidDataSource dataSource = null; - DruidConnectionHolder holder = this.conn.holder; - if (holder.dataSource instanceof DruidDataSource) { - dataSource = (DruidDataSource)holder.dataSource; - } - - if (dataSource != null) { - if (dataSource.killWhenSocketReadTimeout) { - SQLException sqlException = null; - if (error instanceof SQLException) { - sqlException = (SQLException)error; - } - - if (sqlException != null) { - Throwable cause = error.getCause(); - boolean socketReadTimeout = cause instanceof SocketTimeoutException && "Read timed out".equals(cause.getMessage()); - if (socketReadTimeout) { - if (JdbcUtils.isMysqlDbType(dataSource.dbTypeName)) { - String killQuery = MySqlUtils.buildKillQuerySql(this.conn.getConnection(), (SQLException)error); - if (killQuery != null) { - DruidPooledConnection killQueryConn = null; - Statement killQueryStmt = null; - - try { - killQueryConn = dataSource.getConnection(1000L); - if (killQueryConn != null) { - killQueryStmt = killQueryConn.createStatement(); - killQueryStmt.execute(killQuery); - if (LOG.isDebugEnabled()) { - LOG.debug(killQuery + " success."); - } - - return; - } - } catch (Exception ex) { - LOG.warn(killQuery + " error.", ex); - return; - } finally { - JdbcUtils.close(killQueryStmt); - JdbcUtils.close(killQueryConn); - } - - } - } - } - } - } - } - } - } - - public DruidPooledConnection getPoolableConnection() { - return this.conn; - } - - public Statement getStatement() { - return this.stmt; - } - - protected void checkOpen() throws SQLException { - if (this.closed) { - Throwable disableError = null; - if (this.conn != null) { - disableError = this.conn.getDisableError(); - } - - if (disableError != null) { - throw new SQLException("statement is closed", disableError); - } else { - throw new SQLException("statement is closed"); - } - } - } - - protected void clearResultSet() { - if (this.resultSetTrace != null) { - for(ResultSet rs : this.resultSetTrace) { - try { - if (!rs.isClosed()) { - rs.close(); - } - } catch (SQLException ex) { - LOG.error("clearResultSet error", ex); - } - } - - this.resultSetTrace.clear(); - } - } - - public void incrementExecuteCount() { - DruidPooledConnection conn = this.getPoolableConnection(); - if (conn != null) { - DruidConnectionHolder holder = conn.getConnectionHolder(); - if (holder != null) { - DruidAbstractDataSource dataSource = holder.getDataSource(); - if (dataSource != null) { - dataSource.incrementExecuteCount(); - } - } - } - } - - public void incrementExecuteBatchCount() { - DruidPooledConnection conn = this.getPoolableConnection(); - if (conn != null) { - DruidConnectionHolder holder = conn.getConnectionHolder(); - if (holder != null) { - if (holder.getDataSource() != null) { - DruidAbstractDataSource dataSource = holder.getDataSource(); - if (dataSource != null) { - dataSource.incrementExecuteBatchCount(); - } - } - } - } - } - - public void incrementExecuteUpdateCount() { - DruidPooledConnection conn = this.getPoolableConnection(); - if (conn != null) { - DruidConnectionHolder holder = conn.getConnectionHolder(); - if (holder != null) { - DruidAbstractDataSource dataSource = holder.getDataSource(); - if (dataSource != null) { - dataSource.incrementExecuteUpdateCount(); - } - } - } - } - - public void incrementExecuteQueryCount() { - DruidPooledConnection conn = this.conn; - if (conn != null) { - DruidConnectionHolder holder = conn.holder; - if (holder != null) { - DruidAbstractDataSource dataSource = holder.dataSource; - if (dataSource != null) { - ++dataSource.executeQueryCount; - } - } - } - } - - protected void transactionRecord(String sql) throws SQLException { - this.conn.transactionRecord(sql); - } - - public final ResultSet executeQuery(String sql) throws SQLException { - this.checkOpen(); - this.incrementExecuteQueryCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - ResultSet var3; - try { - ResultSet rs = this.stmt.executeQuery(sql); - if (rs != null) { - DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); - this.addResultSetTrace(poolableResultSet); - DruidPooledResultSet var4 = poolableResultSet; - return var4; - } - - var3 = rs; - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final int executeUpdate(String sql) throws SQLException { - this.checkOpen(); - this.incrementExecuteUpdateCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - int var2; - try { - var2 = this.stmt.executeUpdate(sql); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var2; - } - - protected final void errorCheck(Throwable t) { - String errorClassName = t.getClass().getName(); - if (errorClassName.endsWith(".CommunicationsException") && this.conn.holder != null && this.conn.holder.dataSource.testWhileIdle) { - DruidConnectionHolder holder = this.conn.holder; - DruidAbstractDataSource dataSource = holder.dataSource; - long currentTimeMillis = System.currentTimeMillis(); - long lastActiveTimeMillis = holder.lastActiveTimeMillis; - if (lastActiveTimeMillis < holder.lastKeepTimeMillis) { - lastActiveTimeMillis = holder.lastKeepTimeMillis; - } - - long idleMillis = currentTimeMillis - lastActiveTimeMillis; - long lastValidIdleMillis = currentTimeMillis - holder.lastActiveTimeMillis; - String errorMsg = "CommunicationsException, druid version " + VERSION.getVersionNumber() + ", jdbcUrl : " + dataSource.jdbcUrl + ", testWhileIdle " + dataSource.testWhileIdle + ", idle millis " + idleMillis + ", minIdle " + dataSource.minIdle + ", poolingCount " + dataSource.getPoolingCount() + ", timeBetweenEvictionRunsMillis " + dataSource.timeBetweenEvictionRunsMillis + ", lastValidIdleMillis " + lastValidIdleMillis + ", driver " + dataSource.driver.getClass().getName(); - if (dataSource.exceptionSorter != null) { - errorMsg = errorMsg + ", exceptionSorter " + dataSource.exceptionSorter.getClass().getName(); - } - - LOG.error(errorMsg); - } - - } - - public final int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { - this.checkOpen(); - this.incrementExecuteUpdateCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - int var3; - try { - var3 = this.stmt.executeUpdate(sql, autoGeneratedKeys); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final int executeUpdate(String sql, int[] columnIndexes) throws SQLException { - this.checkOpen(); - this.incrementExecuteUpdateCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - int var3; - try { - var3 = this.stmt.executeUpdate(sql, columnIndexes); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final int executeUpdate(String sql, String[] columnNames) throws SQLException { - this.checkOpen(); - this.incrementExecuteUpdateCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - int var3; - try { - var3 = this.stmt.executeUpdate(sql, columnNames); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final boolean execute(String sql, int autoGeneratedKeys) throws SQLException { - this.checkOpen(); - this.incrementExecuteCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - boolean var3; - try { - var3 = this.stmt.execute(sql, autoGeneratedKeys); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final boolean execute(String sql, int[] columnIndexes) throws SQLException { - this.checkOpen(); - this.incrementExecuteCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - boolean var3; - try { - var3 = this.stmt.execute(sql, columnIndexes); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - public final boolean execute(String sql, String[] columnNames) throws SQLException { - this.checkOpen(); - this.incrementExecuteCount(); - this.transactionRecord(sql); - this.conn.beforeExecute(); - - boolean var3; - try { - var3 = this.stmt.execute(sql, columnNames); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t, sql); - } finally { - this.conn.afterExecute(); - } - - return var3; - } - - - public int getMaxFieldSize() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getMaxFieldSize(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public void close() throws SQLException { - if (!this.closed) { - this.clearResultSet(); - if (this.stmt != null) { - this.stmt.close(); - } - - this.closed = true; - DruidConnectionHolder connHolder = this.conn.getConnectionHolder(); - if (connHolder != null) { - connHolder.removeTrace(this); - } - - } - } - - public void setMaxFieldSize(int max) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setMaxFieldSize(max); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getMaxRows() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getMaxRows(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public void setMaxRows(int max) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setMaxRows(max); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final void setEscapeProcessing(boolean enable) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setEscapeProcessing(enable); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getQueryTimeout() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getQueryTimeout(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public void setQueryTimeout(int seconds) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setQueryTimeout(seconds); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final void cancel() throws SQLException { - this.checkOpen(); - - try { - this.stmt.cancel(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final SQLWarning getWarnings() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getWarnings(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final void clearWarnings() throws SQLException { - this.checkOpen(); - - try { - this.stmt.clearWarnings(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final void setCursorName(String name) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setCursorName(name); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - @Override - public final boolean execute(String sql) throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - try { - if (StringUtils.isNotEmpty(sql)){ - sql = sql.replace("TRUE", "1"); - sql = sql.replace("FALSE", "0"); - } - return stmt.execute(sql); - } catch (Throwable t) { - errorCheck(t); - throw checkException(t, sql); - } - } - - public final ResultSet getResultSet() throws SQLException { - this.checkOpen(); - - try { - ResultSet rs = this.stmt.getResultSet(); - if (rs == null) { - return null; - } else { - DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); - this.addResultSetTrace(poolableResultSet); - return poolableResultSet; - } - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getUpdateCount() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getUpdateCount(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final boolean getMoreResults() throws SQLException { - this.checkOpen(); - - try { - boolean moreResults = this.stmt.getMoreResults(); - if (this.resultSetTrace != null && this.resultSetTrace.size() > 0) { - ResultSet lastResultSet = (ResultSet)this.resultSetTrace.get(this.resultSetTrace.size() - 1); - if (lastResultSet instanceof DruidPooledResultSet) { - DruidPooledResultSet pooledResultSet = (DruidPooledResultSet)lastResultSet; - pooledResultSet.closed = true; - } - } - - return moreResults; - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public void setFetchDirection(int direction) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setFetchDirection(direction); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getFetchDirection() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getFetchDirection(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public void setFetchSize(int rows) throws SQLException { - this.checkOpen(); - - try { - this.stmt.setFetchSize(rows); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getFetchSize() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getFetchSize(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getResultSetConcurrency() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getResultSetConcurrency(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getResultSetType() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getResultSetType(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final void addBatch(String sql) throws SQLException { - this.checkOpen(); - this.transactionRecord(sql); - - try { - this.stmt.addBatch(sql); - } catch (Throwable t) { - throw this.checkException(t, sql); - } - } - - public final void clearBatch() throws SQLException { - if (!this.closed) { - try { - this.stmt.clearBatch(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - } - - public int[] executeBatch() throws SQLException { - this.checkOpen(); - this.incrementExecuteBatchCount(); - this.conn.beforeExecute(); - - int[] var1; - try { - var1 = this.stmt.executeBatch(); - } catch (Throwable t) { - this.errorCheck(t); - throw this.checkException(t); - } finally { - this.conn.afterExecute(); - } - - return var1; - } - - public final Connection getConnection() throws SQLException { - this.checkOpen(); - return this.conn; - } - - public final boolean getMoreResults(int current) throws SQLException { - this.checkOpen(); - - try { - boolean results = this.stmt.getMoreResults(current); - if (this.resultSetTrace != null && this.resultSetTrace.size() > 0) { - ResultSet lastResultSet = (ResultSet)this.resultSetTrace.get(this.resultSetTrace.size() - 1); - if (lastResultSet instanceof DruidPooledResultSet) { - DruidPooledResultSet pooledResultSet = (DruidPooledResultSet)lastResultSet; - pooledResultSet.closed = true; - } - } - - return results; - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final ResultSet getGeneratedKeys() throws SQLException { - this.checkOpen(); - - try { - ResultSet rs = this.stmt.getGeneratedKeys(); - DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); - this.addResultSetTrace(poolableResultSet); - return poolableResultSet; - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final int getResultSetHoldability() throws SQLException { - this.checkOpen(); - - try { - return this.stmt.getResultSetHoldability(); - } catch (Throwable t) { - throw this.checkException(t); - } - } - - public final boolean isClosed() throws SQLException { - return this.closed; - } - - public final void setPoolable(boolean poolable) throws SQLException { - if (!poolable) { - throw new SQLException("not support"); - } - } - - public final boolean isPoolable() throws SQLException { - return false; - } - - public String toString() { - return this.stmt.toString(); - } - - public void closeOnCompletion() throws SQLException { - this.stmt.closeOnCompletion(); - } - - public boolean isCloseOnCompletion() throws SQLException { - return this.stmt.isCloseOnCompletion(); - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApiImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApiImpl.java deleted file mode 100644 index 7f161dd..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmCategoryApiImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategoryPageReqDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategoryRespDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmCategorySaveReqDTO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.service.definition.BpmCategoryService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; - -/** - * BPM æµç¨‹åˆ†ç±» Api 实现类 - * - * @author ZT - */ -@RestController -@Validated -public class BpmCategoryApiImpl implements BpmCategoryApi { - - @Resource - private BpmCategoryService categoryService; - - @Override - public CommonResult createCategory(@Valid BpmCategorySaveReqDTO createReqDTO) { - BpmCategorySaveReqVO createReqVO = BeanUtils.toBean(createReqDTO, BpmCategorySaveReqVO.class); - return success(categoryService.createCategory(createReqVO)); - } - - @Override - public CommonResult updateCategory(@Valid BpmCategorySaveReqDTO updateReqDTO) { - BpmCategorySaveReqVO updateReqVO = BeanUtils.toBean(updateReqDTO, BpmCategorySaveReqVO.class); - categoryService.updateCategory(updateReqVO); - return success(true); - } - - @Override - public CommonResult updateCategorySortBatch(List ids) { - categoryService.updateCategorySortBatch(ids); - return success(true); - } - - @Override - public CommonResult deleteCategory(Long id) { - categoryService.deleteCategory(id); - return success(true); - } - - @Override - public CommonResult getCategory(Long id) { - BpmCategoryDO category = categoryService.getCategory(id); - return success(BeanUtils.toBean(category, BpmCategoryRespDTO.class)); - } - - @Override - public CommonResult> getCategoryPage(@Valid BpmCategoryPageReqDTO pageReqDTO) { - BpmCategoryPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmCategoryPageReqVO.class); - PageResult pageResult = categoryService.getCategoryPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, BpmCategoryRespDTO.class)); - } - - @Override - public CommonResult> getCategorySimpleList() { - List list = categoryService.getCategoryListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(BeanUtils.toBean(list, BpmCategoryRespDTO.class)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApiImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApiImpl.java deleted file mode 100644 index faceb1e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmFormApiImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormPageReqDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormRespDTO; -import com.zt.plat.module.bpm.api.definition.dto.BpmFormSaveReqDTO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; - -/** - * 动æ€è¡¨å• Api 实现类 - * - * @author ZT - */ -@RestController -@Validated -public class BpmFormApiImpl implements BpmFormApi { - - @Resource - private BpmFormService formService; - - @Override - public CommonResult createForm(@Valid BpmFormSaveReqDTO createReqDTO) { - BpmFormSaveReqVO createReqVO = BeanUtils.toBean(createReqDTO, BpmFormSaveReqVO.class); - return success(formService.createForm(createReqVO)); - } - - @Override - public CommonResult updateForm(@Valid BpmFormSaveReqDTO updateReqDTO) { - BpmFormSaveReqVO updateReqVO = BeanUtils.toBean(updateReqDTO, BpmFormSaveReqVO.class); - formService.updateForm(updateReqVO); - return success(true); - } - - @Override - public CommonResult deleteForm(Long id) { - formService.deleteForm(id); - return success(true); - } - - @Override - public CommonResult getForm(Long id) { - BpmFormDO form = formService.getForm(id); - return success(BeanUtils.toBean(form, BpmFormRespDTO.class)); - } - - @Override - public CommonResult> getFormPage(BpmFormPageReqDTO pageReqDTO) { - BpmFormPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmFormPageReqVO.class); - PageResult pageResult = formService.getFormPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, BpmFormRespDTO.class)); - } - - @Override - public CommonResult> getFormSimpleList() { - List list = formService.getFormList(); - // åªè¿”回 idã€name 字段 - List dtoList = list.stream() - .map(formDO -> new BpmFormRespDTO().setId(formDO.getId()).setName(formDO.getName())) - .collect(java.util.stream.Collectors.toList()); - return success(dtoList); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApiImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApiImpl.java deleted file mode 100644 index 502b9d6..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/definition/BpmUserGroupApiImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zt.plat.module.bpm.api.definition; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.definition.dto.BpmUserGroupRespDTO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import com.zt.plat.module.bpm.service.definition.BpmUserGroupService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; - -/** - * 用户组 Api 实现类 - * - * @author ZT - */ -@RestController -@Validated -public class BpmUserGroupApiImpl implements BpmUserGroupApi { - - @Resource - private BpmUserGroupService userGroupService; - - @Override - public CommonResult getUserGroup(Long id) { - BpmUserGroupDO userGroup = userGroupService.getUserGroup(id); - return success(BeanUtils.toBean(userGroup, BpmUserGroupRespDTO.class)); - } - - @Override - public CommonResult> getUserGroupSimpleList() { - List list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(BeanUtils.toBean(list, BpmUserGroupRespDTO.class)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/package-info.java deleted file mode 100644 index 7c3b4c4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * bpm API 实现类,定义暴露给其它模å—çš„ API - */ -package com.zt.plat.module.bpm.api; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApiImpl.java deleted file mode 100644 index b3d1e79..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmProcessInstanceApiImpl.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.zt.plat.module.bpm.api.task; - -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.task.dto.*; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.*; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRejectReqVO; -import com.zt.plat.module.bpm.convert.task.BpmProcessInstanceConvert; -import com.zt.plat.module.bpm.convert.task.BpmProcessInstanceDTOConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.BpmTaskService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.repository.ProcessDefinition; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.web.core.util.WebFrameworkUtils.getLoginUserId; - -/** - * Flowable æµç¨‹å®žä¾‹ Api 实现类 - * - * @author ZT - * @author jason - */ -@RestController -@Valid -public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Resource - private BpmTaskService taskService; - - @Resource - private BpmProcessDefinitionService processDefinitionService; - - @Resource - private AdminUserApi adminUserApi; - - @Resource - private DeptApi deptApi; - - @Override - public CommonResult createProcessInstance(Long userId, @Valid @RequestBody BpmProcessInstanceCreateReqDTO reqDTO) { - return success(processInstanceService.createProcessInstance(userId, reqDTO)); - } - - - @Override - public CommonResult getProcessInstance(String id) { - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id); - if (processInstance == null) { - return success(null); - } - - // 拼接返回 - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - processInstance.getProcessDefinitionId()); - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( - processInstance.getProcessDefinitionId()); - AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())).getCheckedData(); - DeptRespDTO dept = null; - if (startUser != null) { - Long deptId = DeptUtil.getDeptId(startUser); - if (deptId > 0) { - dept = deptApi.getDept(deptId).getCheckedData(); - } - } - BpmProcessInstanceRespVO vo = BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance, - processDefinition, processDefinitionInfo, startUser, dept); - return success(BpmProcessInstanceDTOConvert.INSTANCE.convert(vo)); - } - - @Override - public CommonResult cancelProcessInstanceByStartUser( - Long userId, @Valid @RequestBody BpmProcessInstanceCancelReqDTO cancelReqDTO) { - BpmProcessInstanceCancelReqVO cancelReqVO = BpmProcessInstanceDTOConvert.INSTANCE.convertVO(cancelReqDTO); - processInstanceService.cancelProcessInstanceByStartUser(userId, cancelReqVO); - return success(true); - } - - @Override - public CommonResult cancelProcessInstanceByAdmin( - Long userId, @Valid @RequestBody BpmProcessInstanceCancelReqDTO cancelReqDTO) { - BpmProcessInstanceCancelReqVO cancelReqVO = BpmProcessInstanceDTOConvert.INSTANCE.convertVO(cancelReqDTO); - processInstanceService.cancelProcessInstanceByAdmin(userId, cancelReqVO); - return success(true); - } - - @Override - @SuppressWarnings("unchecked") - public CommonResult getApprovalDetail(Long userId, - @Valid @RequestBody BpmApprovalDetailReqDTO reqDTO) { - BpmApprovalDetailReqVO reqVO = BpmProcessInstanceDTOConvert.INSTANCE.convertVO(reqDTO); - if (StrUtil.isNotEmpty(reqDTO.getProcessVariablesStr())) { - reqVO.setProcessVariables(JsonUtils.parseObject(reqDTO.getProcessVariablesStr(), Map.class)); - } - BpmApprovalDetailRespVO respVO = processInstanceService.getApprovalDetail(userId, reqVO); - return success(BpmProcessInstanceDTOConvert.INSTANCE.convert(respVO)); - } - - @Override - @SuppressWarnings("unchecked") - public CommonResult> getNextApprovalNodes(Long userId, - @Valid @RequestBody BpmApprovalDetailReqDTO reqDTO) { - BpmApprovalDetailReqVO reqVO = BpmProcessInstanceDTOConvert.INSTANCE.convertVO(reqDTO); - if (StrUtil.isNotEmpty(reqDTO.getProcessVariablesStr())) { - reqVO.setProcessVariables(JsonUtils.parseObject(reqDTO.getProcessVariablesStr(), Map.class)); - } - List nodes = processInstanceService.getNextApprovalNodes(userId, reqVO); - return success(BpmProcessInstanceDTOConvert.INSTANCE.convertActivityNodes(nodes)); - } - - @Override - public CommonResult getProcessInstanceBpmnModelView(String id) { - BpmProcessInstanceBpmnModelViewRespVO respVO = processInstanceService.getProcessInstanceBpmnModelView(id); - return success(BpmProcessInstanceDTOConvert.INSTANCE.convert(respVO)); - } - - @Override - public CommonResult approveTask(BpmTaskApproveReqDTO reqVO) { - taskService.approveTask(getLoginUserId(), BeanUtils.toBean(reqVO, BpmTaskApproveReqVO.class)); - return success(true); - } - - @Override - public CommonResult rejectTask(BpmTaskRejectReqDTO reqVO) { - taskService.rejectTask(getLoginUserId(), BeanUtils.toBean(reqVO, BpmTaskRejectReqVO.class)); - return success(true); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java deleted file mode 100644 index 4d70c6a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.zt.plat.module.bpm.api.task; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; -import com.zt.plat.module.bpm.api.task.dto.BpmTaskPageReqDTO; -import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO; -import com.zt.plat.module.bpm.convert.task.BpmTaskConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.BpmTaskService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import java.util.*; -import java.util.stream.Stream; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; - -/** - * BPM 任务 API 实现类 - * - * @author ZT - */ -@RestController -@Validated -public class BpmTaskApiImpl implements BpmTaskApi { - - @Resource - private BpmTaskService taskService; - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmFormService formService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @Override - public CommonResult> getTaskTodoPage(@Valid BpmTaskPageReqDTO pageReqDTO) { - // 转æ¢è¯·æ±‚傿•° - BpmTaskPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmTaskPageReqVO.class); - - // 调用 Service 层方法 - PageResult pageResult = taskService.getTaskTodoPage(SecurityFrameworkUtils.getLoginUserId(), pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new ArrayList<>()); - } - - // æ‹¼æŽ¥æ•°æ® - å‚考 Controller 逻辑 - Map processInstanceMap = processInstanceService.getProcessInstanceMap(convertSet(pageResult.getList(), Task::getProcessInstanceId)); - Map userMap = adminUserApi.getUserMap(convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), Task::getProcessDefinitionId)); - - // 使用转æ¢å™¨æž„建完整的 VO 结果,然åŽè½¬æ¢ä¸º DTO - var voPageResult = BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap); - List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); - - return success(result); - } - - @Override - public CommonResult> getTaskDonePage(@Valid BpmTaskPageReqDTO pageReqDTO) { - // 转æ¢è¯·æ±‚傿•° - BpmTaskPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmTaskPageReqVO.class); - - // 调用 Service 层方法 - PageResult pageResult = taskService.getTaskDonePage(SecurityFrameworkUtils.getLoginUserId(), pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new ArrayList<>()); - } - - // æ‹¼æŽ¥æ•°æ® - å‚考 Controller 逻辑 - Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); - Map userMap = adminUserApi.getUserMap(convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - - // 使用转æ¢å™¨æž„建完整的 VO 结果,然åŽè½¬æ¢ä¸º DTO - var voPageResult = BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap); - List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); - - return success(result); - } - - @Override - public CommonResult> getTaskManagerPage(@Valid BpmTaskPageReqDTO pageReqDTO) { - // 转æ¢è¯·æ±‚傿•° - BpmTaskPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmTaskPageReqVO.class); - - // 调用 Service 层方法 - PageResult pageResult = taskService.getTaskPage(SecurityFrameworkUtils.getLoginUserId(), pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new ArrayList<>()); - } - - // æ‹¼æŽ¥æ•°æ® - å‚考 Controller 逻辑 - Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); - // 获得 User å’Œ Dept Map - Set userIds = convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())); - userIds.addAll(convertSet(pageResult.getList(), task -> NumberUtils.parseLong(task.getAssignee()))); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - - // 使用转æ¢å™¨æž„建完整的 VO 结果,然åŽè½¬æ¢ä¸º DTO - var voPageResult = BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, processDefinitionInfoMap); - List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); - - return success(result); - } - - @Override - public CommonResult> getTaskListByProcessInstanceId(String processInstanceId) { - // 调用 Service 层方法 - List taskList = taskService.getTaskListByProcessInstanceId(processInstanceId, true); - if (CollUtil.isEmpty(taskList)) { - return success(Collections.emptyList()); - } - - // æ‹¼æŽ¥æ•°æ® - å‚考 Controller 逻辑 - Set userIds = convertSetByFlatMap(taskList, task -> Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - // 获得 Form Map - Map formMap = formService.getFormMap(convertSet(taskList, task -> { - String formKey = task.getFormKey(); - if (formKey == null || formKey.isBlank()) { - return 0L; - } - try { - return Long.parseLong(formKey); - } catch (NumberFormatException e) { - // 如果 formKey 䏿˜¯æ•°å­—(比如是URL),返回0L - return 0L; - } - })); - - // 使用转æ¢å™¨æž„建完整的 VO 结果,然åŽè½¬æ¢ä¸º DTO - var voList = BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, formMap, userMap, deptMap); - List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voList); - - return success(result); - } - - @Override - public CommonResult> getTaskListByReturn(String id) { - // 调用 Service 层方法 - var userTaskList = taskService.getUserTaskListByReturn(id); - - // 转æ¢è¿”回结果 - åªè¿”回 id å’Œ name(对应 taskDefinitionKey å’Œ name) - List result = userTaskList.stream().map(userTask -> { - BpmTaskRespDTO dto = new BpmTaskRespDTO(); - dto.setName(userTask.getName()); - dto.setTaskDefinitionKey(userTask.getId()); - return dto; - }).toList(); - - return success(result); - } - - @Override - public CommonResult> getTaskListByParentTaskId(String parentTaskId) { - // 调用 Service 层方法 - List taskList = taskService.getTaskListByParentTaskId(parentTaskId); - if (CollUtil.isEmpty(taskList)) { - return success(Collections.emptyList()); - } - - // æ‹¼æŽ¥æ•°æ® - å‚考 Controller 逻辑 - Map userMap = adminUserApi.getUserMap(convertSetByFlatMap(taskList, user -> Stream.of(NumberUtils.parseLong(user.getAssignee()), NumberUtils.parseLong(user.getOwner())))); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - - // 使用转æ¢å™¨æž„建完整的 VO 结果,然åŽè½¬æ¢ä¸º DTO - var voList = BpmTaskConvert.INSTANCE.buildTaskListByParentTaskId(taskList, userMap, deptMap); - List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voList); - - return success(result); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/dept/DeptSimpleBaseVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/dept/DeptSimpleBaseVO.java deleted file mode 100644 index b0c466b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/dept/DeptSimpleBaseVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.base.dept; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "éƒ¨é—¨ç²¾ç®€ä¿¡æ¯ VO") -@Data -public class DeptSimpleBaseVO { - - @Schema(description = "部门编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - @Schema(description = "部门åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "技术部") - private String name; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/package-info.java deleted file mode 100644 index 141c17f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 基础包,放一些通用的 VO ç±» - */ -package com.zt.plat.module.bpm.controller.admin.base; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/user/UserSimpleBaseVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/user/UserSimpleBaseVO.java deleted file mode 100644 index 68b9b8a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/base/user/UserSimpleBaseVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.base.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "ç”¨æˆ·ç²¾ç®€ä¿¡æ¯ VO") -@Data -public class UserSimpleBaseVO { - - @Schema(description = "用户编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String nickname; - @Schema(description = "用户头åƒ", example = "https://www.iocoder.cn/1.png") - private String avatar; - - @Schema(description = "部门编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long deptId; - @Schema(description = "部门åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ç ”å‘部") - private String deptName; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmCategoryController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmCategoryController.java deleted file mode 100644 index b318b4b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmCategoryController.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.service.definition.BpmCategoryService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Comparator; -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -@Tag(name = "管ç†åŽå° - BPM æµç¨‹åˆ†ç±»") -@RestController -@RequestMapping("/bpm/category") -@Validated -public class BpmCategoryController { - - @Resource - private BpmCategoryService categoryService; - - @PostMapping("/create") - @Operation(summary = "创建æµç¨‹åˆ†ç±»") - @PreAuthorize("@ss.hasPermission('bpm:category:create')") - public CommonResult createCategory(@Valid @RequestBody BpmCategorySaveReqVO createReqVO) { - return success(categoryService.createCategory(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "æ›´æ–°æµç¨‹åˆ†ç±»") - @PreAuthorize("@ss.hasPermission('bpm:category:update')") - public CommonResult updateCategory(@Valid @RequestBody BpmCategorySaveReqVO updateReqVO) { - categoryService.updateCategory(updateReqVO); - return success(true); - } - - @PutMapping("/update-sort-batch") - @Operation(summary = "æ‰¹é‡æ›´æ–°æµç¨‹åˆ†ç±»çš„æŽ’åº") - @Parameter(name = "ids", description = "分类编å·åˆ—表", required = true, example = "1,2,3") - @PreAuthorize("@ss.hasPermission('bpm:category:update')") - public CommonResult updateCategorySortBatch(@RequestParam("ids") List ids) { - categoryService.updateCategorySortBatch(ids); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除æµç¨‹åˆ†ç±»") - @Parameter(name = "id", description = "ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:category:delete')") - public CommonResult deleteCategory(@RequestParam("id") Long id) { - categoryService.deleteCategory(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得æµç¨‹åˆ†ç±»") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:category:query')") - public CommonResult getCategory(@RequestParam("id") Long id) { - BpmCategoryDO category = categoryService.getCategory(id); - return success(BeanUtils.toBean(category, BpmCategoryRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得æµç¨‹åˆ†ç±»åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:category:query')") - public CommonResult> getCategoryPage(@Valid BpmCategoryPageReqVO pageReqVO) { - PageResult pageResult = categoryService.getCategoryPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, BpmCategoryRespVO.class)); - } - - @GetMapping("/simple-list") - @Operation(summary = "èŽ·å–æµç¨‹åˆ†ç±»çš„精简信æ¯åˆ—表", description = "åªåŒ…å«è¢«å¼€å¯çš„分类,主è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - public CommonResult> getCategorySimpleList() { - List list = categoryService.getCategoryListByStatus(CommonStatusEnum.ENABLE.getStatus()); - list.sort(Comparator.comparingInt(BpmCategoryDO::getSort)); - return success(convertList(list, category -> new BpmCategoryRespVO().setId(category.getId()) - .setName(category.getName()).setCode(category.getCode()))); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmFormController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmFormController.java deleted file mode 100644 index fa47346..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmFormController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -@Tag(name = "管ç†åŽå° - 动æ€è¡¨å•") -@RestController -@RequestMapping("/bpm/form") -@Validated -public class BpmFormController { - - @Resource - private BpmFormService formService; - - @PostMapping("/create") - @Operation(summary = "创建动æ€è¡¨å•") - @PreAuthorize("@ss.hasPermission('bpm:form:create')") - public CommonResult createForm(@Valid @RequestBody BpmFormSaveReqVO createReqVO) { - return success(formService.createForm(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新动æ€è¡¨å•") - @PreAuthorize("@ss.hasPermission('bpm:form:update')") - public CommonResult updateForm(@Valid @RequestBody BpmFormSaveReqVO updateReqVO) { - formService.updateForm(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除动æ€è¡¨å•") - @Parameter(name = "id", description = "ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:form:delete')") - public CommonResult deleteForm(@RequestParam("id") Long id) { - formService.deleteForm(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得动æ€è¡¨å•") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:form:query')") - public CommonResult getForm(@RequestParam("id") Long id) { - BpmFormDO form = formService.getForm(id); - return success(BeanUtils.toBean(form, BpmFormRespVO.class)); - } - - @GetMapping({"/list-all-simple", "/simple-list"}) - @Operation(summary = "获得动æ€è¡¨å•的精简列表", description = "用于表å•下拉框") - public CommonResult> getFormSimpleList() { - List list = formService.getFormList(); - return success(convertList(list, formDO -> // åªè¿”回 idã€name 字段 - new BpmFormRespVO().setId(formDO.getId()).setName(formDO.getName()))); - } - - @GetMapping("/page") - @Operation(summary = "获得动æ€è¡¨å•分页") - @PreAuthorize("@ss.hasPermission('bpm:form:query')") - public CommonResult> getFormPage(@Valid BpmFormPageReqVO pageVO) { - PageResult pageResult = formService.getFormPage(pageVO); - return success(BeanUtils.toBean(pageResult, BpmFormRespVO.class)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmModelController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmModelController.java deleted file mode 100644 index 8a408e8..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmModelController.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.*; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelUpdateReqVO; -import com.zt.plat.module.bpm.convert.definition.BpmModelConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.service.definition.BpmCategoryService; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import com.zt.plat.module.bpm.service.definition.BpmModelService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管ç†åŽå° - æµç¨‹æ¨¡åž‹") -@RestController -@RequestMapping("/bpm/model") -@Validated -public class BpmModelController { - - @Resource - private BpmModelService modelService; - @Resource - private BpmFormService formService; - @Resource - private BpmCategoryService categoryService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @GetMapping("/list") - @Operation(summary = "获得模型分页") - @Parameter(name = "name", description = "模型åç§°", example = "ZT") - public CommonResult> getModelList(@RequestParam(value = "name", required = false) String name) { - List list = modelService.getModelList(name); - if (CollUtil.isEmpty(list)) { - return success(Collections.emptyList()); - } - - // 获得 Form è¡¨å• - Set formIds = convertSet(list, model -> { - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); - return metaInfo != null ? metaInfo.getFormId() : null; - }); - Map formMap = formService.getFormMap(formIds); - // 获得 Category Map - Map categoryMap = categoryService.getCategoryMap( - convertSet(list, Model::getCategory)); - // 获得 Deployment Map - Map deploymentMap = processDefinitionService.getDeploymentMap( - convertSet(list, Model::getDeploymentId)); - // 获得 ProcessDefinition Map - List processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds( - deploymentMap.keySet()); - Map processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId); - // 获得 User Mapã€Dept Map - Set userIds = convertSetByFlatMap(list, model -> { - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); - return metaInfo != null ? metaInfo.getStartUserIds().stream() : Stream.empty(); - }); - Map userMap = adminUserApi.getUserMap(userIds); - Set deptIds = convertSetByFlatMap(list, model -> { - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); - return metaInfo != null && metaInfo.getStartDeptIds() != null ? metaInfo.getStartDeptIds().stream() : Stream.empty(); - }); - Map deptMap = deptApi.getDeptMap(deptIds); - return success(BpmModelConvert.INSTANCE.buildModelList(list, - formMap, categoryMap, deploymentMap, processDefinitionMap, userMap, deptMap)); - } - - @GetMapping("/get") - @Operation(summary = "获得模型") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:model:query')") - public CommonResult getModel(@RequestParam("id") String id) { - Model model = modelService.getModel(id); - if (model == null) { - return null; - } - byte[] bpmnBytes = modelService.getModelBpmnXML(id); - BpmSimpleModelNodeVO simpleModel = modelService.getSimpleModel(id); - return success(BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes, simpleModel)); - } - - @PostMapping("/create") - @Operation(summary = "新建模型") - @PreAuthorize("@ss.hasPermission('bpm:model:create')") - public CommonResult createModel(@Valid @RequestBody BpmModelSaveReqVO createRetVO) { - return success(modelService.createModel(createRetVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改模型") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModel(@Valid @RequestBody BpmModelSaveReqVO modelVO) { - modelService.updateModel(getLoginUserId(), modelVO); - return success(true); - } - - @PutMapping("/update-sort-batch") - @Operation(summary = "批é‡ä¿®æ”¹æ¨¡åž‹æŽ’åº") - @Parameter(name = "ids", description = "ç¼–å·æ•°ç»„", required = true, example = "1,2,3") - public CommonResult updateModelSortBatch(@RequestParam("ids") List ids) { - modelService.updateModelSortBatch(getLoginUserId(), ids); - return success(true); - } - - @PostMapping("/deploy") - @Operation(summary = "部署模型") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:model:deploy')") - public CommonResult deployModel(@RequestParam("id") String id) { - modelService.deployModel(getLoginUserId(), id); - return success(true); - } - - @PutMapping("/update-state") - @Operation(summary = "修改模型的状æ€", description = "实际更新的部署的æµç¨‹å®šä¹‰çš„状æ€") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) { - modelService.updateModelState(getLoginUserId(), reqVO.getId(), reqVO.getState()); - return success(true); - } - - @Deprecated - @PutMapping("/update-bpmn") - @Operation(summary = "修改模型的 BPMN") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModelBpmn(@Valid @RequestBody BpmModeUpdateBpmnReqVO reqVO) { - modelService.updateModelBpmnXml(reqVO.getId(), reqVO.getBpmnXml()); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除模型") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:model:delete')") - public CommonResult deleteModel(@RequestParam("id") String id) { - modelService.deleteModel(getLoginUserId(), id); - return success(true); - } - - @DeleteMapping("/clean") - @Operation(summary = "æ¸…ç†æ¨¡åž‹") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:model:clean')") - public CommonResult cleanModel(@RequestParam("id") String id) { - modelService.cleanModel(getLoginUserId(), id); - return success(true); - } - - // ========== 仿钉钉/飞书的精简模型 ========= - - @GetMapping("/simple/get") - @Operation(summary = "获得仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹") - @Parameter(name = "modelId", description = "æµç¨‹æ¨¡åž‹ç¼–å·", required = true, example = "a2c5eee0-eb6c-11ee-abf4-0c37967c420a") - public CommonResult getSimpleModel(@RequestParam("id") String modelId){ - return success(modelService.getSimpleModel(modelId)); - } - - @Deprecated - @PostMapping("/simple/update") - @Operation(summary = "ä¿å­˜ä»¿é’‰é’‰æµç¨‹è®¾è®¡æ¨¡åž‹") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateSimpleModel(@Valid @RequestBody BpmSimpleModelUpdateReqVO reqVO) { - modelService.updateSimpleModel(getLoginUserId(), reqVO); - return success(Boolean.TRUE); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java deleted file mode 100644 index e5ee29a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.convert.definition.BpmProcessDefinitionConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.service.definition.BpmCategoryService; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.ProcessDefinition; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; -import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管ç†åŽå° - æµç¨‹å®šä¹‰") -@RestController -@RequestMapping("/bpm/process-definition") -@Validated -public class BpmProcessDefinitionController { - - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmFormService formService; - @Resource - private BpmCategoryService categoryService; - - @GetMapping("/page") - @Operation(summary = "获得æµç¨‹å®šä¹‰åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult> getProcessDefinitionPage( - BpmProcessDefinitionPageReqVO pageReqVO) { - PageResult pageResult = processDefinitionService.getProcessDefinitionPage(pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 获得 Category Map - Map categoryMap = categoryService.getCategoryMap( - convertSet(pageResult.getList(), ProcessDefinition::getCategory)); - // 获得 Deployment Map - Map deploymentMap = processDefinitionService.getDeploymentMap( - convertSet(pageResult.getList(), ProcessDefinition::getDeploymentId)); - // 获得 BpmProcessDefinitionInfoDO Map - Map processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), ProcessDefinition::getId)); - // 获得 Form Map - Map formMap = formService.getFormMap( - convertSet(processDefinitionMap.values(), BpmProcessDefinitionInfoDO::getFormId)); - return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionPage( - pageResult, deploymentMap, processDefinitionMap, formMap, categoryMap)); - } - - @GetMapping ("/list") - @Operation(summary = "获得æµç¨‹å®šä¹‰åˆ—表") - @Parameter(name = "suspensionState", description = "挂起状æ€", required = true, example = "1") // å‚è§ Flowable SuspensionState 枚举 - public CommonResult> getProcessDefinitionList( - @RequestParam("suspensionState") Integer suspensionState) { - // 1.1 获得开å¯çš„æµç¨‹å®šä¹‰ - List list = processDefinitionService.getProcessDefinitionListBySuspensionState(suspensionState); - if (CollUtil.isEmpty(list)) { - return success(Collections.emptyList()); - } - // 1.2 移除ä¸å¯è§çš„æµç¨‹å®šä¹‰ - Map processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(list, ProcessDefinition::getId)); - Long userId = getLoginUserId(); - list.removeIf(processDefinition -> { - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionMap.get(processDefinition.getId()); - return processDefinitionInfo == null // ä¸å­˜åœ¨ - || Boolean.FALSE.equals(processDefinitionInfo.getVisible()) // visible ä¸å¯è§ - || !processDefinitionService.canUserStartProcessDefinition(processDefinitionInfo, userId); // æ— æƒé™å‘èµ· - }); - - // 2. 拼接 VO 返回 - return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionList( - list, null, processDefinitionMap, null, null)); - } - - @GetMapping("/simple-list") - @Operation(summary = "获得æµç¨‹å®šä¹‰ç²¾ç®€åˆ—表", description = "åªåŒ…嫿œªæŒ‚èµ·çš„æµç¨‹ï¼Œä¸»è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - public CommonResult> getSimpleProcessDefinitionList() { - // åªæŸ¥è¯¢æœªæŒ‚èµ·çš„æµç¨‹ - List list = processDefinitionService.getProcessDefinitionListBySuspensionState( - SuspensionState.ACTIVE.getStateCode()); - // 拼接 VO 返回,åªè¿”回 idã€nameã€key - return success(convertList(list, definition -> new BpmProcessDefinitionRespVO() - .setId(definition.getId()).setName(definition.getName()).setKey(definition.getKey()))); - } - - @GetMapping ("/get") - @Operation(summary = "获得æµç¨‹å®šä¹‰") - @Parameter(name = "id", description = "æµç¨‹ç¼–å·", required = true, example = "1024") - @Parameter(name = "key", description = "æµç¨‹å®šä¹‰æ ‡è¯†", required = true, example = "1024") - public CommonResult getProcessDefinition( - @RequestParam(value = "id", required = false) String id, - @RequestParam(value = "key", required = false) String key) { - ProcessDefinition processDefinition = id != null ? processDefinitionService.getProcessDefinition(id) - : processDefinitionService.getActiveProcessDefinition(key); - if (processDefinition == null) { - return success(null); - } - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(processDefinition.getId()); - BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); - return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( - processDefinition, null, processDefinitionInfo, null, null, bpmnModel)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessExpressionController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessExpressionController.java deleted file mode 100644 index 08fcb42..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessExpressionController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO; -import com.zt.plat.module.bpm.service.definition.BpmProcessExpressionService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; - -@Tag(name = "管ç†åŽå° - BPM æµç¨‹è¡¨è¾¾å¼") -@RestController -@RequestMapping("/bpm/process-expression") -@Validated -public class BpmProcessExpressionController { - - @Resource - private BpmProcessExpressionService processExpressionService; - - @PostMapping("/create") - @Operation(summary = "创建æµç¨‹è¡¨è¾¾å¼") - @PreAuthorize("@ss.hasPermission('bpm:process-expression:create')") - public CommonResult createProcessExpression(@Valid @RequestBody BpmProcessExpressionSaveReqVO createReqVO) { - return success(processExpressionService.createProcessExpression(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "æ›´æ–°æµç¨‹è¡¨è¾¾å¼") - @PreAuthorize("@ss.hasPermission('bpm:process-expression:update')") - public CommonResult updateProcessExpression(@Valid @RequestBody BpmProcessExpressionSaveReqVO updateReqVO) { - processExpressionService.updateProcessExpression(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除æµç¨‹è¡¨è¾¾å¼") - @Parameter(name = "id", description = "ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-expression:delete')") - public CommonResult deleteProcessExpression(@RequestParam("id") Long id) { - processExpressionService.deleteProcessExpression(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得æµç¨‹è¡¨è¾¾å¼") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:process-expression:query')") - public CommonResult getProcessExpression(@RequestParam("id") Long id) { - BpmProcessExpressionDO processExpression = processExpressionService.getProcessExpression(id); - return success(BeanUtils.toBean(processExpression, BpmProcessExpressionRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得æµç¨‹è¡¨è¾¾å¼åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:process-expression:query')") - public CommonResult> getProcessExpressionPage( - @Valid BpmProcessExpressionPageReqVO pageReqVO) { - PageResult pageResult = processExpressionService.getProcessExpressionPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, BpmProcessExpressionRespVO.class)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessListenerController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessListenerController.java deleted file mode 100644 index 3077a91..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmProcessListenerController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; -import com.zt.plat.module.bpm.service.definition.BpmProcessListenerService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; - -@Tag(name = "管ç†åŽå° - BPM æµç¨‹ç›‘å¬å™¨") -@RestController -@RequestMapping("/bpm/process-listener") -@Validated -public class BpmProcessListenerController { - - @Resource - private BpmProcessListenerService processListenerService; - - @PostMapping("/create") - @Operation(summary = "创建æµç¨‹ç›‘å¬å™¨") - @PreAuthorize("@ss.hasPermission('bpm:process-listener:create')") - public CommonResult createProcessListener(@Valid @RequestBody BpmProcessListenerSaveReqVO createReqVO) { - return success(processListenerService.createProcessListener(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "æ›´æ–°æµç¨‹ç›‘å¬å™¨") - @PreAuthorize("@ss.hasPermission('bpm:process-listener:update')") - public CommonResult updateProcessListener(@Valid @RequestBody BpmProcessListenerSaveReqVO updateReqVO) { - processListenerService.updateProcessListener(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除æµç¨‹ç›‘å¬å™¨") - @Parameter(name = "id", description = "ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-listener:delete')") - public CommonResult deleteProcessListener(@RequestParam("id") Long id) { - processListenerService.deleteProcessListener(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得æµç¨‹ç›‘å¬å™¨") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:process-listener:query')") - public CommonResult getProcessListener(@RequestParam("id") Long id) { - BpmProcessListenerDO processListener = processListenerService.getProcessListener(id); - return success(BeanUtils.toBean(processListener, BpmProcessListenerRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得æµç¨‹ç›‘å¬å™¨åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:process-listener:query')") - public CommonResult> getProcessListenerPage( - @Valid BpmProcessListenerPageReqVO pageReqVO) { - PageResult pageResult = processListenerService.getProcessListenerPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, BpmProcessListenerRespVO.class)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmUserGroupController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmUserGroupController.java deleted file mode 100644 index 226e5da..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/BpmUserGroupController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import com.zt.plat.module.bpm.service.definition.BpmUserGroupService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -@Tag(name = "管ç†åŽå° - 用户组") -@RestController -@RequestMapping("/bpm/user-group") -@Validated -public class BpmUserGroupController { - - @Resource - private BpmUserGroupService userGroupService; - - @PostMapping("/create") - @Operation(summary = "创建用户组") - @PreAuthorize("@ss.hasPermission('bpm:user-group:create')") - public CommonResult createUserGroup(@Valid @RequestBody BpmUserGroupSaveReqVO createReqVO) { - return success(userGroupService.createUserGroup(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新用户组") - @PreAuthorize("@ss.hasPermission('bpm:user-group:update')") - public CommonResult updateUserGroup(@Valid @RequestBody BpmUserGroupSaveReqVO updateReqVO) { - userGroupService.updateUserGroup(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除用户组") - @Parameter(name = "id", description = "ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:user-group:delete')") - public CommonResult deleteUserGroup(@RequestParam("id") Long id) { - userGroupService.deleteUserGroup(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得用户组") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") - public CommonResult getUserGroup(@RequestParam("id") Long id) { - BpmUserGroupDO userGroup = userGroupService.getUserGroup(id); - return success(BeanUtils.toBean(userGroup, BpmUserGroupRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得用户组分页") - @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") - public CommonResult> getUserGroupPage(@Valid BpmUserGroupPageReqVO pageVO) { - PageResult pageResult = userGroupService.getUserGroupPage(pageVO); - return success(BeanUtils.toBean(pageResult, BpmUserGroupRespVO.class)); - } - - @GetMapping("/simple-list") - @Operation(summary = "获å–用户组精简信æ¯åˆ—表", description = "åªåŒ…å«è¢«å¼€å¯çš„用户组,主è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - public CommonResult> getUserGroupSimpleList() { - List list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(convertList(list, group -> new BpmUserGroupRespVO().setId(group.getId()).setName(group.getName()))); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java deleted file mode 100644 index 5de14e2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.category; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹åˆ†ç±»åˆ†é¡µ Request VO") -@Data -public class BpmCategoryPageReqVO extends PageParam { - - @Schema(description = "分类å", example = "王五") - private String name; - - @Schema(description = "分类标志", example = "OA") - private String code; - - @Schema(description = "分类状æ€", example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java deleted file mode 100644 index 5f3db13..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.category; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹åˆ†ç±» Response VO") -@Data -public class BpmCategoryRespVO { - - @Schema(description = "分类编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") - private Long id; - - @Schema(description = "分类å", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - private String name; - - @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA") - private String code; - - @Schema(description = "分类æè¿°", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String description; - - @Schema(description = "分类状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "分类排åº", requiredMode = Schema.RequiredMode.REQUIRED) - private Integer sort; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java deleted file mode 100644 index 0203453..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.category; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹åˆ†ç±»æ–°å¢ž/修改 Request VO") -@Data -public class BpmCategorySaveReqVO { - - @Schema(description = "分类编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") - private Long id; - - @Schema(description = "分类å", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - @NotEmpty(message = "分类åä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "分类æè¿°", example = "你猜") - private String description; - - @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA") - @NotEmpty(message = "分类标志ä¸èƒ½ä¸ºç©º") - private String code; - - @Schema(description = "分类状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "分类状æ€ä¸èƒ½ä¸ºç©º") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "分类排åº", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "分类排åºä¸èƒ½ä¸ºç©º") - private Integer sort; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionPageReqVO.java deleted file mode 100644 index 1d3bbed..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionPageReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.expression; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹è¡¨è¾¾å¼åˆ†é¡µ Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmProcessExpressionPageReqVO extends PageParam { - - @Schema(description = "表达å¼åå­—", example = "æŽå››") - private String name; - - @Schema(description = "表达å¼çжæ€", example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java deleted file mode 100644 index 2bb959b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.expression; - -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹è¡¨è¾¾å¼ Response VO") -@Data -public class BpmProcessExpressionRespVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3870") - @ExcelProperty("ç¼–å·") - private Long id; - - @Schema(description = "表达å¼åå­—", requiredMode = Schema.RequiredMode.REQUIRED, example = "æŽå››") - @ExcelProperty("表达å¼åå­—") - private String name; - - @Schema(description = "表达å¼çжæ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "表达å¼", requiredMode = Schema.RequiredMode.REQUIRED) - private String expression; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionSaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionSaveReqVO.java deleted file mode 100644 index a5771d1..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionSaveReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.expression; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹è¡¨è¾¾å¼æ–°å¢ž/修改 Request VO") -@Data -public class BpmProcessExpressionSaveReqVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3870") - private Long id; - - @Schema(description = "表达å¼åå­—", requiredMode = Schema.RequiredMode.REQUIRED, example = "æŽå››") - @NotEmpty(message = "表达å¼åå­—ä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "表达å¼çжæ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "表达å¼çжæ€ä¸èƒ½ä¸ºç©º") - private Integer status; - - @Schema(description = "表达å¼", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "表达å¼ä¸èƒ½ä¸ºç©º") - private String expression; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java deleted file mode 100644 index 53af985..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.form; - -import lombok.Data; - -/** - * æµç¨‹è¡¨å•字段 VO - */ -@Data -public class BpmFormFieldVO { - - /** - * 字段类型 - */ - private String type; - /** - * 字段标识 - */ - private String field; - /** - * 字段标题 - */ - private String title; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java deleted file mode 100644 index 4160512..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.form; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - 动æ€è¡¨å•分页 Request VO") -@Data -public class BpmFormPageReqVO extends PageParam { - - @Schema(description = "表å•åç§°", example = "ZT") - private String name; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java deleted file mode 100644 index 1950d7a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.form; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管ç†åŽå° - 动æ€è¡¨å• Response VO") -@Data -public class BpmFormRespVO { - - @Schema(description = "表å•ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "表å•åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - @NotNull(message = "表å•åç§°ä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "表å•çš„é…ç½®-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @Schema(description = "表å•项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "表å•项的数组ä¸èƒ½ä¸ºç©º") - private List fields; - - @Schema(description = "表å•状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "表å•状æ€ä¸èƒ½ä¸ºç©º") - private Integer status; // å‚è§ CommonStatusEnum 枚举 - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormSaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormSaveReqVO.java deleted file mode 100644 index 5953485..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/form/BpmFormSaveReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.form; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管ç†åŽå° - 动æ€è¡¨å•创建/æ›´æ–° Request VO") -@Data -public class BpmFormSaveReqVO { - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "表å•åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - @NotNull(message = "表å•åç§°ä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "表å•çš„é…ç½®-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @Schema(description = "表å•项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "表å•项的数组ä¸èƒ½ä¸ºç©º") - private List fields; - - @Schema(description = "表å•状æ€-å‚è§ CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "表å•状æ€ä¸èƒ½ä¸ºç©º") - private Integer status; - - @Schema(description = "备注", example = "我是备注") - private String remark; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java deleted file mode 100644 index 25a0c2f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.group; - -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.util.date.DateUtils; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - 用户组分页 Request VO") -@Data -public class BpmUserGroupPageReqVO extends PageParam { - - @Schema(description = "ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "组å", example = "ZT") - private String name; - - @Schema(description = "状æ€", example = "1") - private Integer status; - - @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java deleted file mode 100644 index 7bff95d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Set; - -@Schema(description = "管ç†åŽå° - 用户组 Response VO") -@Data -public class BpmUserGroupRespVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "组å", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "æè¿°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZTæºç ") - private String description; - - @Schema(description = "æˆå‘˜ç¼–å·æ•°ç»„", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") - private Set userIds; - - @Schema(description = "状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java deleted file mode 100644 index ceccee3..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSaveReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.group; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.Set; - -@Schema(description = "管ç†åŽå° - 用户组创建/修改 Request VO") -@Data -public class BpmUserGroupSaveReqVO { - - @Schema(description = "ç¼–å·", example = "1024") - private Long id; - - @Schema(description = "组å", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - @NotNull(message = "组åä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "æè¿°", example = "ZTæºç ") - private String description; - - @Schema(description = "æˆå‘˜ç¼–å·æ•°ç»„", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") - @NotNull(message = "æˆå‘˜ç¼–å·æ•°ç»„ä¸èƒ½ä¸ºç©º") - private Set userIds; - - @Schema(description = "状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状æ€ä¸èƒ½ä¸ºç©º") - private Integer status; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerPageReqVO.java deleted file mode 100644 index 13b8a73..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.listener; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹ç›‘å¬å™¨åˆ†é¡µ Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmProcessListenerPageReqVO extends PageParam { - - @Schema(description = "监å¬å™¨åå­—", example = "赵六") - private String name; - - @Schema(description = "监å¬å™¨ç±»åž‹", example = "execution") - private String type; - - @Schema(description = "监å¬äº‹ä»¶", example = "start") - private String event; - - @Schema(description = "状æ€", example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerRespVO.java deleted file mode 100644 index 7bfdde8..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerRespVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.listener; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹ç›‘å¬å™¨ Response VO") -@Data -public class BpmProcessListenerRespVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "13089") - private Long id; - - @Schema(description = "监å¬å™¨åå­—", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - private String name; - - @Schema(description = "监å¬å™¨ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "execution") - private String type; - - @Schema(description = "监å¬å™¨çжæ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "监å¬äº‹ä»¶", requiredMode = Schema.RequiredMode.REQUIRED, example = "start") - private String event; - - @Schema(description = "监å¬å™¨å€¼ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "class") - private String valueType; - - @Schema(description = "监å¬å™¨å€¼", requiredMode = Schema.RequiredMode.REQUIRED) - private String value; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerSaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerSaveReqVO.java deleted file mode 100644 index 908caa9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/listener/BpmProcessListenerSaveReqVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.listener; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - BPM æµç¨‹ç›‘å¬å™¨æ–°å¢ž/修改 Request VO") -@Data -public class BpmProcessListenerSaveReqVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "13089") - private Long id; - - @Schema(description = "监å¬å™¨åå­—", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - @NotEmpty(message = "监å¬å™¨åå­—ä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "监å¬å™¨ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "execution") - @NotEmpty(message = "监å¬å™¨ç±»åž‹ä¸èƒ½ä¸ºç©º") - private String type; - - @Schema(description = "监å¬å™¨çжæ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "监å¬å™¨çжæ€ä¸èƒ½ä¸ºç©º") - private Integer status; - - @Schema(description = "监å¬äº‹ä»¶", requiredMode = Schema.RequiredMode.REQUIRED, example = "start") - @NotEmpty(message = "监å¬äº‹ä»¶ä¸èƒ½ä¸ºç©º") - private String event; - - @Schema(description = "监å¬å™¨å€¼ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "class") - @NotEmpty(message = "监å¬å™¨å€¼ç±»åž‹ä¸èƒ½ä¸ºç©º") - private String valueType; - - @Schema(description = "监å¬å™¨å€¼", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "监å¬å™¨å€¼ä¸èƒ½ä¸ºç©º") - private String value; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModeUpdateBpmnReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModeUpdateBpmnReqVO.java deleted file mode 100644 index 03e0e5f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModeUpdateBpmnReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„æ›´æ–° BPMN XML Request VO") -@Data -public class BpmModeUpdateBpmnReqVO { - - @Schema(description = "æµç¨‹ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "æµç¨‹ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "BPMN XML ä¸èƒ½ä¸ºç©º") - private String bpmnXml; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java deleted file mode 100644 index dcc06fc..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model; - -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.framework.common.validation.InEnum; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.enums.definition.BpmAutoApproveTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmModelTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.hibernate.validator.constraints.URL; - -import java.util.List; - -/** - * BPM æµç¨‹ MetaInfo Response DTO - * 主è¦ç”¨äºŽ { Model#setMetaInfo(String)} 的存储 - * - * 最终,它的字段和 - * {@link com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO} - * 是一致的 - * - * @author ZT - */ -@Data -public class BpmModelMetaInfoVO { - - @Schema(description = "æµç¨‹å›¾æ ‡", example = "https://www.iocoder.cn/zt.jpg") - @URL(message = "æµç¨‹å›¾æ ‡æ ¼å¼ä¸æ­£ç¡®") - private String icon; - - @Schema(description = "æµç¨‹æè¿°", example = "我是æè¿°") - private String description; - - @Schema(description = "æµç¨‹ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(BpmModelTypeEnum.class) - @NotNull(message = "æµç¨‹ç±»åž‹ä¸èƒ½ä¸ºç©º") - private Integer type; - - @Schema(description = "表å•类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(BpmModelFormTypeEnum.class) - @NotNull(message = "表å•类型ä¸èƒ½ä¸ºç©º") - private Integer formType; - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long formId; // formType 为 NORMAL 使用,必须éžç©º - - @Schema(description = "自定义表å•çš„æäº¤è·¯å¾„,使用 Vue 的路由地å€", example = "/bpm/oa/leave/create") - private String formCustomCreatePath; // 表å•类型为 CUSTOM 时,必须éžç©º - @Schema(description = "自定义表å•的查看路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/view") - private String formCustomViewPath; // 表å•类型为 CUSTOM 时,必须éžç©º - - @Schema(description = "是å¦å¯è§", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是å¦å¯è§ä¸èƒ½ä¸ºç©º") - private Boolean visible; - - @Schema(description = "是å¦å…è®¸é‡æ–°å‘èµ·", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是å¦å…è®¸é‡æ–°å‘èµ·ä¸èƒ½ä¸ºç©º") - private Boolean restart; - - @Schema(description = "å¯å‘èµ·ç”¨æˆ·ç¼–å·æ•°ç»„", example = "[1,2,3]") - private List startUserIds; - - @Schema(description = "å¯å‘èµ·éƒ¨é—¨ç¼–å·æ•°ç»„", example = "[2,4,6]") - private List startDeptIds; - - @Schema(description = "å¯ç®¡ç†ç”¨æˆ·ç¼–å·æ•°ç»„", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2,4,6]") - @NotEmpty(message = "å¯ç®¡ç†ç”¨æˆ·ç¼–å·æ•°ç»„ä¸èƒ½ä¸ºç©º") - private List managerUserIds; - - @Schema(description = "排åº", example = "1") - private Long sort; // 创建时,åŽç«¯è‡ªåŠ¨ç”Ÿæˆ - - @Schema(description = "å…许撤销审批中的申请", example = "true") - private Boolean allowCancelRunningProcess; - - @Schema(description = "æµç¨‹ ID 规则", example = "{}") - private ProcessIdRule processIdRule; - - @Schema(description = "自动去é‡ç±»åž‹", example = "1") - @InEnum(BpmAutoApproveTypeEnum.class) - private Integer autoApprovalType; - - @Schema(description = "标题设置", example = "{}") - private TitleSetting titleSetting; - - @Schema(description = "摘è¦è®¾ç½®", example = "{}") - private SummarySetting summarySetting; - - @Schema(description = "æµç¨‹å‰ç½®é€šçŸ¥è®¾ç½®", example = "{}") - private HttpRequestSetting processBeforeTriggerSetting; - - @Schema(description = "æµç¨‹åŽç½®é€šçŸ¥è®¾ç½®", example = "{}") - private HttpRequestSetting processAfterTriggerSetting; - - @Schema(description = "任务å‰ç½®é€šçŸ¥è®¾ç½®", example = "{}") - private HttpRequestSetting taskBeforeTriggerSetting; - - @Schema(description = "任务åŽç½®é€šçŸ¥è®¾ç½®", example = "{}") - private HttpRequestSetting taskAfterTriggerSetting; - - @Schema(description = "æµç¨‹ ID 规则") - @Data - @Valid - public static class ProcessIdRule { - - @Schema(description = "是å¦å¯ç”¨", example = "false") - @NotNull(message = "是å¦å¯ç”¨ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "å‰ç¼€", example = "XX") - private String prefix; - - @Schema(description = "中缀", example = "20250120") - private String infix; // 精确到日ã€ç²¾ç¡®åˆ°æ—¶ã€ç²¾ç¡®åˆ°åˆ†ã€ç²¾ç¡®åˆ°ç§’ - - @Schema(description = "åŽç¼€", example = "YY") - private String postfix; - - @Schema(description = "åºåˆ—长度", example = "5") - @NotNull(message = "åºåˆ—长度ä¸èƒ½ä¸ºç©º") - private Integer length; - - } - - @Schema(description = "标题设置") - @Data - @Valid - public static class TitleSetting { - - @Schema(description = "是å¦è‡ªå®šä¹‰", example = "false") - @NotNull(message = "是å¦è‡ªå®šä¹‰ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "标题", example = "æµç¨‹æ ‡é¢˜") - private String title; - - } - - @Schema(description = "摘è¦è®¾ç½®") - @Data - @Valid - public static class SummarySetting { - - @Schema(description = "是å¦è‡ªå®šä¹‰", example = "false") - @NotNull(message = "是å¦è‡ªå®šä¹‰ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "摘è¦å­—段数组", example = "[]") - private List summary; - - } - - @Schema(description = "http 请求通知设置", example = "{}") - @Data - public static class HttpRequestSetting { - - @Schema(description = "请求路径", example = "http://127.0.0.1") - @NotEmpty(message = "请求 URL ä¸èƒ½ä¸ºç©º") - @URL(message = "请求 URL æ ¼å¼ä¸æ­£ç¡®") - private String url; - - @Schema(description = "è¯·æ±‚å¤´å‚æ•°è®¾ç½®", example = "[]") - @Valid - private List header; - - @Schema(description = "è¯·æ±‚å¤´å‚æ•°è®¾ç½®", example = "[]") - @Valid - private List body; - - /** - * 请求返回处ç†è®¾ç½®ï¼Œç”¨äºŽä¿®æ”¹æµç¨‹è¡¨å•值 - *

- * key:表示è¦ä¿®æ”¹çš„æµç¨‹è¡¨å•字段å(name) - * value:接å£è¿”回的字段å - */ - @Schema(description = "请求返回处ç†è®¾ç½®", example = "[]") - private List> response; - - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java deleted file mode 100644 index 63ef57d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model; - -import com.zt.plat.module.bpm.controller.admin.base.dept.DeptSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管ç†åŽå° - æµç¨‹æ¨¡åž‹ Response VO") -@Data -public class BpmModelRespVO extends BpmModelMetaInfoVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "æµç¨‹æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_zt") - private String key; - - @Schema(description = "æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "æµç¨‹å›¾æ ‡", example = "https://www.iocoder.cn/zt.jpg") - private String icon; - - @Schema(description = "æµç¨‹åˆ†ç±»ç¼–å·", example = "1") - private String category; - @Schema(description = "æµç¨‹åˆ†ç±»åå­—", example = "请å‡") - private String categoryName; - - @Schema(description = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "å¯å‘起的用户数组") - private List startUsers; - - @Schema(description = "å¯å‘起的部门数组") - private List startDepts; - - @Schema(description = "BPMN XML") - private String bpmnXml; - - @Schema(description = "仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹å¯¹è±¡") - private BpmSimpleModelNodeVO simpleModel; - - /** - * 最新部署的æµç¨‹å®šä¹‰ - */ - private BpmProcessDefinitionRespVO processDefinition; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelSaveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelSaveReqVO.java deleted file mode 100644 index 6d57341..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelSaveReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model; - -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„ä¿å­˜ Request VO") -@Data -public class BpmModelSaveReqVO extends BpmModelMetaInfoVO { - - @Schema(description = "ç¼–å·", example = "1024") - private String id; - - @Schema(description = "æµç¨‹æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_zt") - @NotEmpty(message = "æµç¨‹æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String key; - - @Schema(description = "æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - @NotEmpty(message = "æµç¨‹åç§°ä¸èƒ½ä¸ºç©º") - private String name; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "BPMN XML") - private String bpmnXml; - - @Schema(description = "仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹å¯¹è±¡") - @Valid - private BpmSimpleModelNodeVO simpleModel; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java deleted file mode 100644 index cd7fea1..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹æ¨¡åž‹æ›´æ–°çŠ¶æ€ Request VO") -@Data -public class BpmModelUpdateStateReqVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状æ€ä¸èƒ½ä¸ºç©º") - private Integer state; // å‚è§ Flowable SuspensionState 枚举 - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java deleted file mode 100644 index cd5177a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ /dev/null @@ -1,526 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple; - -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.framework.common.validation.InEnum; -import com.zt.plat.module.bpm.enums.definition.*; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.flowable.bpmn.model.IOParameter; -import org.hibernate.validator.constraints.URL; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -@Schema(description = "管ç†åŽå° - 仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹èŠ‚ç‚¹ VO") -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class BpmSimpleModelNodeVO { - - @Schema(description = "模型节点编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartEvent_1") - @NotEmpty(message = "模型节点编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "模型节点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "模型节点类型ä¸èƒ½ä¸ºç©º") - @InEnum(BpmSimpleModelNodeTypeEnum.class) - private Integer type; - - @Schema(description = "模型节点åç§°", example = "领导审批") - private String name; - - @Schema(description = "节点展示内容", example = "指定æˆå‘˜: ZTæºç ") - private String showText; - - @Schema(description = "å­èŠ‚ç‚¹") - private BpmSimpleModelNodeVO childNode; // 补充说明:在该模型下,å­èŠ‚ç‚¹æœ‰ä¸”ä»…æœ‰ä¸€ä¸ªï¼Œä¸ä¼šæœ‰å¤šä¸ª - - @Schema(description = "候选人策略", example = "30") - @InEnum(BpmTaskCandidateStrategyEnum.class) - private Integer candidateStrategy; // 用于审批,抄é€èŠ‚ç‚¹ - - @Schema(description = "å€™é€‰äººå‚æ•°") - private String candidateParam; // 用于审批,抄é€èŠ‚ç‚¹ - - @Schema(description = "审批节点类型", example = "1") - @InEnum(BpmUserTaskApproveTypeEnum.class) - private Integer approveType; // 用于审批节点 - - @Schema(description = "多人审批方å¼", example = "1") - @InEnum(BpmUserTaskApproveMethodEnum.class) - private Integer approveMethod; // 用于审批节点 - - @Schema(description = "通过比例", example = "100") - private Integer approveRatio; // 通过比例,当多人审批方å¼ä¸ºï¼šå¤šäººä¼šç­¾(按通过比例) 需è¦è®¾ç½® - - @Schema(description = "è¡¨å•æƒé™", example = "[]") - private List> fieldsPermission; - - @Schema(description = "æ“作按钮设置", example = "[]") - private List buttonsSetting; // 用于审批节点 - - @Schema(description = "是å¦éœ€è¦ç­¾å", example = "false") - private Boolean signEnable; - - @Schema(description = "是å¦å¡«å†™å®¡æ‰¹æ„è§", example = "false") - private Boolean reasonRequire; - - /** - * 审批节点拒ç»å¤„ç† - */ - private RejectHandler rejectHandler; - - /** - * å®¡æ‰¹èŠ‚ç‚¹è¶…æ—¶å¤„ç† - */ - private TimeoutHandler timeoutHandler; - - @Schema(description = "审批节点的审批人与å‘èµ·äººç›¸åŒæ—¶ï¼Œå¯¹åº”的处ç†ç±»åž‹", example = "1") - @InEnum(BpmUserTaskAssignStartUserHandlerTypeEnum.class) - private Integer assignStartUserHandlerType; - - /** - * 空处ç†ç­–ç•¥ - */ - private AssignEmptyHandler assignEmptyHandler; - - /** - * 创建任务监å¬å™¨ - */ - private ListenerHandler taskCreateListener; - /** - * 指派任务监å¬å™¨ - */ - private ListenerHandler taskAssignListener; - /** - * 完æˆä»»åŠ¡ç›‘å¬å™¨ - */ - private ListenerHandler taskCompleteListener; - - @Schema(description = "延迟器设置", example = "{}") - private DelaySetting delaySetting; - - @Schema(description = "æ¡ä»¶èŠ‚ç‚¹") - private List conditionNodes; // 补充说明:有且仅有æ¡ä»¶ã€å¹¶è¡Œã€åŒ…容分支会使用 - - /** - * æ¡ä»¶èŠ‚ç‚¹è®¾ç½® - */ - private ConditionSetting conditionSetting; // 仅用于æ¡ä»¶èŠ‚ç‚¹ BpmSimpleModelNodeTypeEnum.CONDITION_NODE - - @Schema(description = "路由分支组", example = "[]") - private List routerGroups; - - @Schema(description = "路由分支默认分支 ID", example = "Flow_xxx", hidden = true) // ç”±åŽç«¯ç”Ÿæˆï¼ˆä¸ä»Žå‰ç«¯ä¼ é€’),所以 hidden = true - @JsonIgnore - private String routerDefaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE - - /** - * 触å‘器节点设置 - */ - private TriggerSetting triggerSetting; - - @Schema(description = "附加节点 Id", example = "UserTask_xxx", hidden = true) // ç”±åŽç«¯ç”Ÿæˆï¼ˆä¸ä»Žå‰ç«¯ä¼ é€’),所以 hidden = true - @JsonIgnore - private String attachNodeId; // ç›®å‰ç”¨äºŽè§¦å‘器节点(HTTP å›žè°ƒï¼‰ã€‚éœ€è¦ UserTask å’Œ ReceiveTask(附加节点) æ¥å®Œæˆ - - /** - * å­æµç¨‹è®¾ç½® - */ - private ChildProcessSetting childProcessSetting; - - @Schema(description = "任务监å¬å™¨") - @Valid - @Data - public static class ListenerHandler { - - @Schema(description = "是å¦å¼€å¯ä»»åŠ¡ç›‘å¬å™¨", example = "false") - @NotNull(message = "是å¦å¼€å¯ä»»åŠ¡ç›‘å¬å™¨ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "请求路径", example = "http://xxxxx") - private String path; - - @Schema(description = "请求头", example = "[]") - private List header; - - @Schema(description = "请求体", example = "[]") - private List body; - - } - - @Schema(description = "HTTP è¯·æ±‚å‚æ•°è®¾ç½®") - @Data - public static class HttpRequestParam { - - @Schema(description = "值类型", example = "1") - @InEnum(BpmHttpRequestParamTypeEnum.class) - @NotNull(message = "值类型ä¸èƒ½ä¸ºç©º") - private Integer type; - - @Schema(description = "é”®", example = "xxx") - @NotEmpty(message = "é”®ä¸èƒ½ä¸ºç©º") - private String key; - - @Schema(description = "值", example = "xxx") - @NotEmpty(message = "值ä¸èƒ½ä¸ºç©º") - private String value; - - } - - @Schema(description = "审批节点拒ç»å¤„ç†ç­–ç•¥") - @Data - public static class RejectHandler { - - @Schema(description = "æ‹’ç»å¤„ç†ç±»åž‹", example = "1") - @InEnum(BpmUserTaskRejectHandlerTypeEnum.class) - private Integer type; - - @Schema(description = "任务拒ç»åŽé©³å›žçš„节点 Id", example = "Activity_1") - private String returnNodeId; - } - - @Schema(description = "审批节点超时处ç†ç­–ç•¥") - @Valid - @Data - public static class TimeoutHandler { - - @Schema(description = "是å¦å¼€å¯è¶…时处ç†", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦å¼€å¯è¶…时处ç†ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "任务超时未处ç†çš„行为", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "任务超时未处ç†çš„行为ä¸èƒ½ä¸ºç©º") - @InEnum(BpmUserTaskTimeoutHandlerTypeEnum.class) - private Integer type; - - @Schema(description = "è¶…æ—¶æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED, example = "PT6H") - @NotEmpty(message = "è¶…æ—¶æ—¶é—´ä¸èƒ½ä¸ºç©º") - private String timeDuration; - - @Schema(description = "最大æé†’次数", example = "1") - private Integer maxRemindCount; - } - - @Schema(description = "空处ç†ç­–ç•¥") - @Data - @Valid - public static class AssignEmptyHandler { - - @Schema(description = "空处ç†ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "空处ç†ç±»åž‹ä¸èƒ½ä¸ºç©º") - @InEnum(BpmUserTaskAssignEmptyHandlerTypeEnum.class) - private Integer type; - - @Schema(description = "æŒ‡å®šäººå‘˜å®¡æ‰¹çš„ç”¨æˆ·ç¼–å·æ•°ç»„", example = "1") - private List userIds; - } - - @Schema(description = "æ“作按钮设置") - @Data - @Valid - public static class OperationButtonSetting { - - // TODO @jasonï¼šæ˜¯ä¸æ˜¯æŒ‰é’®çš„æ ‡è¯†ï¼Ÿid 会和数æ®åº“çš„ id 自增有点模糊,key 标识会更åˆç†ä¸€ç‚¹ç‚¹å“ˆã€‚ - @Schema(description = "按钮 Id", example = "1") - private Integer id; - - @Schema(description = "显示åç§°", example = "审批") - private String displayName; - - @Schema(description = "是å¦å¯ç”¨", example = "true") - private Boolean enable; - } - - @Schema(description = "æ¡ä»¶è®¾ç½®") - @Data - @Valid - // 仅用于æ¡ä»¶èŠ‚ç‚¹ BpmSimpleModelNodeTypeEnum.CONDITION_NODE - public static class ConditionSetting { - - @Schema(description = "æ¡ä»¶ç±»åž‹", example = "1") - @InEnum(BpmSimpleModeConditionTypeEnum.class) - private Integer conditionType; - - @Schema(description = "æ¡ä»¶è¡¨è¾¾å¼", example = "${day>3}") - private String conditionExpression; - - @Schema(description = "是å¦é»˜è®¤æ¡ä»¶", example = "true") - private Boolean defaultFlow; - - /** - * æ¡ä»¶ç»„ - */ - private ConditionGroups conditionGroups; - } - - @Schema(description = "æ¡ä»¶ç»„") - @Data - @Valid - public static class ConditionGroups { - - @Schema(description = "æ¡ä»¶ç»„下的æ¡ä»¶å…³ç³»æ˜¯å¦ä¸ºä¸Žå…³ç³»", example = "true") - @NotNull(message = "æ¡ä»¶å…³ç³»ä¸èƒ½ä¸ºç©º") - private Boolean and; - - @Schema(description = "æ¡ä»¶ç»„下的æ¡ä»¶", example = "[]") - @NotEmpty(message = "æ¡ä»¶ä¸èƒ½ä¸ºç©º") - private List conditions; - } - - @Schema(description = "æ¡ä»¶") - @Data - @Valid - public static class Condition { - - @Schema(description = "æ¡ä»¶ä¸‹çš„规则关系是å¦ä¸ºä¸Žå…³ç³»", example = "true") - @NotNull(message = "规则关系ä¸èƒ½ä¸ºç©º") - private Boolean and; - - @Schema(description = "æ¡ä»¶ä¸‹çš„规则", example = "[]") - @NotEmpty(message = "规则ä¸èƒ½ä¸ºç©º") - private List rules; - } - - @Schema(description = "æ¡ä»¶è§„则") - @Data - @Valid - public static class ConditionRule { - - @Schema(description = "è¿è¡Œç¬¦å·", example = "==") - @NotEmpty(message = "è¿è¡Œç¬¦å·ä¸èƒ½ä¸ºç©º") - private String opCode; - - @Schema(description = "è¿ç®—符左边的值,例如æŸä¸ªæµç¨‹å˜é‡", example = "startUserId") - @NotEmpty(message = "è¿ç®—符左边的值ä¸èƒ½ä¸ºç©º") - private String leftSide; - - @Schema(description = "è¿ç®—符å³è¾¹çš„值", example = "1") - @NotEmpty(message = "è¿ç®—符å³è¾¹çš„值ä¸èƒ½ä¸ºç©º") - private String rightSide; - } - - @Schema(description = "延迟器") - @Data - @Valid - public static class DelaySetting { - - @Schema(description = "延迟时间类型", example = "1") - @NotNull(message = "延迟时间类型ä¸èƒ½ä¸ºç©º") - @InEnum(BpmDelayTimerTypeEnum.class) - private Integer delayType; - - @Schema(description = "延迟时间表达å¼", example = "PT1H,2025-01-01T00:00:00") - @NotEmpty(message = "延迟时间表达å¼ä¸èƒ½ä¸ºç©º") - private String delayTime; - } - - @Schema(description = "路由分支") - @Data - @Valid - public static class RouterSetting { - - @Schema(description = "节点 Id", example = "Activity_xxx") // 跳转到该节点 - @NotEmpty(message = "节点 Id ä¸èƒ½ä¸ºç©º") - private String nodeId; - - @Schema(description = "æ¡ä»¶ç±»åž‹", example = "1") - @InEnum(BpmSimpleModeConditionTypeEnum.class) - @NotNull(message = "æ¡ä»¶ç±»åž‹ä¸èƒ½ä¸ºç©º") - private Integer conditionType; - - @Schema(description = "æ¡ä»¶è¡¨è¾¾å¼", example = "${day>3}") - private String conditionExpression; - - @Schema(description = "æ¡ä»¶ç»„", example = "{}") - private ConditionGroups conditionGroups; - } - - @Schema(description = "触å‘器节点é…ç½®") - @Data - @Valid - public static class TriggerSetting { - - @Schema(description = "触å‘器类型", example = "1") - @InEnum(BpmTriggerTypeEnum.class) - @NotNull(message = "触å‘器类型ä¸èƒ½ä¸ºç©º") - private Integer type; - - /** - * http 请求触å‘器设置 - */ - @Valid - private HttpRequestTriggerSetting httpRequestSetting; - - /** - * æµç¨‹è¡¨å•触å‘器设置 - */ - private List formSettings; - - @Schema(description = "http 请求触å‘器设置", example = "{}") - @Data - public static class HttpRequestTriggerSetting { - - @Schema(description = "请求路径", example = "http://127.0.0.1") - @NotEmpty(message = "请求 URL ä¸èƒ½ä¸ºç©º") - @URL(message = "请求 URL æ ¼å¼ä¸æ­£ç¡®") - private String url; - - @Schema(description = "è¯·æ±‚å¤´å‚æ•°è®¾ç½®", example = "[]") - @Valid - private List header; - - @Schema(description = "è¯·æ±‚å¤´å‚æ•°è®¾ç½®", example = "[]") - @Valid - private List body; - - /** - * 请求返回处ç†è®¾ç½®ï¼Œç”¨äºŽä¿®æ”¹æµç¨‹è¡¨å•值 - *

- * key:表示è¦ä¿®æ”¹çš„æµç¨‹è¡¨å•字段å(name) - * value:接å£è¿”回的字段å - */ - @Schema(description = "请求返回处ç†è®¾ç½®", example = "[]") - private List> response; - - /** - * Http å›žè°ƒè¯·æ±‚ï¼Œéœ€è¦æŒ‡å®šå›žè°ƒä»»åŠ¡ Key,用于回调执行 - */ - @Schema(description = "回调任务 Key", example = "xxx", hidden = true) - private String callbackTaskDefineKey; - - } - - @Schema(description = "æµç¨‹è¡¨å•触å‘器设置", example = "{}") - @Data - public static class FormTriggerSetting { - - @Schema(description = "æ¡ä»¶ç±»åž‹", example = "1") - @InEnum(BpmSimpleModeConditionTypeEnum.class) - private Integer conditionType; - - @Schema(description = "æ¡ä»¶è¡¨è¾¾å¼", example = "${day>3}") - private String conditionExpression; - - @Schema(description = "æ¡ä»¶ç»„", example = "{}") - private ConditionGroups conditionGroups; - - @Schema(description = "修改的表å•字段", example = "{}") - private Map updateFormFields; - - @Schema(description = "删除表å•字段", example = "[]") - private Set deleteFields; - } - } - - @Schema(description = "å­æµç¨‹èŠ‚ç‚¹é…ç½®") - @Data - @Valid - public static class ChildProcessSetting { - - @Schema(description = "被调用æµç¨‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx") - @NotEmpty(message = "被调用æµç¨‹ä¸èƒ½ä¸ºç©º") - private String calledProcessDefinitionKey; - - @Schema(description = "被调用æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx") - @NotEmpty(message = "被调用æµç¨‹åç§°ä¸èƒ½ä¸ºç©º") - private String calledProcessDefinitionName; - - @Schema(description = "是å¦å¼‚æ­¥", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦å¼‚æ­¥ä¸èƒ½ä¸ºç©º") - private Boolean async; - - @Schema(description = "è¾“å…¥å‚æ•°(主->å­)", example = "[]") - private List inVariables; - - @Schema(description = "è¾“å‡ºå‚æ•°(å­->主)", example = "[]") - private List outVariables; - - @Schema(description = "是å¦è‡ªåŠ¨è·³è¿‡å­æµç¨‹å‘起节点", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦è‡ªåŠ¨è·³è¿‡å­æµç¨‹å‘起节点ä¸èƒ½ä¸ºç©º") - private Boolean skipStartUserNode; - - @Schema(description = "å­æµç¨‹å‘起人é…ç½®", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") - @NotNull(message = "å­æµç¨‹å‘起人é…ç½®ä¸èƒ½ä¸ºç©º") - private StartUserSetting startUserSetting; - - @Schema(description = "超时设置", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") - private TimeoutSetting timeoutSetting; - - @Schema(description = "多实例设置", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") - private MultiInstanceSetting multiInstanceSetting; - - @Schema(description = "å­æµç¨‹å‘起人é…ç½®") - @Data - @Valid - public static class StartUserSetting { - - @Schema(description = "å­æµç¨‹å‘起人类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "å­æµç¨‹å‘起人类型") - @InEnum(BpmChildProcessStartUserTypeEnum.class) - private Integer type; - - @Schema(description = "表å•", example = "xxx") - private String formField; - - @Schema(description = "当孿µç¨‹å‘起人为空时类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "当孿µç¨‹å‘起人为空时类型ä¸èƒ½ä¸ºç©º") - @InEnum(BpmChildProcessStartUserEmptyTypeEnum.class) - private Integer emptyType; - - } - - @Schema(description = "超时设置") - @Data - @Valid - public static class TimeoutSetting { - - @Schema(description = "是å¦å¼€å¯è¶…时设置", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦å¼€å¯è¶…时设置ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "时间类型", example = "1") - @InEnum(BpmDelayTimerTypeEnum.class) - private Integer type; - - @Schema(description = "时间表达å¼", example = "PT1H,2025-01-01T00:00:00") - private String timeExpression; - - } - - @Schema(description = "多实例设置") - @Data - @Valid - public static class MultiInstanceSetting { - - @Schema(description = "是å¦å¼€å¯å¤šå®žä¾‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦å¼€å¯å¤šå®žä¾‹ä¸èƒ½ä¸ºç©º") - private Boolean enable; - - @Schema(description = "是å¦ä¸²è¡Œ", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是å¦ä¸²è¡Œä¸èƒ½ä¸ºç©º") - private Boolean sequential; - - @Schema(description = "å®Œæˆæ¯”例", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "å®Œæˆæ¯”例ä¸èƒ½ä¸ºç©º") - private Integer approveRatio; - - @Schema(description = "å¤šå®žä¾‹æ¥æºç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "å¤šå®žä¾‹æ¥æºç±»åž‹ä¸èƒ½ä¸ºç©º") - @InEnum(BpmChildProcessMultiInstanceSourceTypeEnum.class) - private Integer sourceType; - - @Schema(description = "å¤šå®žä¾‹æ¥æº", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "å¤šå®žä¾‹æ¥æºä¸èƒ½ä¸ºç©º") - private String source; - - } - - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelUpdateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelUpdateReqVO.java deleted file mode 100644 index 43981ba..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelUpdateReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -// TODO @jason:需è¦è€ƒè™‘,如果æŸä¸ªèŠ‚ç‚¹çš„é…ç½®ä¸æ­£ç¡®ï¼Œéœ€è¦æœ‰æç¤ºï¼›å…·ä½“怎么实现,å¯ä»¥è®¨è®ºä¸‹ï¼› -@Schema(description = "管ç†åŽå° - 仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹çš„æ–°å¢ž/修改 Request VO") -@Data -public class BpmSimpleModelUpdateReqVO { - - @Schema(description = "æµç¨‹æ¨¡åž‹ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotEmpty(message = "æµç¨‹æ¨¡åž‹ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; // 对应 Flowable act_re_model 表 ID_ 字段 - - @Schema(description = "仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹å¯¹è±¡", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹å¯¹è±¡ä¸èƒ½ä¸ºç©º") - @Valid - private BpmSimpleModelNodeVO simpleModel; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java deleted file mode 100644 index 8c61e28..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.process; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®šä¹‰åˆ†é¡µ Request VO") -@Data -public class BpmProcessDefinitionPageReqVO extends PageParam { - - @Schema(description = "标识-精准匹é…", example = "process1641042089407") - private String key; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java deleted file mode 100644 index f0d2892..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.definition.vo.process; - -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®šä¹‰ Response VO") -@Data -public class BpmProcessDefinitionRespVO extends BpmModelMetaInfoVO { - - @Schema(description = "ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer version; - - @Schema(description = "æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "æµç¨‹æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "youdao") - private String key; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - @Schema(description = "æµç¨‹åˆ†ç±»åå­—", example = "请å‡") - private String categoryName; - - @Schema(description = "æµç¨‹æ¨¡åž‹çš„类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer modelType; // å‚è§ BpmModelTypeEnum 枚举类 - - @Schema(description = "æµç¨‹æ¨¡åž‹çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "ABC") - private String modelId; - - @Schema(description = "表å•çš„é…ç½®-JSON 字符串。在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º", requiredMode = Schema.RequiredMode.REQUIRED) - private String formConf; - @Schema(description = "表å•项的数组-JSON 字符串的数组。在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º", requiredMode = Schema.RequiredMode.REQUIRED) - private List formFields; - @Schema(description = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - - @Schema(description = "中断状æ€-å‚è§ SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer suspensionState; // å‚è§ SuspensionState 枚举 - - @Schema(description = "部署时间") - private LocalDateTime deploymentTime; // 需è¦ä»Žå¯¹åº”çš„ Deployment 读å–,éžå¿…须返回 - - @Schema(description = "BPMN XML") - private String bpmnXml; // 需è¦ä»Žå¯¹åº”çš„ BpmnModel 读å–,éžå¿…须返回 - - @Schema(description = "SIMPLE è®¾è®¡å™¨æ¨¡åž‹æ•°æ® json æ ¼å¼") - private String simpleModel; // éžå¿…须返回 - - @Schema(description = "æµç¨‹å®šä¹‰æŽ’åº", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long sort; - - @Schema(description = "BPMN UserTask 用户任务") - @Data - public static class UserTask { - - @Schema(description = "任务标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "sudo") - private String id; - - @Schema(description = "任务å", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - private String name; - - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.http b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.http deleted file mode 100644 index 96bbf96..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.http +++ /dev/null @@ -1,12 +0,0 @@ -### 请求 /bpm/oa/leave/create æŽ¥å£ => æˆåŠŸ -POST {{baseUrl}}/bpm/oa/leave/create -Content-Type: application/json -tenant-id: 1 -Authorization: Bearer {{token}} - -{ - "startTime": "2022-03-01", - "endTime": "2022-03-05", - "type": 1, - "reason": "我è¦è¯·å‡å•¦å•¦å•¦ï¼" -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.java deleted file mode 100644 index 51d5094..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/BpmOALeaveController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.oa; - -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; -import com.zt.plat.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import com.zt.plat.module.bpm.service.oa.BpmOALeaveService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -/** - * OA 请å‡ç”³è¯· Controller,用于演示自己存储数æ®ï¼ŒæŽ¥å…¥å·¥ä½œæµçš„ä¾‹å­ - * - * @author jason - * @author ZT - */ -@Tag(name = "管ç†åŽå° - OA 请å‡ç”³è¯·") -@RestController -@RequestMapping("/bpm/oa/leave") -@Validated -public class BpmOALeaveController { - - @Resource - private BpmOALeaveService leaveService; - - @PostMapping("/create") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')") - @Operation(summary = "创建请求申请") - public CommonResult createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) { - return success(leaveService.createLeave(getLoginUserId(), createReqVO)); - } - - @GetMapping("/get") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") - @Operation(summary = "获得请å‡ç”³è¯·") - @Parameter(name = "id", description = "ç¼–å·", required = true, example = "1024") - public CommonResult getLeave(@RequestParam("id") Long id) { - BpmOALeaveDO leave = leaveService.getLeave(id); - return success(BeanUtils.toBean(leave, BpmOALeaveRespVO.class)); - } - - @GetMapping("/page") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") - @Operation(summary = "获得请å‡ç”³è¯·åˆ†é¡µ") - public CommonResult> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) { - PageResult pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO); - return success(BeanUtils.toBean(pageResult, BpmOALeaveRespVO.class)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/package-info.java deleted file mode 100644 index 5f65c5b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * OA 示例,用于演示外部业务接入 BPM 工作æµçš„示例 - * 一般的接入方å¼ï¼Œåªéœ€è¦è°ƒç”¨ 接å£ï¼ŒåŽç»­ Admin 用户在管ç†åŽå°çš„ã€å¾…办事务】进行审批 - */ -package com.zt.plat.module.bpm.controller.admin.oa; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java deleted file mode 100644 index 00779aa..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.oa.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - 请å‡ç”³è¯·åˆ›å»º Request VO") -@Data -public class BpmOALeaveCreateReqVO { - - @Schema(description = "请å‡çš„开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "开始时间ä¸èƒ½ä¸ºç©º") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "请å‡çš„ç»“æŸæ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "ç»“æŸæ—¶é—´ä¸èƒ½ä¸ºç©º") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; - - @Schema(description = "请å‡ç±»åž‹-å‚è§ bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读ZTæºç ") - private String reason; - - @Schema(description = "å‘起人自选审批人 Map", example = "{taskKey1: [1, 2]}") - private Map> startUserSelectAssignees; - - @AssertTrue(message = "ç»“æŸæ—¶é—´ï¼Œéœ€è¦åœ¨å¼€å§‹æ—¶é—´ä¹‹åŽ") - public boolean isEndTimeValid() { - return !getEndTime().isBefore(getStartTime()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java deleted file mode 100644 index 31c9f1b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.oa.vo; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - 请å‡ç”³è¯·åˆ†é¡µ Request VO") -@Data -public class BpmOALeavePageReqVO extends PageParam { - - @Schema(description = "状æ€", example = "1") - private Integer status; // å‚è§ BpmProcessInstanceResultEnum 枚举 - - @Schema(description = "请å‡ç±»åž‹ï¼Œå‚è§ bpm_oa_type", example = "1") - private Integer type; - - @Schema(description = "原因,模糊匹é…", example = "阅读ZTæºç ") - private String reason; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "申请时间") - private LocalDateTime[] createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java deleted file mode 100644 index ae43fcd..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.oa.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - 请å‡ç”³è¯· Response VO") -@Data -public class BpmOALeaveRespVO { - - @Schema(description = "请å‡è¡¨å•主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "请å‡ç±»åž‹ï¼Œå‚è§ bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读ZTæºç ") - private String reason; - - @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "请å‡çš„开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "请å‡çš„ç»“æŸæ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "æµç¨‹ç¼–å·") - private String processInstanceId; - - @Schema(description = "审批结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmProcessInstanceStatusEnum 枚举 - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.http b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.http deleted file mode 100644 index c690827..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.http +++ /dev/null @@ -1,16 +0,0 @@ -### 请求 /bpm/process-instance/get-bpmn æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/process-instance/get-bpmn-model-view?id=1d5fb5a6-85f8-11ef-b717-7e93075f94e3 -Content-Type: application/json -tenant-id: 1 -Authorization: Bearer {{token}} - -### 请求 /bpm/process-instance/get-bpmn æŽ¥å£ => 失败 -#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=1d5fb5a6-85f8-11ef-b717-7e93075f94e3 -#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=3ee5c5ba-904a-11ef-a76e-b2ed5d6ef911 -#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=f630dfa2-8f92-11ef-947c-ba5e239a6eb4 -#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=9de8bdbf-9133-11ef-ae97-eaf49df1f932 -#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=dd2188eb-9394-11ef-a039-7a9ac3d9eb6b -GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processDefinitionId=test-auto:1:c70a799a-9394-11ef-a039-7a9ac3d9eb6b -Content-Type: application/json -tenant-id: 1 -Authorization: Bearer {{token}} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java deleted file mode 100644 index d55f27a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.*; -import com.zt.plat.module.bpm.convert.task.BpmProcessInstanceConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; -import com.zt.plat.module.bpm.service.definition.BpmCategoryService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceCopyService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.BpmTaskService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.list.SetUniqueList; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.task.api.Task; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管ç†åŽå° - æµç¨‹å®žä¾‹") // æµç¨‹å®žä¾‹ï¼Œé€šè¿‡æµç¨‹å®šä¹‰åˆ›å»ºçš„一次“申请†-@RestController -@RequestMapping("/bpm/process-instance") -@Validated -public class BpmProcessInstanceController { - - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmTaskService taskService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmCategoryService categoryService; - @Resource - private BpmProcessInstanceCopyService processInstanceCopyService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @GetMapping("/my-page") - @Operation(summary = "获得我的实例分页列表", description = "åœ¨ã€æˆ‘çš„æµç¨‹ã€‘èœå•中,进行调用") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult> getProcessInstanceMyPage( - @Valid BpmProcessInstancePageReqVO pageReqVO) { - PageResult pageResult = processInstanceService.getProcessInstancePage( - getLoginUserId(), pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接返回 - Map> taskMap = taskService.getTaskMapByProcessInstanceIds( - convertList(pageResult.getList(), HistoricProcessInstance::getId)); - Map processDefinitionMap = processDefinitionService.getProcessDefinitionMap( - convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); - Map categoryMap = categoryService.getCategoryMap( - convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory)); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); - Set userIds = convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())); - userIds.addAll(convertSetByFlatMap(taskMap.values(), - tasks -> tasks.stream().map(Task::getAssignee).filter(StrUtil::isNotBlank).map(Long::parseLong))); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, - processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); - } - - @GetMapping("/manager-page") - @Operation(summary = "èŽ·å¾—ç®¡ç†æµç¨‹å®žä¾‹çš„分页列表", description = "åœ¨ã€æµç¨‹å®žä¾‹ã€‘èœå•中,进行调用") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:manager-query')") - public CommonResult> getProcessInstanceManagerPage( - @Valid BpmProcessInstancePageReqVO pageReqVO) { - PageResult pageResult = processInstanceService.getProcessInstancePage( - null, pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接返回 - Map> taskMap = taskService.getTaskMapByProcessInstanceIds( - convertList(pageResult.getList(), HistoricProcessInstance::getId)); - Map processDefinitionMap = processDefinitionService.getProcessDefinitionMap( - convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); - Map categoryMap = categoryService.getCategoryMap( - convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory)); - // å‘èµ·äººä¿¡æ¯ - Map userMap = adminUserApi.getUserMap( - convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); - Map deptMap = deptApi.getDeptMap( - convertSet(userMap.values(), DeptUtil::getDeptId)); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); - return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, - processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); - } - - @PostMapping("/create") - @Operation(summary = "新建æµç¨‹å®žä¾‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { - return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); - } - - @GetMapping("/get") - @Operation(summary = "获得指定æµç¨‹å®žä¾‹", description = "åœ¨ã€æµç¨‹è¯¦ç»†ã€‘界é¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult getProcessInstance(@RequestParam("id") String id) { - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id); - if (processInstance == null) { - return success(null); - } - - // 拼接返回 - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - processInstance.getProcessDefinitionId()); - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( - processInstance.getProcessDefinitionId()); - AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())).getCheckedData(); - DeptRespDTO dept = null; - if (startUser != null) { - Long deptId = DeptUtil.getDeptId(startUser); - if (deptId > 0) { - dept = deptApi.getDept(deptId).getCheckedData(); - } - } - return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance, - processDefinition, processDefinitionInfo, startUser, dept)); - } - - @DeleteMapping("/cancel-by-start-user") - @Operation(summary = "ç”¨æˆ·å–æ¶ˆæµç¨‹å®žä¾‹", description = "å–æ¶ˆå‘èµ·çš„æµç¨‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')") - public CommonResult cancelProcessInstanceByStartUser( - @Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { - processInstanceService.cancelProcessInstanceByStartUser(getLoginUserId(), cancelReqVO); - return success(true); - } - - @DeleteMapping("/cancel-by-admin") - @Operation(summary = "管ç†å‘˜å–消æµç¨‹å®žä¾‹", description = "管ç†å‘˜æ’¤å›žæµç¨‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel-by-admin')") - public CommonResult cancelProcessInstanceByManager( - @Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { - processInstanceService.cancelProcessInstanceByAdmin(getLoginUserId(), cancelReqVO); - return success(true); - } - - @GetMapping("/get-approval-detail") - @Operation(summary = "获得审批详情") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - @SuppressWarnings("unchecked") - public CommonResult getApprovalDetail(@Valid BpmApprovalDetailReqVO reqVO) { - if (StrUtil.isNotEmpty(reqVO.getProcessVariablesStr())) { - reqVO.setProcessVariables(JsonUtils.parseObject(reqVO.getProcessVariablesStr(), Map.class)); - } - return success(processInstanceService.getApprovalDetail(getLoginUserId(), reqVO)); - } - - @GetMapping("/copy-list-by-process-instance-id") - @Operation(summary = "æ ¹æ®æµç¨‹å®žä¾‹ç¼–å·è޷喿Єé€åˆ—表") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult> getCopyListByProcessInstanceId(@RequestParam("processInstanceId") String processInstanceId) { - List copyDOList = processInstanceCopyService.getByProcessInstanceId(processInstanceId); - if (CollectionUtils.isEmpty(copyDOList)) { - return success(new ArrayList<>(0)); - } - List copyVOList = new ArrayList<>(copyDOList.size()); - SetUniqueList userIdList = SetUniqueList.setUniqueList(new ArrayList<>()); - for (BpmProcessInstanceCopyDO copyDO : copyDOList) { - BpmProcessInstanceCopyVO copyVO = new BpmProcessInstanceCopyVO(); - BeanUtil.copyProperties(copyDO, copyVO); - copyVOList.add(copyVO); - userIdList.add(copyDO.getStartUserId()); - userIdList.add(copyDO.getUserId()); - } - Map userMap = adminUserApi.getUserMap(userIdList); - for (BpmProcessInstanceCopyVO copyVO : copyVOList) { - copyVO.setStartUserName(userMap.get(copyVO.getStartUserId()).getNickname()); - copyVO.setUserName(userMap.get(copyVO.getUserId()).getNickname()); - } - return success(copyVOList); - } - - @GetMapping("/get-next-approval-nodes") - @Operation(summary = "获å–下一个执行的æµç¨‹èŠ‚ç‚¹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - @SuppressWarnings("unchecked") - public CommonResult> getNextApprovalNodes(@Valid BpmApprovalDetailReqVO reqVO) { - if (StrUtil.isNotEmpty(reqVO.getProcessVariablesStr())) { - reqVO.setProcessVariables(JsonUtils.parseObject(reqVO.getProcessVariablesStr(), Map.class)); - } - return success(processInstanceService.getNextApprovalNodes(getLoginUserId(), reqVO)); - } - - @GetMapping("/get-bpmn-model-view") - @Operation(summary = "èŽ·å–æµç¨‹å®žä¾‹çš„ BPMN 模型视图", description = "åœ¨ã€æµç¨‹è¯¦ç»†ã€‘界é¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @Parameter(name = "id", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - public CommonResult getProcessInstanceBpmnModelView(@RequestParam(value = "id") String id) { - return success(processInstanceService.getProcessInstanceBpmnModelView(id)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java deleted file mode 100644 index bd644ca..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.MapUtils; -import com.zt.plat.framework.common.util.date.DateUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceCopyService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.flowable.engine.history.HistoricProcessInstance; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; -import java.util.stream.Stream; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管ç†åŽå° - æµç¨‹å®žä¾‹æŠ„é€") -@RestController -@RequestMapping("/bpm/process-instance/copy") -@Validated -public class BpmProcessInstanceCopyController { - - @Resource - private BpmProcessInstanceCopyService processInstanceCopyService; - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - - @Resource - private AdminUserApi adminUserApi; - - @GetMapping("/page") - @Operation(summary = "èŽ·å¾—æŠ„é€æµç¨‹åˆ†é¡µåˆ—表") - @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") - public CommonResult> getProcessInstanceCopyPage( - @Valid BpmProcessInstanceCopyPageReqVO pageReqVO) { - PageResult pageResult = processInstanceCopyService.getProcessInstanceCopyPage( - getLoginUserId(), pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); - } - - // 拼接返回 - Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap( - convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); - Map userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), - copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator())))); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessDefinitionId)); - return success(convertPage(pageResult, copy -> { - BpmProcessInstanceCopyRespVO copyVO = BeanUtils.toBean(copy, BpmProcessInstanceCopyRespVO.class); - MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), - user -> copyVO.setStartUser(BeanUtils.toBean(user, UserSimpleBaseVO.class))); - MapUtils.findAndThen(userMap, copy.getStartUserId(), - user -> copyVO.setCreateUser(BeanUtils.toBean(user, UserSimpleBaseVO.class))); - MapUtils.findAndThen(processInstanceMap, copyVO.getProcessInstanceId(), - processInstance -> { - copyVO.setSummary(FlowableUtils.getSummary( - processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), - processInstance.getProcessVariables())); - copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime())); - }); - return copyVO; - })); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmTaskController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmTaskController.java deleted file mode 100644 index 54db1af..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmTaskController.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.*; -import com.zt.plat.module.bpm.convert.task.BpmTaskConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.BpmTaskService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import static com.zt.plat.framework.common.pojo.CommonResult.success; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.framework.web.core.util.WebFrameworkUtils.getLoginUserId; - -/** - * @author chenbowen - */ -@Tag(name = "管ç†åŽå° - æµç¨‹ä»»åŠ¡å®žä¾‹") -@RestController -@RequestMapping("/bpm/task") -@Validated -public class BpmTaskController { - - @Resource - private BpmTaskService taskService; - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmFormService formService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @GetMapping("todo-page") - @Operation(summary = "èŽ·å– Todo 待办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskTodoPage(@Valid BpmTaskPageReqVO pageVO) { - PageResult pageResult = taskService.getTaskTodoPage(getLoginUserId(), pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // æ‹¼æŽ¥æ•°æ® - Map processInstanceMap = processInstanceService.getProcessInstanceMap( - convertSet(pageResult.getList(), Task::getProcessInstanceId)); - Map userMap = adminUserApi.getUserMap( - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), Task::getProcessDefinitionId)); - return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap)); - } - - @GetMapping("done-page") - @Operation(summary = "èŽ·å– Done 已办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskDonePage(@Valid BpmTaskPageReqVO pageVO) { - PageResult pageResult = taskService.getTaskDonePage(getLoginUserId(), pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // æ‹¼æŽ¥æ•°æ® - Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap( - convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); - Map userMap = adminUserApi.getUserMap( - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap)); - } - - @GetMapping("manager-page") - @Operation(summary = "获å–全部任务的分页", description = "ç”¨äºŽã€æµç¨‹ä»»åŠ¡ã€‘èœå•") - @PreAuthorize("@ss.hasPermission('bpm:task:mananger-query')") - public CommonResult> getTaskManagerPage(@Valid BpmTaskPageReqVO pageVO) { - PageResult pageResult = taskService.getTaskPage(getLoginUserId(), pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // æ‹¼æŽ¥æ•°æ® - Map processInstanceMap = processInstanceService.getHistoricProcessInstanceMap( - convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); - // 获得 User å’Œ Dept Map - Set userIds = convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())); - userIds.addAll(convertSet(pageResult.getList(), task -> NumberUtils.parseLong(task.getAssignee()))); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( - convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, processDefinitionInfoMap)); - } - - @GetMapping("/list-by-process-instance-id") - @Operation(summary = "获得指定æµç¨‹å®žä¾‹çš„任务列表", description = "包括完æˆçš„ã€æœªå®Œæˆçš„") - @Parameter(name = "processInstanceId", description = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskListByProcessInstanceId( - @RequestParam("processInstanceId") String processInstanceId) { - List taskList = taskService.getTaskListByProcessInstanceId(processInstanceId, true); - if (CollUtil.isEmpty(taskList)) { - return success(Collections.emptyList()); - } - - // æ‹¼æŽ¥æ•°æ® - Set userIds = convertSetByFlatMap(taskList, task -> - Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - // 获得 Form Map - Map formMap = formService.getFormMap( - convertSet(taskList, task -> { - String formKey = task.getFormKey(); - if (StrUtil.isBlank(formKey)) { - return 0L; - } - try { - return Long.parseLong(formKey); - } catch (NumberFormatException e) { - // 如果 formKey 䏿˜¯æ•°å­—(比如是URL),返回0L - return 0L; - } - })); - return success(BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, - formMap, userMap, deptMap)); - } - - @PutMapping("/approve") - @Operation(summary = "通过任务") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) { - taskService.approveTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/reject") - @Operation(summary = "ä¸é€šè¿‡ä»»åŠ¡") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) { - taskService.rejectTask(getLoginUserId(), reqVO); - return success(true); - } - - @GetMapping("/list-by-return") - @Operation(summary = "èŽ·å–æ‰€æœ‰å¯é€€å›žçš„节点", description = "ç”¨äºŽã€æµç¨‹è¯¦æƒ…】的ã€é€€å›žã€‘按钮") - @Parameter(name = "taskId", description = "当å‰ä»»åŠ¡ID", required = true) - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult> getTaskListByReturn(@RequestParam("id") String id) { - List userTaskList = taskService.getUserTaskListByReturn(id); - return success(convertList(userTaskList, userTask -> // åªè¿”回 id å’Œ name - new BpmTaskRespVO().setName(userTask.getName()).setTaskDefinitionKey(userTask.getId()))); - } - - @PutMapping("/return") - @Operation(summary = "退回任务", description = "ç”¨äºŽã€æµç¨‹è¯¦æƒ…】的ã€é€€å›žã€‘按钮") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult returnTask(@Valid @RequestBody BpmTaskReturnReqVO reqVO) { - taskService.returnTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/delegate") - @Operation(summary = "委派任务", description = "ç”¨äºŽã€æµç¨‹è¯¦æƒ…】的ã€å§”派】按钮") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult delegateTask(@Valid @RequestBody BpmTaskDelegateReqVO reqVO) { - taskService.delegateTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/transfer") - @Operation(summary = "转派任务", description = "ç”¨äºŽã€æµç¨‹è¯¦æƒ…】的ã€è½¬æ´¾ã€‘按钮") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult transferTask(@Valid @RequestBody BpmTaskTransferReqVO reqVO) { - taskService.transferTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/create-sign") - @Operation(summary = "加签", description = "before å‰åŠ ç­¾ï¼Œafter åŽåŠ ç­¾") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult createSignTask(@Valid @RequestBody BpmTaskSignCreateReqVO reqVO) { - taskService.createSignTask(getLoginUserId(), reqVO); - return success(true); - } - - @DeleteMapping("/delete-sign") - @Operation(summary = "å‡ç­¾") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult deleteSignTask(@Valid @RequestBody BpmTaskSignDeleteReqVO reqVO) { - taskService.deleteSignTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/copy") - @Operation(summary = "抄é€ä»»åŠ¡") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult copyTask(@Valid @RequestBody BpmTaskCopyReqVO reqVO) { - taskService.copyTask(getLoginUserId(), reqVO); - return success(true); - } - - @GetMapping("/list-by-parent-task-id") - @Operation(summary = "获得指定父级任务的å­ä»»åŠ¡åˆ—è¡¨") // ç›®å‰ç”¨äºŽï¼Œå‡ç­¾çš„æ—¶å€™ï¼ŒèŽ·å¾—å­ä»»åŠ¡åˆ—è¡¨ - @Parameter(name = "parentTaskId", description = "父级任务编å·", required = true) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskListByParentTaskId(@RequestParam("parentTaskId") String parentTaskId) { - List taskList = taskService.getTaskListByParentTaskId(parentTaskId); - if (CollUtil.isEmpty(taskList)) { - return success(Collections.emptyList()); - } - // æ‹¼æŽ¥æ•°æ® - Map userMap = adminUserApi.getUserMap(convertSetByFlatMap(taskList, - user -> Stream.of(NumberUtils.parseLong(user.getAssignee()), NumberUtils.parseLong(user.getOwner())))); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - return success(BpmTaskConvert.INSTANCE.buildTaskListByParentTaskId(taskList, userMap, deptMap)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java deleted file mode 100644 index 444aeae..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - æµç¨‹æ´»åŠ¨çš„ Response VO") -@Data -public class BpmActivityRespVO { - - @Schema(description = "æµç¨‹æ´»åŠ¨çš„æ ‡è¯†", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String key; - @Schema(description = "æµç¨‹æ´»åŠ¨çš„ç±»åž‹", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartEvent") - private String type; - - @Schema(description = "æµç¨‹æ´»åŠ¨çš„å¼€å§‹æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - @Schema(description = "æµç¨‹æ´»åŠ¨çš„ç»“æŸæ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "å…³è”çš„æµç¨‹ä»»åŠ¡çš„ç¼–å·", example = "2048") - private String taskId; // å…³è”çš„æµç¨‹ä»»åŠ¡ï¼Œåªæœ‰ UserTask ç­‰ç±»åž‹æ‰æœ‰ - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java deleted file mode 100644 index b968f9a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.cc; - -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹æŠ„é€çš„分页 Item Response VO") -@Data -public class BpmProcessInstanceCopyRespVO { - - @Schema(description = "抄é€ä¸»é”®", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "å‘起人", requiredMode = Schema.RequiredMode.REQUIRED) - private UserSimpleBaseVO startUser; - - @Schema(description = "æµç¨‹å®žä¾‹ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "A233") - private String processInstanceId; - @Schema(description = "æµç¨‹å®žä¾‹çš„åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试") - private String processInstanceName; - @Schema(description = "æµç¨‹å®žä¾‹çš„å‘èµ·æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime processInstanceStartTime; - - @Schema(description = "æµç¨‹æ´»åŠ¨çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED) - private String activityId; - @Schema(description = "æµç¨‹æ´»åŠ¨çš„åå­—", requiredMode = Schema.RequiredMode.REQUIRED) - private String activityName; - - @Schema(description = "æµç¨‹æ´»åŠ¨çš„ç¼–å·") - private String taskId; - - @Schema(description = "抄é€äººæ„è§") - private String reason; - - @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED) - private UserSimpleBaseVO createUser; - - @Schema(description = "æŠ„é€æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "æµç¨‹æ‘˜è¦", example = "[]") - private List> summary; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java deleted file mode 100644 index 44c775b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.AssertTrue; -import lombok.Data; - -import java.util.Map; - -@Schema(description = "管ç†åŽå° - 审批详情 Request VO") -@Data -public class BpmApprovalDetailReqVO { - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "1024") - private String processDefinitionId; // 使用场景:å‘èµ·æµç¨‹æ—¶ï¼Œä¼ æµç¨‹å®šä¹‰ ID - - @Schema(description = "æµç¨‹å˜é‡") - private Map processVariables; // ä½¿ç”¨åœºæ™¯ï¼šåŒ processDefinitionId,用于æµç¨‹é¢„测 - - @Schema(description = "æµç¨‹å˜é‡") - private String processVariablesStr; // 解决 GET æ— æ³•ä¼ é€’å¯¹è±¡çš„é—®é¢˜ï¼Œæœ€ç»ˆè½¬æ¢æˆ processVariables å˜é‡ - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", example = "1024") - private String processInstanceId; // 使用场景:æµç¨‹å·²å‘起时候传æµç¨‹å®žä¾‹ ID - - // TODO @ZTï¼šå¦‚æžœæœªæ¥ BPMN 增加æµç¨‹å›¾ï¼Œå®ƒæ²¡æœ‰å‘起人节点,会有问题。 - @Schema(description = "æµç¨‹æ´»åŠ¨ç¼–å·", example = "StartUserNode") - private String activityId; // 用于获å–è¡¨å•æƒé™ã€‚1)å‘èµ·æµç¨‹æ—¶ï¼Œä¼ â€œå‘起人节点†activityId å¯èŽ·å–å‘èµ·äººçš„è¡¨å•æƒé™ï¼›2)从抄é€åˆ—表界é¢è¿›æ¥æ—¶ï¼Œä¼ æŠ„é€çš„ activityId å¯è޷喿Єé€äººçš„è¡¨å•æƒé™ï¼› - - @Schema(description = "æµç¨‹ä»»åŠ¡ç¼–å·", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b") - private String taskId; // 用于获å–è¡¨å•æƒé™ã€‚1)从待审批/已审批界é¢è¿›æ¥æ—¶ï¼Œä¼ é€’ taskId 任务编å·ï¼Œå¯èŽ·å–任务节点的å˜å¾—æƒé™ - - @AssertTrue(message = "æµç¨‹å®šä¹‰çš„ç¼–å·å’Œæµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½åŒæ—¶ä¸ºç©º") - @JsonIgnore - public boolean isValidProcessParam() { - return StrUtil.isNotEmpty(processDefinitionId) || StrUtil.isNotEmpty(processInstanceId); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java deleted file mode 100644 index a23c868..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - - -@Schema(description = "管ç†åŽå° - 审批详情 Response VO") -@Data -public class BpmApprovalDetailRespVO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmProcessInstanceStatusEnum 枚举 - - @Schema(description = "活动节点列表", requiredMode = Schema.RequiredMode.REQUIRED) - private List activityNodes; - - @Schema(description = "表å•字段æƒé™") - private Map formFieldsPermission; - - @Schema(description = "待办任务") - private BpmTaskRespVO todoTask; - - /** - * 所属æµç¨‹å®šä¹‰ä¿¡æ¯ - */ - private BpmProcessDefinitionRespVO processDefinition; - - /** - * 所属æµç¨‹å®žä¾‹ä¿¡æ¯ - */ - private BpmProcessInstanceRespVO processInstance; - - @Schema(description = "活动节点信æ¯") - @Data - public static class ActivityNode { - - @Schema(description = "节点编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode") - private String id; - - @Schema(description = "节点åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "å‘起人") - private String name; - - @Schema(description = "节点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer nodeType; // å‚è§ BpmSimpleModelNodeType 枚举 - - @Schema(description = "节点状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; // å‚è§ BpmTaskStatusEnum 枚举 - - @Schema(description = "节点的开始时间") - private LocalDateTime startTime; - @Schema(description = "èŠ‚ç‚¹çš„ç»“æŸæ—¶é—´") - private LocalDateTime endTime; - - @Schema(description = "审批节点的任务信æ¯") - private List tasks; - - @Schema(description = "候选人策略", example = "35") - private Integer candidateStrategy; // å‚è§ BpmTaskCandidateStrategyEnum 枚举。主è¦ç”¨äºŽå‘èµ·æ—¶ï¼Œå®¡æ‰¹èŠ‚ç‚¹ã€æŠ„é€èŠ‚ç‚¹è‡ªé€‰ - - @Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 candidateUsers - private List candidateUserIds; - - @Schema(description = "候选人用户列表") - private List candidateUsers; // åªåŒ…嫿œªç”Ÿæˆ ApprovalTaskInfo 的用户列表 - - @Schema(description = "æµç¨‹ç¼–å·", example = "8761d8e0-0922-11f0-bd37-00ff1db677bf") - private String processInstanceId; // å½“ä¸”ä»…å½“ï¼Œè¯¥èŠ‚ç‚¹æ˜¯å­æµç¨‹èŠ‚ç‚¹æ—¶ï¼Œæ‰ä¼šæœ‰å€¼ï¼ˆCallActivity çš„ processInstanceId 字段) - - } - - @Schema(description = "活动节点的任务信æ¯") - @Data - public static class ActivityNodeTask { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String id; - - @Schema(description = "任务所属人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 ownerUser - private Long owner; - - @Schema(description = "任务所属人", example = "1024") - private UserSimpleBaseVO ownerUser; - - @Schema(description = "任务分é…人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 assigneeUser - private Long assignee; - - @Schema(description = "任务分é…人", example = "2048") - private UserSimpleBaseVO assigneeUser; - - @Schema(description = "任务状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmTaskStatusEnum 枚举 - - @Schema(description = "审批æ„è§", example = "åŒæ„") - private String reason; - - @Schema(description = "ç­¾å", example = "https://www.iocoder.cn/sign.png") - private String signPicUrl; - - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceBpmnModelViewRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceBpmnModelViewRespVO.java deleted file mode 100644 index bf520a0..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceBpmnModelViewRespVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; -import java.util.Set; - -@Schema(description = "管ç†åŽå° - æµç¨‹ç¤ºä¾‹çš„ BPMN 视图 Response VO") -@Data -public class BpmProcessInstanceBpmnModelViewRespVO { - - // ========== åŸºæœ¬ä¿¡æ¯ ========== - - @Schema(description = "æµç¨‹å®žä¾‹ä¿¡æ¯", requiredMode = Schema.RequiredMode.REQUIRED) - private BpmProcessInstanceRespVO processInstance; - - @Schema(description = "任务列表", requiredMode = Schema.RequiredMode.REQUIRED) - private List tasks; - - @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) - private String bpmnXml; - - @Schema(description = "SIMPLE 模型") - private BpmSimpleModelNodeVO simpleModel; - - // ========== è¿›åº¦ä¿¡æ¯ ========== - - @Schema(description = "进行中的活动节点编å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set unfinishedTaskActivityIds; // åªåŒ…括 UserTask - - @Schema(description = "å·²ç»å®Œæˆçš„æ´»åŠ¨èŠ‚ç‚¹ç¼–å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set finishedTaskActivityIds; // 包括 UserTaskã€Gateway 等,ä¸åŒ…括 SequenceFlow - - @Schema(description = "å·²ç»å®Œæˆçš„连线节点编å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set finishedSequenceFlowActivityIds; // åªåŒ…括 SequenceFlow - - @Schema(description = "å·²ç»æ‹’ç»çš„æ´»åŠ¨èŠ‚ç‚¹ç¼–å·é›†åˆ", requiredMode = Schema.RequiredMode.REQUIRED) - private Set rejectedTaskActivityIds; // åªåŒ…括 UserTask - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java deleted file mode 100644 index b9d19e2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹çš„å–æ¶ˆ Request VO") -@Data -public class BpmProcessInstanceCancelReqVO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "å–æ¶ˆåŽŸå› ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¸è¯·å‡äº†ï¼") - @NotEmpty(message = "å–æ¶ˆåŽŸå› ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageReqVO.java deleted file mode 100644 index 2aff881..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹æŠ„é€çš„分页 Request VO") -@Data -public class BpmProcessInstanceCopyPageReqVO extends PageParam { - - @Schema(description = "æµç¨‹åç§°", example = "ZT") - private String processInstanceName; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyVO.java deleted file mode 100644 index 0012c19..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyVO.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * æµç¨‹æŠ„é€ VO - * - * @author kr - * @since 2025-12-31 - */ -@Data -@NoArgsConstructor -public class BpmProcessInstanceCopyVO extends BaseDO { - - /** - * ç¼–å· - */ - private Long id; - - /** - * å‘起人 Id - */ - @Schema(description ="å‘起人 Id") - private Long startUserId; - - /** - * å‘起人 å§“å - */ - @Schema(description ="å‘起人 å§“å") - private String startUserName; - /** - * æµç¨‹å - */ - @Schema(description ="æµç¨‹å") - private String processInstanceName; - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @Schema(description ="æµç¨‹å®žä¾‹çš„ç¼–å·") - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„æµç¨‹å®šä¹‰ç¼–å· - */ - @Schema(description ="æµç¨‹å®žä¾‹çš„æµç¨‹å®šä¹‰ç¼–å·") - private String processDefinitionId; - /** - * æµç¨‹åˆ†ç±» - */ - @Schema(description ="æµç¨‹åˆ†ç±»") - private String category; - /** - * æµç¨‹æ´»åŠ¨çš„ç¼–å· - */ - @Schema(description ="æµç¨‹æ´»åŠ¨çš„ç¼–å·") - private String activityId; - /** - * æµç¨‹æ´»åŠ¨çš„åå­— - */ - @Schema(description ="æµç¨‹æ´»åŠ¨çš„åå­—") - private String activityName; - /** - * æµç¨‹æ´»åŠ¨çš„ç¼–å· - */ - @Schema(description ="æµç¨‹æ´»åŠ¨çš„ç¼–å·") - private String taskId; - - /** - * 用户编å·ï¼ˆè¢«æŠ„é€çš„用户编å·ï¼‰ - */ - @Schema(description ="用户编å·ï¼ˆè¢«æŠ„é€çš„用户编å·ï¼‰") - private Long userId; - - /** - * 用户姓å(被抄é€çš„用户姓å) - */ - @Schema(description ="用户姓å(被抄é€çš„用户姓å)") - private String userName; - - /** - * æŠ„é€æ„è§ - */ - @Schema(description ="æŠ„é€æ„è§") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java deleted file mode 100644 index bb46b1f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹çš„创建 Request VO") -@Data -public class BpmProcessInstanceCreateReqVO { - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "æµç¨‹å®šä¹‰ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processDefinitionId; - - @Schema(description = "å˜é‡å®žä¾‹ï¼ˆåЍæ€è¡¨å•)") - private Map variables; - - @Schema(description = "å‘起人自选审批人 Map", example = "{taskKey1: [1, 2]}") - private Map> startUserSelectAssignees; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java deleted file mode 100644 index 130d75b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.validation.InEnum; -import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹åˆ†é¡µ Request VO") -@Data -public class BpmProcessInstancePageReqVO extends PageParam { - - @Schema(description = "æµç¨‹åç§°", example = "ZT") - private String name; - - @Schema(description = "æµç¨‹å®šä¹‰çš„æ ‡è¯†", example = "2048") - private String processDefinitionKey; // ç²¾å‡†åŒ¹é… - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", example = "1") - @InEnum(BpmProcessInstanceStatusEnum.class) - private Integer status; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "ç»“æŸæ—¶é—´") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] endTime; - - @Schema(description = "å‘起用户编å·", example = "1024") - private Long startUserId; // 注æ„ï¼Œåªæœ‰åœ¨ã€æµç¨‹å®žä¾‹ã€‘èœå•,æ‰ä½¿ç”¨è¯¥å‚æ•° - - @Schema(description = "动æ€è¡¨å•字段查询 JSON Str", example = "{}") - private String formFieldsParams; // SpringMVC 在 get 请求下,无法方便的定义 Map ç±»åž‹çš„å‚æ•°ï¼Œæ‰€ä»¥é€šè¿‡ String 接收åŽï¼Œé€»è¾‘里é¢è½¬æ¢ - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java deleted file mode 100644 index 14cc77a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.instance; - -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -@Schema(description = "管ç†åŽå° - æµç¨‹å®žä¾‹çš„ Response VO") -@Data -public class BpmProcessInstanceRespVO { - - @Schema(description = "æµç¨‹å®žä¾‹çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "æµç¨‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "æµç¨‹æ‘˜è¦") - private List> summary; // åªæœ‰æµç¨‹è¡¨å•ï¼Œæ‰æœ‰æ‘˜è¦ï¼ - - @Schema(description = "æµç¨‹åˆ†ç±»", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String category; - @Schema(description = "æµç¨‹åˆ†ç±»åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "请å‡") - private String categoryName; - - @Schema(description = "æµç¨‹å®žä¾‹çš„状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; // å‚è§ BpmProcessInstanceStatusEnum 枚举 - - @Schema(description = "å‘èµ·æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "ç»“æŸæ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "æŒç»­æ—¶é—´", example = "1000") - private Long durationInMillis; - - @Schema(description = "æäº¤çš„表å•值", requiredMode = Schema.RequiredMode.REQUIRED) - private Map formVariables; - - @Schema(description = "业务的唯一标识-例如说,请å‡ç”³è¯·çš„ç¼–å·", example = "1") - private String businessKey; - - /** - * å‘èµ·æµç¨‹çš„用户 - */ - private UserSimpleBaseVO startUser; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private String processDefinitionId; - /** - * æµç¨‹å®šä¹‰ - */ - private BpmProcessDefinitionRespVO processDefinition; - - /** - * 当å‰å®¡æ‰¹ä¸­çš„任务 - */ - private List tasks; // 仅在æµç¨‹å®žä¾‹åˆ†é¡µæ‰è¿”回 - - @Schema(description = "æµç¨‹ä»»åŠ¡") - @Data - public static class Task { - - @Schema(description = "æµç¨‹ä»»åŠ¡çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "任务åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "任务分é…人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 assigneeUser - private Long assignee; - - @Schema(description = "任务分é…人", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - private UserSimpleBaseVO assigneeUser; - - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java deleted file mode 100644 index 7d56754..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Schema(description = "管ç†åŽå° - 通过æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskApproveReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "审批æ„è§", example = "ä¸é”™ä¸é”™ï¼") - private String reason; - - @Schema(description = "ç­¾å", example = "https://www.iocoder.cn/sign.png") - private String signPicUrl; - - @Schema(description = "å˜é‡å®žä¾‹ï¼ˆåЍæ€è¡¨å•)", requiredMode = Schema.RequiredMode.REQUIRED) - private Map variables; - - @Schema(description = "下一个节点审批人", example = "{nodeId:[1, 2]}") - private Map> nextAssignees; // 为什么是 Mapï¼Œè€Œä¸æ˜¯ List 呢?因为下一个节点å¯èƒ½æ˜¯å¤šä¸ªï¼Œä¾‹å¦‚说并行网关的情况 - - // 新增任务å˜é‡å®žä¾‹ï¼Œä¸šåŠ¡è¡¨å• - @Schema(description = "任务å˜é‡å®žä¾‹ï¼Œä¸šåŠ¡è¡¨å•", example = "{'formField1': 'value1', 'formField2': 'value2'}") - private Map taskVariables; -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskCopyReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskCopyReqVO.java deleted file mode 100644 index 1775be0..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskCopyReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.Collection; - -@Schema(description = "管ç†åŽå° - æŠ„é€æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskCopyReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "抄é€çš„ç”¨æˆ·ç¼–å·æ•°ç»„", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") - @NotEmpty(message = "抄é€ç”¨æˆ·ä¸èƒ½ä¸ºç©º") - private Collection copyUserIds; - - @Schema(description = "æŠ„é€æ„è§", example = "帮忙看看ï¼") - private String reason; -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskDelegateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskDelegateReqVO.java deleted file mode 100644 index 21aa42a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskDelegateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - 委派æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskDelegateReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "被委派人 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "被委派人 ID ä¸èƒ½ä¸ºç©º") - private Long delegateUserId; - - @Schema(description = "委派原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "åšä¸äº†å†³å®šï¼Œéœ€è¦ä½ å…ˆå¸®å¿™çž…çž…") - @NotEmpty(message = "委派原因ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java deleted file mode 100644 index 5c1ee94..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import com.zt.plat.framework.common.pojo.PageParam; -import com.zt.plat.framework.common.util.date.DateUtils; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@Schema(description = "管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„çš„åˆ†é¡µ Request VO") // 待办ã€å·²åŠžï¼Œéƒ½ä½¿ç”¨è¯¥åˆ†é¡µ -@Data -public class BpmTaskPageReqVO extends PageParam { - - @Schema(description = "æµç¨‹ä»»åŠ¡å", example = "ZT") - private String name; - - @Schema(description = "æµç¨‹åˆ†ç±»", example = "1") - private String category; - - @Schema(description = "æµç¨‹å®šä¹‰çš„æ ‡è¯†", example = "2048") - private String processDefinitionKey; // ç²¾å‡†åŒ¹é… - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java deleted file mode 100644 index 8482f48..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - ä¸é€šè¿‡æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskRejectReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "审批æ„è§", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¸é”™ä¸é”™ï¼") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java deleted file mode 100644 index fb86f57..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -@Schema(description = "管ç†åŽå° - æµç¨‹ä»»åŠ¡ Response VO") -@Data -public class BpmTaskRespVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "任务åå­—", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "ç»“æŸæ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "æŒç»­æ—¶é—´", example = "1000") - private Long durationInMillis; - - @Schema(description = "任务状æ€", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Integer status; // å‚è§ BpmTaskStatusEnum 枚举 - - @Schema(description = "审批ç†ç”±", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private String reason; - - @Schema(description = "任务负责人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 ownerUser - private Long owner; - /** - * è´Ÿè´£äººçš„ç”¨æˆ·ä¿¡æ¯ - */ - private UserSimpleBaseVO ownerUser; - - @Schema(description = "任务分é…人编å·", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2048") - @JsonIgnore // ä¸è¿”å›žï¼Œåªæ˜¯æ–¹ä¾¿åŽç»­è¯»å–,赋值给 assigneeUser - private Long assignee; - /** - * å®¡æ ¸çš„ç”¨æˆ·ä¿¡æ¯ - */ - private UserSimpleBaseVO assigneeUser; - - @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one") - private String taskDefinitionKey; - - @Schema(description = "所属æµç¨‹å®žä¾‹ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "8888") - private String processInstanceId; - /** - * 所属æµç¨‹å®žä¾‹ - */ - private ProcessInstance processInstance; - - @Schema(description = "父任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String parentTaskId; - @Schema(description = "å­ä»»åŠ¡åˆ—è¡¨ï¼ˆç”±åŠ ç­¾ç”Ÿæˆï¼‰", requiredMode = Schema.RequiredMode.REQUIRED, example = "childrenTask") - private List children; // 由加签生æˆï¼ŒåŒ…å«å¤šå±‚å­ä»»åŠ¡ - - @Schema(description = "表å•ç¼–å·", example = "1024") - private Long formId; - @Schema(description = "表å•路由", example = "1024") - private String formPath; - @Schema(description = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - @Schema(description = "表å•çš„é…置,JSON 字符串") - private String formConf; - @Schema(description = "表å•项的数组") - private List formFields; - @Schema(description = "æäº¤çš„表å•值", requiredMode = Schema.RequiredMode.REQUIRED) - private Map formVariables; - @Schema(description = "æ“作按钮设置值") - private Map buttonsSetting; - - @Schema(description = "是å¦éœ€è¦ç­¾å", example = "false") - private Boolean signEnable; - - @Schema(description = "是å¦å¡«å†™å®¡æ‰¹æ„è§", example = "false") - private Boolean reasonRequire; - - @Schema(description = "节点类型", example = "10") - private Integer nodeType; // å‚è§ BpmSimpleModelNodeTypeEnum 枚举。 - - @Data - @Schema(description = "æµç¨‹å®žä¾‹") - public static class ProcessInstance { - - @Schema(description = "æµç¨‹å®žä¾‹ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String id; - - @Schema(description = "æµç¨‹å®žä¾‹åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ZT") - private String name; - - @Schema(description = "æäº¤æ—¶é—´", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "æµç¨‹å®šä¹‰çš„ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private String processDefinitionId; - - @Schema(description = "æµç¨‹æ‘˜è¦", example = "[]") - private List> summary; // åªæœ‰æµç¨‹è¡¨å•ï¼Œæ‰æœ‰æ‘˜è¦ï¼ - - /** - * å‘èµ·äººçš„ç”¨æˆ·ä¿¡æ¯ - */ - private UserSimpleBaseVO startUser; - - } - - @Data - @Schema(description = "æ“作按钮设置") - public static class OperationButtonSetting { - - @Schema(description = "显示åç§°", example = "审批") - private String displayName; - - @Schema(description = "是å¦å¯ç”¨", example = "true") - private Boolean enable; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java deleted file mode 100644 index 22982ab..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - 退回æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskReturnReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "退回到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotEmpty(message = "退回到的任务 Key ä¸èƒ½ä¸ºç©º") - private String targetTaskDefinitionKey; - - @Schema(description = "退回æ„è§", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回") - @NotEmpty(message = "退回æ„è§ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignCreateReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignCreateReqVO.java deleted file mode 100644 index 0acf4bd..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignCreateReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -import java.util.Set; - -@Schema(description = "管ç†åŽå° - 加签任务的创建(加签) Request VO") -@Data -public class BpmTaskSignCreateReqVO { - - @Schema(description = "需è¦åŠ ç­¾çš„ä»»åŠ¡ç¼–å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "加签的用户编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") - @NotEmpty(message = "加签用户ä¸èƒ½ä¸ºç©º") - private Set userIds; - - @Schema(description = "加签类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "before") - @NotEmpty(message = "加签类型ä¸èƒ½ä¸ºç©º") - private String type; // å‚è§ BpmTaskSignTypeEnum 枚举 - - @Schema(description = "加签原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "需è¦åŠ ç­¾") - @NotEmpty(message = "加签原因ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignDeleteReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignDeleteReqVO.java deleted file mode 100644 index a848485..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskSignDeleteReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - 加签任务的删除(å‡ç­¾ï¼‰ Request VO") -@Data -public class BpmTaskSignDeleteReqVO { - - @Schema(description = "被å‡ç­¾çš„任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "加签原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "需è¦å‡ç­¾") - @NotEmpty(message = "加签原因ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskTransferReqVO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskTransferReqVO.java deleted file mode 100644 index e55bb73..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/vo/task/BpmTaskTransferReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zt.plat.module.bpm.controller.admin.task.vo.task; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„è½¬åŠž Request VO") -@Data -public class BpmTaskTransferReqVO { - - @Schema(description = "任务编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @Schema(description = "新审批人的用户编å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "新审批人的用户编å·ä¸èƒ½ä¸ºç©º") - private Long assigneeUserId; - - @Schema(description = "转办原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "åšä¸äº†å†³å®šï¼Œéœ€è¦ä½ å…ˆå¸®å¿™çž…çž…") - @NotEmpty(message = "转办原因ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/app/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/app/package-info.java deleted file mode 100644 index 0513848..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/app/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package com.zt.plat.module.bpm.controller.app; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/package-info.java deleted file mode 100644 index 52ffdf8..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› RESTful API ç»™å‰ç«¯ï¼š - * 1. admin 包:æä¾›ç»™ç®¡ç†åŽå° zt-ui-admin å‰ç«¯é¡¹ç›® - * 2. app 包:æä¾›ç»™ç”¨æˆ· APP zt-ui-app å‰ç«¯é¡¹ç›®ï¼Œå®ƒçš„ Controller å’Œ VO éƒ½è¦æ·»åŠ  App å‰ç¼€ï¼Œç”¨äºŽå’Œç®¡ç†åŽå°è¿›è¡ŒåŒºåˆ† - */ -package com.zt.plat.module.bpm.controller; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmModelConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmModelConvert.java deleted file mode 100644 index 262a598..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmModelConvert.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.zt.plat.module.bpm.convert.definition; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.util.date.DateUtils; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.base.dept.DeptSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelSaveReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -/** - * æµç¨‹æ¨¡åž‹ Convert - * - * @author yunlongn - */ -@Mapper -public interface BpmModelConvert { - - BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); - - default List buildModelList(List list, - Map formMap, - Map categoryMap, - Map deploymentMap, - Map processDefinitionMap, - Map userMap, - Map deptMap) { - List result = convertList(list, model -> { - BpmModelMetaInfoVO metaInfo = parseMetaInfo(model); - BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; - BpmCategoryDO category = categoryMap.get(model.getCategory()); - Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; - ProcessDefinition processDefinition = model.getDeploymentId() != null ? - processDefinitionMap.get(model.getDeploymentId()) : null; - List startUsers = metaInfo != null ? convertList(metaInfo.getStartUserIds(), userMap::get) : null; - List startDepts = metaInfo != null ? convertList(metaInfo.getStartDeptIds(), deptMap::get) : null; - return buildModel0(model, metaInfo, form, category, deployment, processDefinition, startUsers, startDepts); - }); - // æŽ’åº - result.sort(Comparator.comparing(BpmModelMetaInfoVO::getSort)); - return result; - } - - default BpmModelRespVO buildModel(Model model, byte[] bpmnBytes, BpmSimpleModelNodeVO simpleModel) { - BpmModelMetaInfoVO metaInfo = parseMetaInfo(model); - BpmModelRespVO modelVO = buildModel0(model, metaInfo, null, null, null, null, null, null); - if (ArrayUtil.isNotEmpty(bpmnBytes)) { - modelVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnBytes)); - } - modelVO.setSimpleModel(simpleModel); - return modelVO; - } - - default BpmModelRespVO buildModel0(Model model, - BpmModelMetaInfoVO metaInfo, BpmFormDO form, BpmCategoryDO category, - Deployment deployment, ProcessDefinition processDefinition, - List startUsers, List startDepts) { - BpmModelRespVO modelRespVO = new BpmModelRespVO().setId(model.getId()).setName(model.getName()) - .setKey(model.getKey()).setCategory(model.getCategory()) - .setCreateTime(DateUtils.of(model.getCreateTime())); - // Form - BeanUtils.copyProperties(metaInfo, modelRespVO); - if (form != null) { - modelRespVO.setFormName(form.getName()); - } - // Category - if (category != null) { - modelRespVO.setCategoryName(category.getName()); - } - // ProcessDefinition - if (processDefinition != null) { - modelRespVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class)); - modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ? - SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - if (deployment != null) { - modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime())); - } - } - // Userã€Dept - modelRespVO.setStartUsers(BeanUtils.toBean(startUsers, UserSimpleBaseVO.class)) - .setStartDepts(BeanUtils.toBean(startDepts, DeptSimpleBaseVO.class)); - return modelRespVO; - } - - default void copyToModel(Model model, BpmModelSaveReqVO reqVO) { - model.setName(reqVO.getName()); - model.setKey(reqVO.getKey()); - model.setCategory(reqVO.getCategory()); - model.setMetaInfo(JsonUtils.toJsonString(BeanUtils.toBean(reqVO, BpmModelMetaInfoVO.class))); - } - - default BpmModelMetaInfoVO parseMetaInfo(Model model) { - BpmModelMetaInfoVO vo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoVO.class); - if (vo == null) { - return null; - } - if (vo.getManagerUserIds() == null) { - vo.setManagerUserIds(Collections.emptyList()); - } - if (vo.getStartUserIds() == null) { - vo.setStartUserIds(Collections.emptyList()); - } - // 如果为空,兜底处ç†ï¼Œä½¿ç”¨ createTime 创建时间 - if (vo.getSort() == null) { - vo.setSort(model.getCreateTime().getTime()); - } - return vo; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmProcessDefinitionConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmProcessDefinitionConvert.java deleted file mode 100644 index 86b256c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.zt.plat.module.bpm.convert.definition; - -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.map.MapUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.ProcessDefinition; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.factory.Mappers; - -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -/** - * Bpm æµç¨‹å®šä¹‰çš„ Convert - * - * @author yunlong.li - */ -@Mapper -public interface BpmProcessDefinitionConvert { - - BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); - - default PageResult buildProcessDefinitionPage(PageResult page, - Map deploymentMap, - Map processDefinitionInfoMap, - Map formMap, - Map categoryMap) { - List list = buildProcessDefinitionList(page.getList(), deploymentMap, processDefinitionInfoMap, formMap, categoryMap); - return new PageResult<>(list, page.getTotal()); - } - - default List buildProcessDefinitionList(List list, - Map deploymentMap, - Map processDefinitionInfoMap, - Map formMap, - Map categoryMap) { - List result = CollectionUtils.convertList(list, definition -> { - Deployment deployment = MapUtil.get(deploymentMap, definition.getDeploymentId(), Deployment.class); - BpmProcessDefinitionInfoDO processDefinitionInfo = MapUtil.get(processDefinitionInfoMap, definition.getId(), BpmProcessDefinitionInfoDO.class); - BpmFormDO form = null; - if (processDefinitionInfo != null) { - form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class); - } - BpmCategoryDO category = MapUtil.get(categoryMap, definition.getCategory(), BpmCategoryDO.class); - return buildProcessDefinition(definition, deployment, processDefinitionInfo, form, category, null); - }); - // æŽ’åº - result.sort(Comparator.comparing(BpmProcessDefinitionRespVO::getSort)); - return result; - } - - default BpmProcessDefinitionRespVO buildProcessDefinition(ProcessDefinition definition, - Deployment deployment, - BpmProcessDefinitionInfoDO processDefinitionInfo, - BpmFormDO form, - BpmCategoryDO category, - BpmnModel bpmnModel) { - BpmProcessDefinitionRespVO respVO = BeanUtils.toBean(definition, BpmProcessDefinitionRespVO.class); - respVO.setSuspensionState(definition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - // Deployment - if (deployment != null) { - respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime())); - } - // BpmProcessDefinitionInfoDO - if (processDefinitionInfo != null) { - copyTo(processDefinitionInfo, respVO); - // Form - if (form != null) { - respVO.setFormName(form.getName()); - } - } - // Category - if (category != null) { - respVO.setCategoryName(category.getName()); - } - // BpmnModel - if (bpmnModel != null) { - respVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnModel)); - } - return respVO; - } - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/message/BpmMessageConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/message/BpmMessageConvert.java deleted file mode 100644 index 41de133..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/message/BpmMessageConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.zt.plat.module.bpm.convert.message; - -import com.zt.plat.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -import java.util.Map; - -@Mapper -public interface BpmMessageConvert { - - BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); - - @Mapping(target = "mobile", ignore = true) - @Mapping(source = "userId", target = "userId") - @Mapping(source = "templateCode", target = "templateCode") - @Mapping(source = "templateParams", target = "templateParams") - SmsSendSingleToUserReqDTO convert(Long userId, String templateCode, Map templateParams); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/package-info.java deleted file mode 100644 index b72f713..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› POJO ç±»çš„å®žä½“è½¬æ¢ - * - * ç›®å‰ä½¿ç”¨ MapStruct 框架 - */ -package com.zt.plat.module.bpm.convert; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceConvert.java deleted file mode 100644 index 87652f8..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ /dev/null @@ -1,305 +0,0 @@ -package com.zt.plat.module.bpm.convert.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.MapUtils; -import com.zt.plat.framework.common.util.collection.SetUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.event.BpmProcessInstanceStatusEvent; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import com.zt.plat.module.bpm.convert.definition.BpmProcessDefinitionConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.factory.Mappers; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * æµç¨‹å®žä¾‹ Convert - * - * @author ZT - */ -@Mapper -public interface BpmProcessInstanceConvert { - - BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); - - default PageResult buildProcessInstancePage(PageResult pageResult, - Map processDefinitionMap, - Map categoryMap, - Map> taskMap, - Map userMap, - Map deptMap, - Map processDefinitionInfoMap) { - PageResult vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class); - for (int i = 0; i < pageResult.getList().size(); i++) { - BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i); - respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i))); - MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(), - processDefinition -> respVO.setCategory(processDefinition.getCategory()) - .setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class))); - MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName())); - respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstanceRespVO.Task.class)); - // user - if (userMap != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId())); - if (startUser != null) { - respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); - MapUtils.findAndThen(deptMap, DeptUtil.getDeptId(startUser), dept -> respVO.getStartUser().setDeptName(dept.getName())); - } - if (CollUtil.isNotEmpty(respVO.getTasks())) { - respVO.getTasks().forEach(task -> { - AdminUserRespDTO assigneeUser = userMap.get(task.getAssignee()); - if (assigneeUser!= null) { - task.setAssigneeUser(BeanUtils.toBean(assigneeUser, UserSimpleBaseVO.class)); - MapUtils.findAndThen(deptMap, DeptUtil.getDeptId(assigneeUser), dept -> task.getAssigneeUser().setDeptName(dept.getName())); - } - }); - } - } - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionInfoMap.get(respVO.getProcessDefinitionId()); - if (processDefinitionInfo != null) { - // æ‘˜è¦ - respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfo, - pageResult.getList().get(i).getProcessVariables())); - // 是å¦å¯è§ - respVO.getProcessDefinition().setVisible(processDefinitionInfo.getVisible()); - // 是å¦å¯ä»¥é‡æ–°å‘èµ·æµç¨‹ - respVO.getProcessDefinition().setRestart(processDefinitionInfo.getRestart()); - } - // è¡¨å• - respVO.setFormVariables(pageResult.getList().get(i).getProcessVariables()); - } - return vpPageResult; - } - - default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, - ProcessDefinition processDefinition, - BpmProcessDefinitionInfoDO processDefinitionInfo, - AdminUserRespDTO startUser, - DeptRespDTO dept) { - BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class); - respVO.setStatus(FlowableUtils.getProcessInstanceStatus(processInstance)) - .setFormVariables(FlowableUtils.getProcessInstanceFormVariable(processInstance)); - // definition - respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class)); - copyTo(processDefinitionInfo, respVO.getProcessDefinition()); - // user - if (startUser != null) { - respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); - if (dept != null) { - respVO.getStartUser().setDeptName(dept.getName()); - } - } - return respVO; - } - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to); - - default BpmProcessInstanceStatusEvent buildProcessInstanceStatusEvent(Object source, ProcessInstance instance, Integer status) { - return new BpmProcessInstanceStatusEvent(source).setId(instance.getId()).setStatus(status) - .setProcessDefinitionKey(instance.getProcessDefinitionKey()).setBusinessKey(instance.getBusinessKey()); - } - - default BpmMessageSendWhenProcessInstanceApproveReqDTO buildProcessInstanceApproveMessage(ProcessInstance instance) { - return new BpmMessageSendWhenProcessInstanceApproveReqDTO() - .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())) - .setProcessInstanceId(instance.getId()) - .setProcessInstanceName(instance.getName()); - } - - default BpmMessageSendWhenProcessInstanceRejectReqDTO buildProcessInstanceRejectMessage(ProcessInstance instance, String reason) { - return new BpmMessageSendWhenProcessInstanceRejectReqDTO() - .setProcessInstanceName(instance.getName()) - .setProcessInstanceId(instance.getId()) - .setReason(reason) - .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())); - } - - default BpmProcessInstanceBpmnModelViewRespVO buildProcessInstanceBpmnModelView(HistoricProcessInstance processInstance, - List taskInstances, - BpmnModel bpmnModel, - BpmSimpleModelNodeVO simpleModel, - Set unfinishedTaskActivityIds, - Set finishedTaskActivityIds, - Set finishedSequenceFlowActivityIds, - Set rejectTaskActivityIds, - Map userMap, - Map deptMap) { - BpmProcessInstanceBpmnModelViewRespVO respVO = new BpmProcessInstanceBpmnModelViewRespVO(); - // åŸºæœ¬ä¿¡æ¯ - respVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class, o -> o - .setStatus(FlowableUtils.getProcessInstanceStatus(processInstance))) - .setStartUser(buildUser(processInstance.getStartUserId(), userMap, deptMap))); - respVO.setTasks(convertList(taskInstances, task -> BeanUtils.toBean(task, BpmTaskRespVO.class) - .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)) - .setAssigneeUser(buildUser(task.getAssignee(), userMap, deptMap)) - .setOwnerUser(buildUser(task.getOwner(), userMap, deptMap)))); - respVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnModel)); - respVO.setSimpleModel(simpleModel); - // è¿›åº¦ä¿¡æ¯ - respVO.setUnfinishedTaskActivityIds(unfinishedTaskActivityIds) - .setFinishedTaskActivityIds(finishedTaskActivityIds) - .setFinishedSequenceFlowActivityIds(finishedSequenceFlowActivityIds) - .setRejectedTaskActivityIds(rejectTaskActivityIds); - return respVO; - } - - default UserSimpleBaseVO buildUser(String userIdStr, - Map userMap, - Map deptMap) { - if (StrUtil.isEmpty(userIdStr)) { - return null; - } - Long userId = NumberUtils.parseLong(userIdStr); - return buildUser(userId, userMap, deptMap); - } - - default UserSimpleBaseVO buildUser(Long userId, - Map userMap, - Map deptMap) { - if (userId == null) { - return null; - } - AdminUserRespDTO user = userMap.get(userId); - if (user == null) { - return null; - } - UserSimpleBaseVO userVO = BeanUtils.toBean(user, UserSimpleBaseVO.class); - Long deptId = DeptUtil.getDeptId(user); - DeptRespDTO dept = deptId != null ? deptMap.get(deptId) : null; - if (dept != null) { - userVO.setDeptName(dept.getName()); - } - return userVO; - } - - default BpmApprovalDetailRespVO.ActivityNodeTask buildApprovalTaskInfo(HistoricTaskInstance task) { - if (task == null) { - return null; - } - return BeanUtils.toBean(task, BpmApprovalDetailRespVO.ActivityNodeTask.class) - .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)) - .setSignPicUrl(FlowableUtils.getTaskSignPicUrl(task)); - } - - default Set parseUserIds(HistoricProcessInstance processInstance, - List activityNodes, - BpmTaskRespVO todoTask) { - Set userIds = new HashSet<>(); - if (processInstance != null) { - userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); - } - for (BpmApprovalDetailRespVO.ActivityNode activityNode : activityNodes) { - CollUtil.addAll(userIds, convertSet(activityNode.getTasks(), BpmApprovalDetailRespVO.ActivityNodeTask::getAssignee)); - CollUtil.addAll(userIds, convertSet(activityNode.getTasks(), BpmApprovalDetailRespVO.ActivityNodeTask::getOwner)); - CollUtil.addAll(userIds, activityNode.getCandidateUserIds()); - } - if (todoTask != null) { - CollUtil.addIfAbsent(userIds, todoTask.getAssignee()); - CollUtil.addIfAbsent(userIds, todoTask.getOwner()); - if (CollUtil.isNotEmpty(todoTask.getChildren())) { - CollUtil.addAll(userIds, convertSet(todoTask.getChildren(), BpmTaskRespVO::getAssignee)); - CollUtil.addAll(userIds, convertSet(todoTask.getChildren(), BpmTaskRespVO::getOwner)); - } - } - return userIds; - } - - default Set parseUserIds02(HistoricProcessInstance processInstance, - List tasks) { - Set userIds = SetUtils.asSet(Long.valueOf(processInstance.getStartUserId())); - tasks.forEach(task -> { - CollUtil.addIfAbsent(userIds, NumberUtils.parseLong((task.getAssignee()))); - CollUtil.addIfAbsent(userIds, NumberUtils.parseLong((task.getOwner()))); - }); - return userIds; - } - - default BpmApprovalDetailRespVO buildApprovalDetail(BpmnModel bpmnModel, - ProcessDefinition processDefinition, - BpmProcessDefinitionInfoDO processDefinitionInfo, - HistoricProcessInstance processInstance, - Integer processInstanceStatus, - List activityNodes, - BpmTaskRespVO todoTask, - Map formFieldsPermission, - Map userMap, - Map deptMap) { - // 1.1 æµç¨‹å®žä¾‹ - BpmProcessInstanceRespVO processInstanceResp = null; - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - Long deptId = DeptUtil.getDeptId(startUser); - DeptRespDTO dept = deptMap.get(deptId); - processInstanceResp = buildProcessInstance(processInstance, null, null, startUser, dept); - } - - // 1.2 æµç¨‹å®šä¹‰ - BpmProcessDefinitionRespVO definitionResp = BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( - processDefinition, null, processDefinitionInfo, null, null, bpmnModel); - - // 1.3 æµç¨‹èŠ‚ç‚¹ - activityNodes.forEach(approveNode -> { - if (approveNode.getTasks() != null) { - approveNode.getTasks().forEach(task -> { - task.setAssigneeUser(buildUser(task.getAssignee(), userMap, deptMap)); - task.setOwnerUser(buildUser(task.getOwner(), userMap, deptMap)); - }); - } - approveNode.setCandidateUsers(convertList(approveNode.getCandidateUserIds(), userId -> buildUser(userId, userMap, deptMap))); - }); - - // 1.4 待办任务 - if (todoTask != null) { - todoTask.setAssigneeUser(buildUser(todoTask.getAssignee(), userMap, deptMap)); - todoTask.setOwnerUser(buildUser(todoTask.getOwner(), userMap, deptMap)); - if (CollUtil.isNotEmpty(todoTask.getChildren())) { - todoTask.getChildren().forEach(childTask -> { - childTask.setAssigneeUser(buildUser(childTask.getAssignee(), userMap, deptMap)); - childTask.setOwnerUser(buildUser(childTask.getOwner(), userMap, deptMap)); - }); - } - } - - // 2. æ‹¼æŽ¥èµ·æ¥ - return new BpmApprovalDetailRespVO().setStatus(processInstanceStatus) - .setProcessDefinition(definitionResp) - .setProcessInstance(processInstanceResp) - .setFormFieldsPermission(formFieldsPermission) - .setTodoTask(todoTask) - .setActivityNodes(activityNodes); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceDTOConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceDTOConvert.java deleted file mode 100644 index 8d0a6ff..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmProcessInstanceDTOConvert.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.zt.plat.module.bpm.convert.task; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.task.dto.*; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.*; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * æµç¨‹å®žä¾‹ DTO 转æ¢å™¨ - * - * @author ZT - */ -@Mapper -public interface BpmProcessInstanceDTOConvert { - - BpmProcessInstanceDTOConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceDTOConvert.class); - - // VO to DTO - BpmProcessInstancePageReqDTO convert(BpmProcessInstancePageReqVO bean); - BpmProcessInstanceCancelReqDTO convert(BpmProcessInstanceCancelReqVO bean); - BpmApprovalDetailReqDTO convert(BpmApprovalDetailReqVO bean); - - // DTO to VO - BpmProcessInstancePageReqVO convertVO(BpmProcessInstancePageReqDTO bean); - BpmProcessInstanceCancelReqVO convertVO(BpmProcessInstanceCancelReqDTO bean); - BpmApprovalDetailReqVO convertVO(BpmApprovalDetailReqDTO bean); - - PageResult convertPage(PageResult pageResult); - BpmProcessInstanceRespDTO convert(BpmProcessInstanceRespVO bean); - BpmApprovalDetailRespDTO convert(BpmApprovalDetailRespVO bean); - BpmProcessInstanceBpmnModelViewRespDTO convert(BpmProcessInstanceBpmnModelViewRespVO bean); - - List convertActivityNodes(List nodes); - - // å†…éƒ¨ç±»è½¬æ¢ - BpmProcessInstanceRespDTO.Task convert(BpmProcessInstanceRespVO.Task task); - BpmApprovalDetailRespDTO.ActivityNode convert(BpmApprovalDetailRespVO.ActivityNode node); - BpmApprovalDetailRespDTO.ActivityNodeTask convert(BpmApprovalDetailRespVO.ActivityNodeTask task); - - // 用户信æ¯è½¬æ¢ - UserSimpleDTO convertUser(UserSimpleBaseVO user); - BpmProcessDefinitionRespDTO convert(BpmProcessDefinitionRespVO definition); - - @Mapping(target = "childNode", source = "childNode", qualifiedByName = "mapChildNode") - BpmSimpleModelNodeDTO convert(BpmSimpleModelNodeVO simpleModel); - - /** - * å°†BpmSimpleModelNodeVOçš„childNode转æ¢ä¸ºList - */ - @Named("mapChildNode") - default List mapChildNode(BpmSimpleModelNodeVO childNode) { - if (childNode == null) { - return null; - } - return List.of(convert(childNode)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java deleted file mode 100644 index ccba6d7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.zt.plat.module.bpm.convert.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.framework.common.util.date.DateUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; -import com.zt.plat.module.bpm.api.task.dto.UserSimpleDTO; -import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; -import static com.zt.plat.framework.common.util.collection.MapUtils.findAndThen; - -/** - * Bpm 任务 Convert - * - * @author ZT - */ -@Mapper -public interface BpmTaskConvert { - - BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); - - default PageResult buildTodoTaskPage(PageResult pageResult, - Map processInstanceMap, - Map userMap, - Map processDefinitionInfoMap) { - return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { - ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); - if (processInstance == null) { - return; - } - taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); - taskVO.getProcessInstance().setCreateTime(DateUtils.of(processInstance.getStartTime())); - // æ‘˜è¦ - taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), - processInstance.getProcessVariables())); - }); - } - - default PageResult buildTaskPage(PageResult pageResult, - Map processInstanceMap, - Map userMap, - Map deptMap, - Map processDefinitionInfoMap) { - List taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { - BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); - taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); - // ç”¨æˆ·ä¿¡æ¯ - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); - if (assignUser != null) { - taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); - findAndThen(deptMap, DeptUtil.getDeptId(assignUser), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName())); - } - // æµç¨‹å®žä¾‹ - HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); - taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); - // æ‘˜è¦ - taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), - processInstance.getProcessVariables())); - } - return taskVO; - }); - return new PageResult<>(taskVOList, pageResult.getTotal()); - } - - default List buildTaskListByProcessInstanceId(List taskList, - Map formMap, - Map userMap, - Map deptMap) { - return CollectionUtils.convertList(taskList, task -> { - // ç‰¹æ®Šï¼šå·²å–æ¶ˆçš„任务,ä¸è¿”回 - BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); - Integer taskStatus = FlowableUtils.getTaskStatus(task); - if (BpmTaskStatusEnum.isCancelStatus(taskStatus)) { - return null; - } - taskVO.setStatus(taskStatus).setReason(FlowableUtils.getTaskReason(task)); - // 表å•ä¿¡æ¯ - BpmFormDO form = null; - try { - Long formId = NumberUtils.parseLong(task.getFormKey()); - form = MapUtil.get(formMap, formId, BpmFormDO.class); - } catch (NumberFormatException e) { - // 如果 formKey 䏿˜¯æ•°å­—(比如是URL),设置 formPath - taskVO.setFormPath(task.getFormKey()); - taskVO.setFormVariables(FlowableUtils.getTaskFormVariable(task)); - } - if (form != null) { - taskVO.setFormId(form.getId()).setFormName(form.getName()).setFormConf(form.getConf()) - .setFormFields(form.getFields()).setFormVariables(FlowableUtils.getTaskFormVariable(task)); - } - // ç”¨æˆ·ä¿¡æ¯ - buildTaskAssignee(taskVO, task.getAssignee(), userMap, deptMap); - buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap); - return taskVO; - }); - } - - default List buildTaskListByParentTaskId(List taskList, - Map userMap, - Map deptMap) { - return convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> { - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); - if (assignUser != null) { - taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); - DeptRespDTO dept = deptMap.get(DeptUtil.getDeptId(assignUser)); - if (dept != null) { - taskVO.getAssigneeUser().setDeptName(dept.getName()); - } - } - AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner())); - if (ownerUser != null) { - taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class)); - findAndThen(deptMap, DeptUtil.getDeptId(ownerUser), dept -> taskVO.getOwnerUser().setDeptName(dept.getName())); - } - })); - } - - default BpmTaskRespVO buildTodoTask(Task todoTask, List childrenTasks, - Map buttonsSetting, - BpmFormDO form) { - BpmTaskRespVO bpmTaskRespVO = BeanUtils.toBean(todoTask, BpmTaskRespVO.class) - .setStatus(FlowableUtils.getTaskStatus(todoTask)).setReason(FlowableUtils.getTaskReason(todoTask)) - .setButtonsSetting(buttonsSetting) - .setChildren(convertList(childrenTasks, childTask -> BeanUtils.toBean(childTask, BpmTaskRespVO.class) - .setStatus(FlowableUtils.getTaskStatus(childTask)))); - if (form != null) { - bpmTaskRespVO.setFormId(form.getId()).setFormName(form.getName()) - .setFormConf(form.getConf()).setFormFields(form.getFields()); - }else{ - // ä»»åŠ¡çº§åˆ«çš„ä¸šåŠ¡è¡¨å• - bpmTaskRespVO.setFormPath(todoTask.getFormKey()); - } - return bpmTaskRespVO; - } - - default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, - Task task) { - BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); - reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId()) - .setProcessInstanceName(processInstance.getName()).setStartUserId(startUser.getId()) - .setStartUserNickname(startUser.getNickname()).setTaskId(task.getId()).setTaskName(task.getName()) - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())); - return reqDTO; - } - - default void buildTaskOwner(BpmTaskRespVO task, String taskOwner, - Map userMap, - Map deptMap) { - AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(taskOwner)); - if (ownerUser != null) { - task.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class)); - findAndThen(deptMap, DeptUtil.getDeptId(ownerUser), dept -> task.getOwnerUser().setDeptName(dept.getName())); - } - } - - default void buildTaskChildren(BpmTaskRespVO task, Map> childrenTaskMap, - Map userMap, Map deptMap) { - List childTasks = childrenTaskMap.get(task.getId()); - if (CollUtil.isNotEmpty(childTasks)) { - task.setChildren( - convertList(childTasks, childTask -> { - BpmTaskRespVO childTaskVO = BeanUtils.toBean(childTask, BpmTaskRespVO.class); - childTaskVO.setStatus(FlowableUtils.getTaskStatus(childTask)); - buildTaskOwner(childTaskVO, childTask.getOwner(), userMap, deptMap); - buildTaskAssignee(childTaskVO, childTask.getAssignee(), userMap, deptMap); - return childTaskVO; - }) - ); - } - } - - default void buildTaskAssignee(BpmTaskRespVO task, String taskAssignee, - Map userMap, - Map deptMap) { - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(taskAssignee)); - if (assignUser != null) { - task.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); - findAndThen(deptMap, DeptUtil.getDeptId(assignUser), dept -> task.getAssigneeUser().setDeptName(dept.getName())); - } - } - - /** - * 将父任务的属性,拷è´åˆ°å­ä»»åŠ¡ï¼ˆåŠ ç­¾ä»»åŠ¡ï¼‰ - *

- * 为什么ä¸ä½¿ç”¨ mapstruct 映射?因为 TaskEntityImpl 还有很多其他属性,这里我们åªè®¾ç½®æˆ‘们需è¦çš„。 - * 使用 mapstruct 会将里é¢åµŒå¥—çš„å„ä¸ªå±žæ€§å€¼éƒ½è®¾ç½®è¿›åŽ»ï¼Œä¼šå‡ºçŽ°æ„æƒ³ä¸åˆ°çš„问题。 - * - * @param parentTask 父任务 - * @param childTask 加签任务 - */ - default void copyTo(TaskEntityImpl parentTask, TaskEntityImpl childTask) { - childTask.setName(parentTask.getName()); - childTask.setDescription(parentTask.getDescription()); - childTask.setCategory(parentTask.getCategory()); - childTask.setParentTaskId(parentTask.getId()); - childTask.setProcessDefinitionId(parentTask.getProcessDefinitionId()); - childTask.setProcessInstanceId(parentTask.getProcessInstanceId()); - childTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); - childTask.setTaskDefinitionId(parentTask.getTaskDefinitionId()); - childTask.setPriority(parentTask.getPriority()); - childTask.setCreateTime(new Date()); - childTask.setTenantId(parentTask.getTenantId()); - } - - /** - * å°† BpmTaskRespVO 转æ¢ä¸º BpmTaskRespDTOï¼Œä¿æŒå®Œæ•´çš„嵌套结构 - */ - default List buildTaskRespDTOList(List voList) { - return CollectionUtils.convertList(voList, this::buildTaskRespDTO); - } - - /** - * å°† BpmTaskRespVO 转æ¢ä¸º BpmTaskRespDTOï¼Œä¿æŒå®Œæ•´çš„嵌套结构 - */ - default BpmTaskRespDTO buildTaskRespDTO(BpmTaskRespVO vo) { - if (vo == null) { - return null; - } - - BpmTaskRespDTO dto = BeanUtils.toBean(vo, BpmTaskRespDTO.class); - - // 转æ¢ç”¨æˆ·ä¿¡æ¯ - if (vo.getAssigneeUser() != null) { - dto.setAssigneeUser(convertToUserSimpleDTO(vo.getAssigneeUser())); - } - if (vo.getOwnerUser() != null) { - dto.setOwnerUser(convertToUserSimpleDTO(vo.getOwnerUser())); - } - - // è½¬æ¢æµç¨‹å®žä¾‹ä¿¡æ¯ - if (vo.getProcessInstance() != null) { - BpmTaskRespDTO.ProcessInstanceDTO processInstanceDTO = new BpmTaskRespDTO.ProcessInstanceDTO(); - processInstanceDTO.setId(vo.getProcessInstance().getId()); - processInstanceDTO.setName(vo.getProcessInstance().getName()); - processInstanceDTO.setCreateTime(vo.getProcessInstance().getCreateTime()); - processInstanceDTO.setProcessDefinitionId(vo.getProcessInstance().getProcessDefinitionId()); - processInstanceDTO.setSummary(vo.getProcessInstance().getSummary()); - - if (vo.getProcessInstance().getStartUser() != null) { - processInstanceDTO.setStartUser(convertToUserSimpleDTO(vo.getProcessInstance().getStartUser())); - } - dto.setProcessInstance(processInstanceDTO); - } - - // è½¬æ¢æ“作按钮设置 - if (vo.getButtonsSetting() != null) { - Map buttonsSettingDTO = vo.getButtonsSetting().entrySet() - .stream() - .collect(java.util.stream.Collectors.toMap( - Map.Entry::getKey, - entry -> { - BpmTaskRespDTO.OperationButtonSettingDTO settingDTO = new BpmTaskRespDTO.OperationButtonSettingDTO(); - settingDTO.setDisplayName(entry.getValue().getDisplayName()); - settingDTO.setEnable(entry.getValue().getEnable()); - return settingDTO; - } - )); - dto.setButtonsSetting(buttonsSettingDTO); - } - - // 递归转æ¢å­ä»»åŠ¡ - if (vo.getChildren() != null) { - dto.setChildren(buildTaskRespDTOList(vo.getChildren())); - } - - return dto; - } - - /** - * å°† UserSimpleBaseVO 转æ¢ä¸º UserSimpleDTOï¼Œç¡®ä¿æ‰€æœ‰å­—段都被正确赋值 - */ - default UserSimpleDTO convertToUserSimpleDTO(UserSimpleBaseVO vo) { - if (vo == null) { - return null; - } - - UserSimpleDTO dto = new UserSimpleDTO(); - dto.setId(vo.getId()); - dto.setNickname(vo.getNickname()); - dto.setAvatar(vo.getAvatar()); - dto.setDeptId(vo.getDeptId()); - dto.setDeptName(vo.getDeptName()); // ç¡®ä¿ deptName 被正确赋值 - return dto; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmCategoryDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmCategoryDO.java deleted file mode 100644 index 193ffb4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmCategoryDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * BPM æµç¨‹åˆ†ç±» DO - * - * @author ZT - */ -@TableName("bpm_category") -@KeySequence("bpm_category_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmCategoryDO extends BaseDO { - - /** - * åˆ†ç±»ç¼–å· - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 分类å - */ - private String name; - /** - * 分类标志 - */ - private String code; - /** - * 分类æè¿° - */ - private String description; - /** - * åˆ†ç±»çŠ¶æ€ - * - * 枚举 {@link com.zt.plat.framework.common.enums.CommonStatusEnum} - */ - private Integer status; - /** - * åˆ†ç±»æŽ’åº - */ - private Integer sort; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmFormDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmFormDO.java deleted file mode 100644 index 649d191..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmFormDO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.*; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * BPM 工作æµçš„表å•定义 - * 用于工作æµçš„申请表å•,需è¦åЍæ€é…置的场景 - * - * @author ZT - */ -@TableName(value = "bpm_form", autoResultMap = true) -@KeySequence("bpm_form_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmFormDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 表å•å - */ - private String name; - /** - * çŠ¶æ€ - */ - private Integer status; - /** - * 表å•çš„é…ç½® - */ - private String conf; - /** - * 表å•项的数组 - * - * ç›®å‰ç›´æŽ¥å°† https://github.com/JakHuang/form-generator 生æˆçš„ JSON 串,直接ä¿å­˜ - * 定义:https://github.com/JakHuang/form-generator/issues/46 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List fields; - /** - * 备注 - */ - private String remark; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java deleted file mode 100644 index 349f404..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.zt.plat.framework.mybatis.core.type.LongListTypeHandler; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.enums.definition.BpmAutoApproveTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmModelTypeEnum; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import com.baomidou.mybatisplus.annotation.*; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; - -import java.util.List; - -/** - * BPM æµç¨‹å®šä¹‰çš„æ‹“ä¿¡æ¯ - * 主è¦è§£å†³ Flowable {@link org.flowable.engine.repository.ProcessDefinition} 䏿”¯æŒæ‹“展字段,所以新建该表 - * - * @author ZT - */ -@TableName(value = "bpm_process_definition_info", autoResultMap = true) -@KeySequence("bpm_process_definition_info_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmProcessDefinitionInfoDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * æµç¨‹å®šä¹‰çš„ç¼–å· - * - * å…³è” {@link ProcessDefinition#getId()} 属性 - */ - private String processDefinitionId; - /** - * æµç¨‹æ¨¡åž‹çš„ç¼–å· - * - * å…³è” {@link Model#getId()} 属性 - */ - private String modelId; - /** - * æµç¨‹æ¨¡åž‹çš„类型 - * - * 枚举 {@link BpmModelTypeEnum} - */ - private Integer modelType; - - /** - * æµç¨‹åˆ†ç±»çš„ç¼–ç  - * - * å…³è” {@link BpmCategoryDO#getCode()} - * - * 为什么è¦å­˜å‚¨ï¼ŸåŽŸå› æ˜¯ï¼Œ{@link ProcessDefinition#getCategory()} 无法设置 - */ - private String category; - /** - * 图标 - */ - private String icon; - /** - * æè¿° - */ - private String description; - - /** - * 表å•类型 - * - * 枚举 {@link BpmModelFormTypeEnum} - */ - private Integer formType; - /** - * 动æ€è¡¨å•ç¼–å· - * - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - * - * å…³è” {@link BpmFormDO#getId()} - */ - private Long formId; - /** - * 表å•çš„é…ç½® - * - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - * - * 冗余 {@link BpmFormDO#getConf()} - */ - private String formConf; - /** - * 表å•项的数组 - * - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - * - * 冗余 {@link BpmFormDO#getFields()} - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List formFields; - /** - * 自定义表å•çš„æäº¤è·¯å¾„,使用 Vue çš„è·¯ç”±åœ°å€ - * - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomCreatePath; - /** - * 自定义表å•的查看路径,使用 Vue çš„è·¯ç”±åœ°å€ - * - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomViewPath; - - /** - * SIMPLE è®¾è®¡å™¨æ¨¡åž‹æ•°æ® json æ ¼å¼ - * - * 目的:当使用仿钉钉设计器时。æµç¨‹æ¨¡åž‹å‘布的时候,需è¦ä¿å­˜æµç¨‹æ¨¡åž‹è®¾è®¡å™¨çš„å¿«ç…§æ•°æ®ã€‚ - */ - private String simpleModel; - /** - * 是å¦å¯è§ - * - * 目的:如果 false ä¸å¯è§ï¼Œåˆ™ä¸å±•示在“å‘èµ·æµç¨‹â€çš„列表里 - */ - private Boolean visible; - - /** - * 是å¦å…è®¸é‡æ–°å‘èµ· - * - * 目的:如果 false 则ä¸å¯ä»¥é‡æ–°å‘èµ·æµç¨‹ - */ - private Boolean restart; - /** - * 排åºå€¼ - */ - private Long sort; - - /** - * å¯å‘èµ·ç”¨æˆ·ç¼–å·æ•°ç»„ - * - * å…³è” {@link AdminUserRespDTO#getId()} 字段的数组 - * - * 如果为空,则表示“全部å¯ä»¥å‘èµ·â€ï¼ - * - * 它和 {@link #visible} 的区别在于: - * 1. {@link #visible} åªæ˜¯å†³å®šæ˜¯å¦å¯è§ã€‚å³ä½¿ä¸å¯è§ï¼Œè¿˜æ˜¯å¯ä»¥å‘èµ· - * 2. startUserIds 决定æŸä¸ªç”¨æˆ·æ˜¯å¦å¯ä»¥å‘起。如果该用户ä¸å¯å‘起,则他也是ä¸å¯è§çš„ - */ - @TableField(typeHandler = LongListTypeHandler.class) // 为了å¯ä»¥ä½¿ç”¨ find_in_set 进行过滤 - private List startUserIds; - - /** - * å¯å‘èµ·éƒ¨é—¨ç¼–å·æ•°ç»„ - * - * å…³è” {@link AdminUserRespDTO#getDeptId()} 字段的数组 - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List startDeptIds; - - /** - * å¯ç®¡ç†ç”¨æˆ·ç¼–å·æ•°ç»„ - * - * å…³è” {@link AdminUserRespDTO#getId()} 字段的数组 - */ - @TableField(typeHandler = LongListTypeHandler.class) // 为了å¯ä»¥ä½¿ç”¨ find_in_set 进行过滤 - private List managerUserIds; - - /** - * 是å¦å…许撤销审批中的申请 - */ - private Boolean allowCancelRunningProcess; - - /** - * æµç¨‹ ID 规则 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.ProcessIdRule processIdRule; - - /** - * 自动去é‡ç±»åž‹ - * - * 枚举 {@link BpmAutoApproveTypeEnum} - */ - private Integer autoApprovalType; - - /** - * 标题设置 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.TitleSetting titleSetting; - /** - * 摘è¦è®¾ç½® - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.SummarySetting summarySetting; - - /** - * æµç¨‹å‰ç½®é€šçŸ¥è®¾ç½® - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.HttpRequestSetting processBeforeTriggerSetting; - /** - * æµç¨‹åŽç½®é€šçŸ¥è®¾ç½® - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.HttpRequestSetting processAfterTriggerSetting; - - /** - * 任务å‰ç½®é€šçŸ¥è®¾ç½® - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.HttpRequestSetting taskBeforeTriggerSetting; - - /** - * 任务åŽç½®é€šçŸ¥è®¾ç½® - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.HttpRequestSetting taskAfterTriggerSetting; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessExpressionDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessExpressionDO.java deleted file mode 100644 index 29afb73..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessExpressionDO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * BPM æµç¨‹è¡¨è¾¾å¼ DO - * - * @author ZT - */ -@TableName("bpm_process_expression") -@KeySequence("bpm_process_expression_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmProcessExpressionDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 表达å¼åå­— - */ - private String name; - /** - * 表达å¼çŠ¶æ€ - * - * 枚举 {@link TODO common_status 对应的类} - */ - private Integer status; - /** - * è¡¨è¾¾å¼ - */ - private String expression; - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java deleted file mode 100644 index ed36d7b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.zt.plat.module.bpm.enums.definition.BpmProcessListenerTypeEnum; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * BPM æµç¨‹ç›‘å¬å™¨ DO - * - * 目的:本质上它是æµç¨‹ç›‘å¬å™¨çš„æ¨¡ç‰ˆï¼Œç”¨äºŽ BPMN 在设计时,直接选择这些模版 - * - * @author ZT - */ -@TableName(value = "bpm_process_listener") -@KeySequence("bpm_process_listener_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmProcessListenerDO extends BaseDO { - - /** - * 主键 ID,自增 - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 监å¬å™¨åå­— - */ - private String name; - /** - * çŠ¶æ€ - * - * 枚举 {@link com.zt.plat.framework.common.enums.CommonStatusEnum} - */ - private Integer status; - /** - * 监å¬ç±»åž‹ - * - * 枚举 {@link BpmProcessListenerTypeEnum} - * - * 1. execution:ExecutionListener 执行监å¬å™¨ - * 2. task:TaskListener 任务监å¬å™¨ - */ - private String type; - /** - * 监å¬äº‹ä»¶ - * - * execution 时:startã€end - * task 时:create 创建ã€assignment 指派ã€complete 完æˆã€delete 删除ã€update æ›´æ–°ã€timeout è¶…æ—¶ - */ - private String event; - - /** - * 值类型 - * - * 1. class:Java 类,ExecutionListener éœ€è¦ {@link org.flowable.engine.delegate.JavaDelegate},TaskListener éœ€è¦ {@link org.flowable.engine.delegate.TaskListener} - * 2. delegateExpression:委托表达å¼ï¼Œåœ¨ class çš„åŸºç¡€ä¸Šï¼Œéœ€è¦æ³¨å†Œåˆ° Spring 容器里,åŽç»­è¡¨è¾¾å¼é€šè¿‡ Spring Bean åç§°å³å¯ - * 3. expression:表达å¼ï¼Œä¸€ä¸ªæ™®é€šç±»çš„æ™®é€šæ–¹æ³•,将这个普通类注册到 Spring 容器中,然åŽè¡¨è¾¾å¼ä¸­è¿˜å¯ä»¥æ‰§è¡Œè¿™ä¸ªç±»ä¸­çš„æ–¹æ³• - */ - private String valueType; - /** - * 值 - */ - private String value; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java deleted file mode 100644 index bbe42d2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.definition; - -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.*; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Set; - -/** - * BPM 用户组 - * - * @author ZT - */ -@TableName(value = "bpm_user_group", autoResultMap = true) -@KeySequence("bpm_user_group_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmUserGroupDO extends BaseDO { - - /** - * ç¼–å·ï¼Œè‡ªå¢ž - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 组å - */ - private String name; - /** - * æè¿° - */ - private String description; - /** - * çŠ¶æ€ - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * æˆå‘˜ç”¨æˆ·ç¼–å·æ•°ç»„ - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Set userIds; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java deleted file mode 100644 index 76dabd2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.oa; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -/** - * OA 请å‡ç”³è¯· DO - * - * {@link #day} 请å‡å¤©æ•°ï¼Œç›®å‰å…ˆç®€å•åšã€‚一般是分æˆè¯·å‡ä¸Šåˆå’Œä¸‹åˆï¼Œå¯ä»¥æ˜¯ 1 整天,å¯ä»¥æ˜¯ 0.5 åŠå¤© - * - * @author jason - * @author ZT - */ -@TableName("bpm_oa_leave") -@KeySequence("bpm_oa_leave_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmOALeaveDO extends BaseDO { - - /** - * 请å‡è¡¨å•主键 - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * ç”³è¯·äººçš„ç”¨æˆ·ç¼–å· - * - * å…³è” AdminUserDO çš„ id 属性 - */ - private Long userId; - /** - * 请å‡ç±»åž‹ - */ - private String type; - /** - * 原因 - */ - private String reason; - /** - * 开始时间 - */ - private LocalDateTime startTime; - /** - * ç»“æŸæ—¶é—´ - */ - private LocalDateTime endTime; - /** - * 请å‡å¤©æ•° - */ - private Long day; - /** - * 审批结果 - * - * 枚举 {@link BpmTaskStatusEnum} - * 考虑到简å•,所以直接å¤ç”¨äº† BpmProcessInstanceStatusEnum 枚举,也å¯ä»¥è‡ªå·±å®šä¹‰ä¸€ä¸ªæžšä¸¾å“ˆ - */ - private Integer status; - - /** - * 对应的æµç¨‹ç¼–å· - * - * å…³è” ProcessInstance çš„ id 属性 - */ - private String processInstanceId; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java deleted file mode 100644 index ef06a3e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.zt.plat.module.bpm.dal.dataobject.task; - -import com.zt.plat.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.flowable.bpmn.model.FlowNode; -import org.flowable.task.api.history.HistoricTaskInstance; - -/** - * æµç¨‹æŠ„é€ DO - * - * @author kyle - * @since 2024-01-22 - */ -@TableName(value = "bpm_process_instance_copy", autoResultMap = true) -@KeySequence("bpm_process_instance_copy_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmProcessInstanceCopyDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - - /** - * å‘起人 Id - * - * 冗余 ProcessInstance çš„ startUserId 字段 - */ - private Long startUserId; - /** - * æµç¨‹å - * - * 冗余 ProcessInstance çš„ name 字段 - */ - private String processInstanceName; - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - * - * å…³è” ProcessInstance çš„ id 属性 - */ - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„æµç¨‹å®šä¹‰ç¼–å· - * - * å…³è” ProcessInstance çš„ processDefinitionId 属性 - */ - private String processDefinitionId; - /** - * æµç¨‹åˆ†ç±» - * - * 冗余 ProcessInstance çš„ category 字段 - */ - private String category; - /** - * æµç¨‹æ´»åŠ¨çš„ç¼–å· - *

- * - * 冗余 {@link FlowNode#getId()},对应 BPMN XML èŠ‚ç‚¹ç¼–å· - * 原因:用于查询抄é€èŠ‚ç‚¹çš„è¡¨å•字段æƒé™ã€‚因为仿钉钉/飞书的抄é€èŠ‚ç‚¹ (ServiceTask),没有 taskIdï¼Œåªæœ‰ activityId - */ - private String activityId; - /** - * æµç¨‹æ´»åŠ¨çš„åå­— - * - * 冗余 {@link FlowNode#getName()} - */ - private String activityName; - /** - * æµç¨‹æ´»åŠ¨çš„ç¼–å· - * - * å…³è” {@link HistoricTaskInstance#getId()} - */ - private String taskId; - - /** - * 用户编å·ï¼ˆè¢«æŠ„é€çš„用户编å·ï¼‰ - * - * å…³è” system_users çš„ id 属性 - */ - private Long userId; - - /** - * æŠ„é€æ„è§ - */ - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/category/BpmCategoryMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/category/BpmCategoryMapper.java deleted file mode 100644 index 5c36ae4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/category/BpmCategoryMapper.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.category; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * BPM æµç¨‹åˆ†ç±» Mapper - * - * @author ZT - */ -@Mapper -public interface BpmCategoryMapper extends BaseMapperX { - - default PageResult selectPage(BpmCategoryPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmCategoryDO::getName, reqVO.getName()) - .likeIfPresent(BpmCategoryDO::getCode, reqVO.getCode()) - .eqIfPresent(BpmCategoryDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(BpmCategoryDO::getCreateTime, reqVO.getCreateTime()) - .orderByAsc(BpmCategoryDO::getSort)); - } - - default BpmCategoryDO selectByName(String name) { - return selectOne(BpmCategoryDO::getName, name); - } - - default BpmCategoryDO selectByCode(String code) { - return selectOne(BpmCategoryDO::getCode, code); - } - - default List selectListByCode(Collection codes) { - return selectList(BpmCategoryDO::getCode, codes); - } - - default List selectListByStatus(Integer status) { - return selectList(BpmCategoryDO::getStatus, status); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmFormMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmFormMapper.java deleted file mode 100644 index db73b65..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmFormMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.definition; - - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.QueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 动æ€è¡¨å• Mapper - * - * @author 风里雾里 - */ -@Mapper -public interface BpmFormMapper extends BaseMapperX { - - default PageResult selectPage(BpmFormPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .orderByDesc("id")); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java deleted file mode 100644 index 5d5be48..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.definition; - -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface BpmProcessDefinitionInfoMapper extends BaseMapperX { - - default List selectListByProcessDefinitionIds(Collection processDefinitionIds) { - return selectList(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionIds); - } - - default BpmProcessDefinitionInfoDO selectByProcessDefinitionId(String processDefinitionId) { - return selectOne(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionId); - } - - default void updateByModelId(String modelId, BpmProcessDefinitionInfoDO updateObj) { - update(updateObj, - new LambdaQueryWrapperX().eq(BpmProcessDefinitionInfoDO::getModelId, modelId)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessExpressionMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessExpressionMapper.java deleted file mode 100644 index 4551fd3..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessExpressionMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * BPM æµç¨‹è¡¨è¾¾å¼ Mapper - * - * @author ZT - */ -@Mapper -public interface BpmProcessExpressionMapper extends BaseMapperX { - - default PageResult selectPage(BpmProcessExpressionPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmProcessExpressionDO::getName, reqVO.getName()) - .eqIfPresent(BpmProcessExpressionDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(BpmProcessExpressionDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BpmProcessExpressionDO::getId)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessListenerMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessListenerMapper.java deleted file mode 100644 index 6f6c89e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmProcessListenerMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * BPM æµç¨‹ç›‘å¬å™¨ Mapper - * - * @author ZT - */ -@Mapper -public interface BpmProcessListenerMapper extends BaseMapperX { - - default PageResult selectPage(BpmProcessListenerPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmProcessListenerDO::getName, reqVO.getName()) - .eqIfPresent(BpmProcessListenerDO::getType, reqVO.getType()) - .eqIfPresent(BpmProcessListenerDO::getEvent, reqVO.getEvent()) - .eqIfPresent(BpmProcessListenerDO::getStatus, reqVO.getStatus()) - .orderByDesc(BpmProcessListenerDO::getId)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java deleted file mode 100644 index 4c52531..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 用户组 Mapper - * - * @author ZT - */ -@Mapper -public interface BpmUserGroupMapper extends BaseMapperX { - - default PageResult selectPage(BpmUserGroupPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BpmUserGroupDO::getName, reqVO.getName()) - .eqIfPresent(BpmUserGroupDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(BpmUserGroupDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BpmUserGroupDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(BpmUserGroupDO::getStatus, status); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java deleted file mode 100644 index 7e0f439..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.oa; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 请å‡ç”³è¯· Mapper - * - * @author jason - * @author ZT - */ -@Mapper -public interface BpmOALeaveMapper extends BaseMapperX { - - default PageResult selectPage(Long userId, BpmOALeavePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BpmOALeaveDO::getUserId, userId) - .eqIfPresent(BpmOALeaveDO::getStatus, reqVO.getStatus()) - .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType()) - .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason()) - .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BpmOALeaveDO::getId)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java deleted file mode 100644 index b35d217..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zt.plat.module.bpm.dal.mysql.task; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; -import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface BpmProcessInstanceCopyMapper extends BaseMapperX { - - default PageResult selectPage(Long loginUserId, BpmProcessInstanceCopyPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId) - .likeIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceName, reqVO.getProcessInstanceName()) - .betweenIfPresent(BpmProcessInstanceCopyDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BpmProcessInstanceCopyDO::getId)); - } - - default void deleteByProcessInstanceId(String processInstanceId) { - delete(BpmProcessInstanceCopyDO::getProcessInstanceId, processInstanceId); - } - - default List getByProcessInstanceId(String processInstanceId) { - return selectList(BpmProcessInstanceCopyDO::getProcessInstanceId, processInstanceId); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/BpmProcessIdRedisDAO.java deleted file mode 100644 index b6b0f69..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.zt.plat.module.bpm.dal.redis; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import jakarta.annotation.Resource; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Repository; - -import java.time.Duration; -import java.time.LocalDateTime; - -import static cn.hutool.core.date.DatePattern.*; - -/** - * BPM æµç¨‹ Id ç¼–ç çš„ Redis DAO - * - * @author Lesan - */ -@Repository -public class BpmProcessIdRedisDAO { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 生æˆåºå·ï¼Œä½¿ç”¨å®šä¹‰çš„ processIdRule è§„åˆ™ç”Ÿæˆ - * - * @param processIdRule 规则 - * @return åºå· - */ - public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { - // ç”Ÿæˆæ—¥æœŸå‰ç¼€ - String infix = ""; - switch (processIdRule.getInfix()) { - case "DAY": - infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN); - break; - case "HOUR": - infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN + "HH"); - break; - case "MINUTE": - infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN + "HHmm"); - break; - case "SECOND": - infix = DateUtil.format(LocalDateTime.now(), PURE_DATETIME_PATTERN); - break; - } - - // 生æˆåºå· - String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); - String key = RedisKeyConstants.BPM_PROCESS_ID + noPrefix; - Long no = stringRedisTemplate.opsForValue().increment(key); - if (StrUtil.isNotEmpty(infix)) { - // 特殊:没有å‰ç¼€ï¼Œåˆ™ä¸èƒ½è¿‡æœŸï¼Œä¸èƒ½æ¯æ¬¡éƒ½æ˜¯ä»Ž 0 开始 - stringRedisTemplate.expire(key, Duration.ofDays(1L)); - } - return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/RedisKeyConstants.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/RedisKeyConstants.java deleted file mode 100644 index 9146bc9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/dal/redis/RedisKeyConstants.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.zt.plat.module.bpm.dal.redis; - -/** - * BPM Redis Key 枚举类 - * - * @author ZT - */ -public interface RedisKeyConstants { - - /** - * æµç¨‹ ID 的缓存 - */ - String BPM_PROCESS_ID = "bpm:process_id:"; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java deleted file mode 100644 index 159cfce..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.config; - -import cn.hutool.core.collection.ListUtil; -import com.zt.plat.module.bpm.framework.flowable.core.behavior.BpmActivityBehaviorFactory; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.event.BpmProcessInstanceEventPublisher; -import com.zt.plat.module.system.api.user.AdminUserApi; -import org.flowable.common.engine.api.delegate.FlowableFunctionDelegate; -import org.flowable.common.engine.api.delegate.event.FlowableEventListener; -import org.flowable.engine.ProcessEngineConfiguration; -import org.flowable.spring.SpringProcessEngineConfiguration; -import org.flowable.spring.boot.EngineConfigurationConfigurer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.task.AsyncListenableTaskExecutor; -import org.springframework.jdbc.datasource.DataSourceUtils; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.List; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.SQLException; - -/** - * BPM 模å—çš„ Flowable é…置类 - * - * @author jason - */ -@Configuration(proxyBeanMethods = false) -public class BpmFlowableConfiguration { - - private static final Logger log = LoggerFactory.getLogger(BpmFlowableConfiguration.class); - - /** - * å‚考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean - * - * 如果ä¸åˆ›å»ºï¼Œä¼šå¯¼è‡´é¡¹ç›®å¯åŠ¨æ—¶ï¼ŒFlowable 报错的问题 - */ - @Bean(name = "applicationTaskExecutor") - @ConditionalOnMissingBean(name = "applicationTaskExecutor") - public AsyncListenableTaskExecutor taskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(8); - executor.setMaxPoolSize(8); - executor.setQueueCapacity(100); - executor.setThreadNamePrefix("flowable-task-Executor-"); - executor.setAwaitTerminationSeconds(30); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setAllowCoreThreadTimeOut(true); - executor.initialize(); - return executor; - } - - /** - * BPM 模å—çš„ ProcessEngineConfigurationConfigurer 实现类: - * - * 1. 设置å„ç§ç›‘å¬å™¨ - * 2. 设置自定义的 ActivityBehaviorFactory 实现 - */ - @Bean - public EngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( - ObjectProvider listeners, - ObjectProvider customFlowableFunctionDelegates, - BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { - return configuration -> { - // 注册监å¬å™¨ï¼Œä¾‹å¦‚说 BpmActivityEventListener - configuration.setEventListeners(ListUtil.toList(listeners.iterator())); - // 设置 ActivityBehaviorFactory 实现类,用于æµç¨‹ä»»åŠ¡çš„å®¡æ ¸äººçš„è‡ªå®šä¹‰ - configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); - // 设置自定义的函数 - configuration.setCustomFlowableFunctionDelegates(ListUtil.toList(customFlowableFunctionDelegates.stream().iterator())); - }; - } - - @Bean - public EngineConfigurationConfigurer dmProcessEngineConfigurationConfigurer(DataSource dataSource) { - return configuration -> { - try { - configureDmCompatibility(configuration, dataSource); - } catch (SQLException ex) { - log.warn("Failed to inspect datasource for DM compatibility; Flowable will keep default settings", ex); - } - }; - } - - private void configureDmCompatibility(SpringProcessEngineConfiguration configuration, DataSource dataSource) throws SQLException { - Connection connection = null; - try { - connection = DataSourceUtils.getConnection(dataSource); - DatabaseMetaData metaData = connection.getMetaData(); - String productName = metaData.getDatabaseProductName(); - String jdbcUrl = metaData.getURL(); - boolean dmProduct = productName != null && productName.toLowerCase().contains("dm"); - boolean dmUrl = jdbcUrl != null && jdbcUrl.toLowerCase().startsWith("jdbc:dm"); - if (!dmProduct && !dmUrl) { - return; - } - log.info("Detected DM database (product='{}'); enabling Flowable Oracle compatibility with automatic schema updates", productName); - configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); - configuration.setDatabaseType("oracle"); - } finally { - DataSourceUtils.releaseConnection(connection, dataSource); - } - } - - // =========== 审批人相关的 Bean ========== - - @Bean - public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskCandidateInvoker bpmTaskCandidateInvoker) { - BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); - bpmActivityBehaviorFactory.setTaskCandidateInvoker(bpmTaskCandidateInvoker); - return bpmActivityBehaviorFactory; - } - - @Bean - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") // adminUserApi å¯ä»¥æ³¨å…¥æˆåŠŸ - public BpmTaskCandidateInvoker bpmTaskCandidateInvoker(List strategyList, - AdminUserApi adminUserApi) { - return new BpmTaskCandidateInvoker(strategyList, adminUserApi); - } - - // =========== 自己拓展的 Bean ========== - - @Bean - public BpmProcessInstanceEventPublisher processInstanceEventPublisher(ApplicationEventPublisher publisher) { - return new BpmProcessInstanceEventPublisher(publisher); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java deleted file mode 100644 index ec9cd8f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.behavior; - -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import lombok.Setter; -import org.flowable.bpmn.model.Activity; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; -import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; -import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; -import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior; -import org.flowable.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; - -/** - * 自定义的 ActivityBehaviorFactory 实现类,目的如下: - * 1. 自定义 {@link #createUserTaskActivityBehavior(UserTask)}:实现自定义的æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * - * @author ZT - */ -@Setter -public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { - - private BpmTaskCandidateInvoker taskCandidateInvoker; - - @Override - public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { - return new BpmUserTaskActivityBehavior(userTask) - .setTaskCandidateInvoker(taskCandidateInvoker); - } - - @Override - public ParallelMultiInstanceBehavior createParallelMultiInstanceBehavior(Activity activity, - AbstractBpmnActivityBehavior behavior) { - return new BpmParallelMultiInstanceBehavior(activity, behavior) - .setTaskCandidateInvoker(taskCandidateInvoker); - } - - @Override - public SequentialMultiInstanceBehavior createSequentialMultiInstanceBehavior(Activity activity, - AbstractBpmnActivityBehavior behavior) { - return new BpmSequentialMultiInstanceBehavior(activity, behavior) - .setTaskCandidateInvoker(taskCandidateInvoker); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java deleted file mode 100644 index 2df2ce7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.behavior; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.util.collection.SetUtils; -import com.zt.plat.module.bpm.enums.definition.BpmChildProcessMultiInstanceSourceTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import lombok.Setter; -import org.flowable.bpmn.model.Activity; -import org.flowable.bpmn.model.CallActivity; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; -import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; - -import java.util.List; -import java.util.Set; - -/** - * 自定义的ã€å¹¶è¡Œã€‘çš„ã€å¤šä¸ªã€‘æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * 第一步,基于分é…规则,计算出分é…任务的ã€å¤šä¸ªã€‘候选人们。 - * 第二步,将ã€å¤šä¸ªã€‘任务候选人们,设置到 DelegateExecution çš„ collectionVariable å˜é‡ä¸­ï¼Œä»¥ä¾¿ BpmUserTaskActivityBehavior 使用它 - * - * @author kemengkai - * @since 2022-04-21 16:57 - */ -@Setter -public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior { - - private BpmTaskCandidateInvoker taskCandidateInvoker; - - public BpmParallelMultiInstanceBehavior(Activity activity, - AbstractBpmnActivityBehavior innerActivityBehavior) { - super(activity, innerActivityBehavior); - } - - /** - * é‡å†™è¯¥æ–¹æ³•,主è¦å®žçŽ°ä¸¤ä¸ªåŠŸèƒ½ï¼š - * 1. 忽略原有的 collectionVariableã€collectionElementVariable 表达å¼ï¼Œè€Œæ˜¯é‡‡ç”¨è‡ªå·±å®šä¹‰çš„ - * 2. 获得任务的处ç†äººï¼Œå¹¶è®¾ç½®åˆ° collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中å¯ä»¥èŽ·å–任务的处ç†äºº - * - * 注æ„,多个任务实例,æ¯ä¸ªä»»åŠ¡å®žä¾‹å¯¹åº”ä¸€ä¸ªå¤„ç†äººï¼Œæ‰€ä»¥è¿”回的数é‡å°±æ˜¯ä»»åС处ç†äººçš„æ•°é‡ - * - * @param execution 执行任务 - * @return æ•°é‡ - */ - @Override - protected int resolveNrOfInstances(DelegateExecution execution) { - // 情况一:UserTask 节点 - if (execution.getCurrentFlowElement() instanceof UserTask) { - // 第一步,设置 collectionVariable å’Œ CollectionVariable - // 从 execution.getVariable() è¯»å–æ‰€æœ‰ä»»åС处ç†äººçš„ key - super.collectionExpression = null; // collectionExpression å’Œ collectionVariable 是互斥的 - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); - // 从 execution.getVariable() 读å–当剿‰€æœ‰ä»»åС处ç†çš„人的 key - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); - - // 第二步,获å–任务的所有处ç†äºº - @SuppressWarnings("unchecked") - Set assigneeUserIds = (Set) execution.getVariable(super.collectionVariable, Set.class); - if (assigneeUserIds == null) { - assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution); - if (CollUtil.isEmpty(assigneeUserIds)) { - // 特殊:如果没有处ç†äººçš„æƒ…况下,至少有一个 null 空元素,é¿å…è‡ªåŠ¨é€šè¿‡ï¼ - // 这样,ä¿è¯åœ¨ BpmUserTaskActivityBehavior 至少创建出一个 Task 任务 - // 用途:1)审批人为空时;2)审批类型为自动通过ã€è‡ªåŠ¨æ‹’ç»æ—¶ - assigneeUserIds = SetUtils.asSet((Long) null); - } - execution.setVariableLocal(super.collectionVariable, assigneeUserIds); - } - return assigneeUserIds.size(); - } - - // 情况二:CallActivity 节点 - if (execution.getCurrentFlowElement() instanceof CallActivity) { - FlowElement flowElement = execution.getCurrentFlowElement(); - Integer sourceType = BpmnModelUtils.parseMultiInstanceSourceType(flowElement); - if (sourceType.equals(BpmChildProcessMultiInstanceSourceTypeEnum.NUMBER_FORM.getType())) { - return execution.getVariable(super.collectionExpression.getExpressionText(), Integer.class); - } - if (sourceType.equals(BpmChildProcessMultiInstanceSourceTypeEnum.MULTIPLE_FORM.getType())) { - return execution.getVariable(super.collectionExpression.getExpressionText(), List.class).size(); - } - } - - return super.resolveNrOfInstances(execution); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java deleted file mode 100644 index 2f7f76d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.behavior; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.util.collection.SetUtils; -import com.zt.plat.module.bpm.enums.definition.BpmChildProcessMultiInstanceSourceTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import lombok.Setter; -import org.flowable.bpmn.model.Activity; -import org.flowable.bpmn.model.CallActivity; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; -import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; - -import java.util.List; -import java.util.Set; - -/** - * 自定义的ã€ä¸²è¡Œã€‘çš„ã€å¤šä¸ªã€‘æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * - * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} ä¸€æ ·ï¼Œåªæ˜¯ç»§æ‰¿çš„ç±»ä¸ä¸€æ · - * - * @author ZT - */ -@Setter -public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior { - - private BpmTaskCandidateInvoker taskCandidateInvoker; - - public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) { - super(activity, innerActivityBehavior); - } - - /** - * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似 - * - * 差异的点:是在ã€ç¬¬äºŒæ­¥ã€‘的时候,需è¦è¿”回 LinkedHashSet 集åˆï¼å› ä¸ºå®ƒéœ€è¦æœ‰åºï¼ - */ - @Override - protected int resolveNrOfInstances(DelegateExecution execution) { - // 情况一:UserTask 节点 - if (execution.getCurrentFlowElement() instanceof UserTask) { - // 第一步,设置 collectionVariable å’Œ CollectionVariable - // 从 execution.getVariable() è¯»å–æ‰€æœ‰ä»»åС处ç†äººçš„ key - super.collectionExpression = null; // collectionExpression å’Œ collectionVariable 是互斥的 - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); - // 从 execution.getVariable() 读å–当剿‰€æœ‰ä»»åС处ç†çš„人的 key - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); - - // 第二步,获å–任务的所有处ç†äºº - // ä¸ä½¿ç”¨ execution.getVariable 原因:目å‰ä¾æ¬¡å®¡æ‰¹ä»»åŠ¡å›žé€€åŽ collectionVariable å˜é‡æ²¡æœ‰æ¸…ç†ï¼Œ å¦‚æžœé‡æ–°è¿›å…¥è¯¥ä»»åŠ¡ä¸ä¼šé‡æ–°åˆ†é…审批人 - @SuppressWarnings("unchecked") - Set assigneeUserIds = (Set) execution.getVariableLocal(super.collectionVariable, Set.class); - if (assigneeUserIds == null) { - assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution); - if (CollUtil.isEmpty(assigneeUserIds)) { - // 特殊:如果没有处ç†äººçš„æƒ…况下,至少有一个 null 空元素,é¿å…è‡ªåŠ¨é€šè¿‡ï¼ - // 这样,ä¿è¯åœ¨ BpmUserTaskActivityBehavior 至少创建出一个 Task 任务 - // 用途:1)审批人为空时;2)审批类型为自动通过ã€è‡ªåŠ¨æ‹’ç»æ—¶ - assigneeUserIds = SetUtils.asSet((Long) null); - } - execution.setVariableLocal(super.collectionVariable, assigneeUserIds); - } - return assigneeUserIds.size(); - } - - // 情况二:CallActivity 节点 - if (execution.getCurrentFlowElement() instanceof CallActivity) { - FlowElement flowElement = execution.getCurrentFlowElement(); - Integer sourceType = BpmnModelUtils.parseMultiInstanceSourceType(flowElement); - if (sourceType.equals(BpmChildProcessMultiInstanceSourceTypeEnum.NUMBER_FORM.getType())) { - return execution.getVariable(super.collectionExpression.getExpressionText(), Integer.class); - } - if (sourceType.equals(BpmChildProcessMultiInstanceSourceTypeEnum.MULTIPLE_FORM.getType())) { - return execution.getVariable(super.collectionExpression.getExpressionText(), List.class).size(); - } - } - - return super.resolveNrOfInstances(execution); - } - - @Override - protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) { - // å‚è§ https://gitee.com/zhijiantianya/zt-cloud/issues/IC239F - super.collectionExpression = null; - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); - super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java deleted file mode 100644 index 8d29c54..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.behavior; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.RandomUtil; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.UserTask; -import org.flowable.common.engine.impl.el.ExpressionManager; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior; -import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.impl.util.TaskHelper; -import org.flowable.engine.interceptor.CreateUserTaskBeforeContext; -import org.flowable.task.service.TaskService; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Set; - -/** - * 自定义的ã€å•个】æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * 第一步,基于分é…规则,计算出分é…任务的ã€å•个】候选人。如果找ä¸åˆ°ï¼Œåˆ™ç›´æŽ¥æŠ¥ä¸šåŠ¡å¼‚å¸¸ï¼Œä¸ç»§ç»­æ‰§è¡ŒåŽç»­çš„æµç¨‹ï¼› - * ç¬¬äºŒæ­¥ï¼Œéšæœºé€‰æ‹©ä¸€ä¸ªå€™é€‰äººï¼Œåˆ™é€‰æ‹©ä½œä¸º assignee 负责人。 - * - * @author ZT - */ -@Slf4j -public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior { - - @Setter - private BpmTaskCandidateInvoker taskCandidateInvoker; - - public BpmUserTaskActivityBehavior(UserTask userTask) { - super(userTask); - } - - @Override - @Transactional(rollbackFor = Exception.class) - protected void handleAssignments(TaskService taskService, String assignee, String owner, - List candidateUsers, List candidateGroups, TaskEntity task, ExpressionManager expressionManager, - DelegateExecution execution, ProcessEngineConfigurationImpl processEngineConfiguration) { - // 第一步,获得任务的候选用户 - Long assigneeUserId = calculateTaskCandidateUsers(execution); - // 第二步,设置作为负责人 - if (assigneeUserId != null) { - TaskHelper.changeTaskAssignee(task, String.valueOf(assigneeUserId)); - } - } - - private Long calculateTaskCandidateUsers(DelegateExecution execution) { - // æƒ…å†µä¸€ï¼Œå¦‚æžœæ˜¯å¤šå®žä¾‹çš„ä»»åŠ¡ï¼Œä¾‹å¦‚è¯´ä¼šç­¾ã€æˆ–签等情况,则从 Variable 中获å–。 - // 顺åºå®¡æ‰¹å¯è§ BpmSequentialMultiInstanceBehavior,并å‘审批å¯è§ BpmSequentialMultiInstanceBehavior - if (super.multiInstanceActivityBehavior != null) { - return execution.getVariable(super.multiInstanceActivityBehavior.getCollectionElementVariable(), Long.class); - } - - // 情况二,如果éžå¤šå®žä¾‹çš„任务,则计算任务处ç†äºº - // 第一步,先计算å¯å¤„ç†è¯¥ä»»åŠ¡çš„å¤„ç†äººä»¬ - Set candidateUserIds = taskCandidateInvoker.calculateUsersByTask(execution); - if (CollUtil.isEmpty(candidateUserIds)) { - return null; - } - // 第二步,åŽéšæœºé€‰æ‹©ä¸€ä¸ªä»»åŠ¡çš„å¤„ç†äºº - // 疑问:为什么一定è¦é€‰æ‹©ä¸€ä¸ªä»»åС处ç†äººï¼Ÿ - // 解答:项目对 bpm 的任务是责任到人,所以æ¯ä¸ªä»»åŠ¡æœ‰ä¸”ä»…æœ‰ä¸€ä¸ªå¤„ç†äººã€‚ - // 如果希望一个任务å¯ä»¥åŒæ—¶è¢«å¤šä¸ªäººå¤„ç†ï¼Œå¯ä»¥è€ƒè™‘使用 BpmParallelMultiInstanceBehavior 实现的会签 or 或签。 - int index = RandomUtil.randomInt(candidateUserIds.size()); - return CollUtil.get(candidateUserIds, index); - } - - @Override - protected void handleCategory(CreateUserTaskBeforeContext beforeContext, ExpressionManager expressionManager, - TaskEntity task, DelegateExecution execution) { - ProcessDefinitionEntity processDefinitionEntity = CommandContextUtil.getProcessDefinitionEntityManager().findById(execution.getProcessDefinitionId()); - if (processDefinitionEntity == null) { - log.warn("[handleCategory][任务编å·({}) 找ä¸åˆ°æµç¨‹å®šä¹‰({})]", task.getId(), execution.getProcessDefinitionId()); - return; - } - task.setCategory(processDefinitionEntity.getCategory()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java deleted file mode 100644 index 54310ef..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.util.object.ObjectUtils; -import com.zt.plat.framework.datapermission.core.annotation.DataPermission; -import com.zt.plat.module.bpm.enums.definition.BpmUserTaskApproveTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.CallActivity; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; - -import java.util.*; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG; - -/** - * {@link BpmTaskCandidateStrategy} 的调用者,用于调用对应的策略,实现任务的候选人的计算 - * - * @author ZT - */ -@Slf4j -public class BpmTaskCandidateInvoker { - - private final Map strategyMap = new HashMap<>(); - - private final AdminUserApi adminUserApi; - - public BpmTaskCandidateInvoker(List strategyList, - AdminUserApi adminUserApi) { - strategyList.forEach(strategy -> { - BpmTaskCandidateStrategy oldStrategy = strategyMap.put(strategy.getStrategy(), strategy); - Assert.isNull(oldStrategy, "ç­–ç•¥(%s) é‡å¤", strategy.getStrategy()); - }); - this.adminUserApi = adminUserApi; - } - - /** - * 校验æµç¨‹æ¨¡åž‹çš„任务分é…规则全部都é…置了 - * 目的:如果有规则未é…置,会导致æµç¨‹ä»»åŠ¡æ‰¾ä¸åˆ°è´Ÿè´£äººï¼Œè¿›è€Œæµç¨‹æ— æ³•è¿›è¡Œä¸‹åŽ»ï¼ - * - * @param bpmnBytes BPMN XML - */ - public void validateBpmnConfig(byte[] bpmnBytes) { - BpmnModel bpmnModel = BpmnModelUtils.getBpmnModel(bpmnBytes); - assert bpmnModel != null; - List userTaskList = BpmnModelUtils.getBpmnModelElements(bpmnModel, UserTask.class); - // é历所有的 UserTask,校验审批人é…ç½® - userTaskList.forEach(userTask -> { - // 1.1 éžäººå·¥å®¡æ‰¹ï¼Œæ— éœ€æ ¡éªŒå®¡æ‰¹äººé…ç½® - Integer approveType = BpmnModelUtils.parseApproveType(userTask); - if (ObjectUtils.equalsAny(approveType, - BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType(), - BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { - return; - } - // 1.2 éžç©ºæ ¡éªŒ - Integer strategy = BpmnModelUtils.parseCandidateStrategy(userTask); - String param = BpmnModelUtils.parseCandidateParam(userTask); - if (strategy == null) { - throw exception(MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG, userTask.getName()); - } - BpmTaskCandidateStrategy candidateStrategy = getCandidateStrategy(strategy); - if (candidateStrategy.isParamRequired() && StrUtil.isBlank(param)) { - throw exception(MODEL_DEPLOY_FAIL_TASK_CANDIDATE_NOT_CONFIG, userTask.getName()); - } - // 2. 具体策略校验 - getCandidateStrategy(strategy).validateParam(param); - }); - } - - /** - * 计算任务的候选人 - * - * @param execution 执行任务 - * @return 用户编å·é›†åˆ - */ - @DataPermission(enable = false) // å¿½ç•¥æ•°æ®æƒé™ï¼Œé¿å…因为过滤,导致找ä¸åˆ°å€™é€‰äºº - public Set calculateUsersByTask(DelegateExecution execution) { - // 注æ„:解决æžç«¯æƒ…况下,Flowable 异步调用,导致租户 id 丢失的情况 - // 例如说,SIMPLE 延迟器在 trigger 的时候ï¼ï¼ï¼ - return FlowableUtils.execute(execution.getTenantId(), () -> { - // 审批类型éžäººå·¥å®¡æ ¸æ—¶ï¼Œä¸è¿›è¡Œè®¡ç®—候选人。原因是:åŽç»­ä¼šè‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ - FlowElement flowElement = execution.getCurrentFlowElement(); - Integer approveType = BpmnModelUtils.parseApproveType(flowElement); - if (ObjectUtils.equalsAny(approveType, - BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType(), - BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { - return new HashSet<>(); - } - - // 1.1 计算任务的候选人 - Integer strategy = BpmnModelUtils.parseCandidateStrategy(flowElement); - String param = BpmnModelUtils.parseCandidateParam(flowElement); - Set userIds = getCandidateStrategy(strategy).calculateUsersByTask(execution, param); - // 1.2 移除被ç¦ç”¨çš„用户 - removeDisableUsers(userIds); - - // 2. 候选人为空时,根æ®â€œå®¡æ‰¹äººä¸ºç©ºâ€çš„é…置补充 - if (CollUtil.isEmpty(userIds)) { - userIds = getCandidateStrategy(BpmTaskCandidateStrategyEnum.ASSIGN_EMPTY.getStrategy()) - .calculateUsersByTask(execution, param); - // ASSIGN_EMPTY 策略,ä¸éœ€è¦ç§»é™¤è¢«ç¦ç”¨çš„用户。原因是,å†ç§»é™¤ï¼Œå¯èƒ½ä¼šå‡ºçŽ°æ›´æ²¡å®¡æ‰¹äººäº†ï¼ï¼ï¼ - } - - // 3. 移除å‘起人的用户 - ProcessInstance processInstance = SpringUtil.getBean(BpmProcessInstanceService.class) - .getProcessInstance(execution.getProcessInstanceId()); - Assert.notNull(processInstance, "æµç¨‹å®žä¾‹({}) ä¸å­˜åœ¨", execution.getProcessInstanceId()); - removeStartUserIfSkip(userIds, flowElement, Long.valueOf(processInstance.getStartUserId())); - return userIds; - }); - } - - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, - Long startUserId, String processDefinitionId, Map processVariables) { - // 如果是 CallActivity å­æµç¨‹ï¼Œä¸è¿›è¡Œè®¡ç®—候选人 - FlowElement flowElement = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); - if (flowElement instanceof CallActivity) { - return new HashSet<>(); - } - // 审批类型éžäººå·¥å®¡æ ¸æ—¶ï¼Œä¸è¿›è¡Œè®¡ç®—候选人。原因是:åŽç»­ä¼šè‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ - Integer approveType = BpmnModelUtils.parseApproveType(flowElement); - if (ObjectUtils.equalsAny(approveType, - BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType(), - BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { - return new HashSet<>(); - } - - // 1.1 计算任务的候选人 - Integer strategy = BpmnModelUtils.parseCandidateStrategy(flowElement); - String param = BpmnModelUtils.parseCandidateParam(flowElement); - Set userIds = getCandidateStrategy(strategy).calculateUsersByActivity(bpmnModel, activityId, param, - startUserId, processDefinitionId, processVariables); - // 1.2 移除被ç¦ç”¨çš„用户 - removeDisableUsers(userIds); - - // 2. 候选人为空时,根æ®â€œå®¡æ‰¹äººä¸ºç©ºâ€çš„é…置补充 - if (CollUtil.isEmpty(userIds)) { - userIds = getCandidateStrategy(BpmTaskCandidateStrategyEnum.ASSIGN_EMPTY.getStrategy()) - .calculateUsersByActivity(bpmnModel, activityId, param, startUserId, processDefinitionId, processVariables); - // ASSIGN_EMPTY 策略,ä¸éœ€è¦ç§»é™¤è¢«ç¦ç”¨çš„用户。原因是,å†ç§»é™¤ï¼Œå¯èƒ½ä¼šå‡ºçŽ°æ›´æ²¡å®¡æ‰¹äººäº†ï¼ï¼ï¼ - } - - // 3. 移除å‘起人的用户 - removeStartUserIfSkip(userIds, flowElement, startUserId); - return userIds; - } - - @VisibleForTesting - void removeDisableUsers(Set assigneeUserIds) { - if (CollUtil.isEmpty(assigneeUserIds)) { - return; - } - Map userMap = adminUserApi.getUserMap(assigneeUserIds); - assigneeUserIds.removeIf(id -> { - AdminUserRespDTO user = userMap.get(id); - return user == null || CommonStatusEnum.isDisable(user.getStatus()); - }); - } - - /** - * 如果“审批人与å‘èµ·äººç›¸åŒæ—¶â€ï¼Œé…置了 SKIP 跳过,则移除å‘起人 - * - * 注æ„ï¼šå¦‚æžœåªæœ‰ä¸€ä¸ªå€™é€‰äººï¼Œåˆ™ä¸å¤„ç†ï¼Œé¿å…无法审批 - * - * @param assigneeUserIds 当å‰åˆ†é…的候选人 - * @param flowElement 当å‰èŠ‚ç‚¹ - * @param startUserId å‘起人 - */ - @VisibleForTesting - void removeStartUserIfSkip(Set assigneeUserIds, FlowElement flowElement, Long startUserId) { - if (CollUtil.size(assigneeUserIds) <= 1) { - return; - } - Integer assignStartUserHandlerType = BpmnModelUtils.parseAssignStartUserHandlerType(flowElement); - if (ObjectUtil.notEqual(assignStartUserHandlerType, BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP.getType())) { - return; - } - assigneeUserIds.remove(startUserId); - } - - private BpmTaskCandidateStrategy getCandidateStrategy(Integer strategy) { - BpmTaskCandidateStrategyEnum strategyEnum = BpmTaskCandidateStrategyEnum.valueOf(strategy); - Assert.notNull(strategyEnum, "ç­–ç•¥(%s) ä¸å­˜åœ¨", strategy); - BpmTaskCandidateStrategy strategyObj = strategyMap.get(strategyEnum); - Assert.notNull(strategyObj, "ç­–ç•¥(%s) ä¸å­˜åœ¨", strategy); - return strategyObj; - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateStrategy.java deleted file mode 100644 index 2d916be..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateStrategy.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate; - -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; - -import java.util.Map; -import java.util.Set; - -/** - * BPM ä»»åŠ¡çš„å€™é€‰äººçš„ç­–ç•¥æŽ¥å£ - *

- * 例如说:分é…审批人 - * - * @author ZT - */ -public interface BpmTaskCandidateStrategy { - - /** - * 对应策略 - * - * @return ç­–ç•¥ - */ - BpmTaskCandidateStrategyEnum getStrategy(); - - /** - * æ ¡éªŒå‚æ•° - * - * @param param 傿•° - */ - void validateParam(String param); - - /** - * 是å¦ä¸€å®šè¦è¾“入傿•° - * - * @return æ˜¯å¦ - */ - default boolean isParamRequired() { - return true; - } - - /** - * åŸºäºŽå€™é€‰äººå‚æ•°ï¼ŒèŽ·å¾—ä»»åŠ¡çš„å€™é€‰ç”¨æˆ·ä»¬ - * - * 注æ„:实现 calculateUsers 系列方法时,有两ç§é€‰æ‹©ï¼š - * 1. åªé‡å†™ calculateUsers 默认方法 - * 2. 都é‡å†™ calculateUsersByTask å’Œ calculateUsersByActivity 两个方法 - * - * @param param 执行任务 - * @return 用户编å·é›†åˆ - */ - default Set calculateUsers(String param) { - throw new UnsupportedOperationException("è¯¥åˆ†é…æ–¹æ³•未实现,请检查ï¼"); - } - - /** - * åŸºäºŽã€æ‰§è¡Œä»»åŠ¡ã€‘ï¼ŒèŽ·å¾—ä»»åŠ¡çš„å€™é€‰ç”¨æˆ·ä»¬ - * - * @param execution 执行任务 - * @return 用户编å·é›†åˆ - */ - default Set calculateUsersByTask(DelegateExecution execution, String param) { - return calculateUsers(param); - } - - /** - * åŸºäºŽã€æµç¨‹æ´»åŠ¨ã€‘ï¼ŒèŽ·å¾—ä»»åŠ¡çš„å€™é€‰ç”¨æˆ·ä»¬ - *

- * ç›®çš„ï¼šç”¨äºŽèŽ·å–æœªæ‰§è¡ŒèŠ‚ç‚¹çš„å€™é€‰ç”¨æˆ·ä»¬ - * - * @param bpmnModel æµç¨‹å›¾ - * @param activityId 活动 ID (对应 Bpmn XML id) - * @param param èŠ‚ç‚¹çš„å‚æ•° - * @param startUserId æµç¨‹å‘èµ·äººç¼–å· - * @param processDefinitionId æµç¨‹å®šä¹‰ç¼–å· - * @param processVariables æµç¨‹å˜é‡ - * @return 用户编å·é›†åˆ - */ - @SuppressWarnings("unused") - default Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - return calculateUsers(param); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignLeaderExpression.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignLeaderExpression.java deleted file mode 100644 index fd34457..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignLeaderExpression.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.expression; - -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.SetUtils.asSet; -import static java.util.Collections.emptySet; - -/** - * 分é…ç»™å‘起人的 Leader 审批的 Expression æµç¨‹è¡¨è¾¾å¼ - * ç›®å‰ Leader 的定义是,å‘起人所在部门的 Leader - * - * @author ZT - */ -@Component -public class BpmTaskAssignLeaderExpression { - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @Resource - private BpmProcessInstanceService processInstanceService; - - /** - * 计算审批的候选人 - * - * @param execution æµç¨‹æ‰§è¡Œå®žä½“ - * @param level 指定级别 - * @return 指定级别的领导 - */ - public Set calculateUsers(DelegateExecution execution, int level) { - Assert.isTrue(level > 0, "level 必须大于 0"); - // 获得å‘起人 - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); - // 获得对应 leve 的部门 - DeptRespDTO dept = null; - for (int i = 0; i < level; i++) { - // 获得 level 对应的部门 - if (dept == null) { - dept = getStartUserDept(startUserId); - if (dept == null) { // 找ä¸åˆ°å‘起人的部门,所以无法使用该规则 - return emptySet(); - } - } else { - DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()).getCheckedData(); - if (parentDept == null) { // 找ä¸åˆ°çˆ¶çº§éƒ¨é—¨ï¼Œæ‰€ä»¥åªå¥½ç»“æŸå¯»æ‰¾ã€‚原因是:例如说,级别比较高的人,所在部门层级比较少 - break; - } - dept = parentDept; - } - } - return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet(); - } - - private DeptRespDTO getStartUserDept(Long startUserId) { - AdminUserRespDTO startUser = adminUserApi.getUser(startUserId).getCheckedData(); - Long deptId = DeptUtil.getDeptId(startUser); - if (deptId == 0L) { // 找ä¸åˆ°éƒ¨é—¨ï¼Œæ‰€ä»¥æ— æ³•使用该规则 - return null; - } - return deptApi.getDept(deptId).getCheckedData(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignStartUserExpression.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignStartUserExpression.java deleted file mode 100644 index bee41e7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignStartUserExpression.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.expression; - -import com.zt.plat.framework.common.util.collection.SetUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人审批的 Expression æµç¨‹è¡¨è¾¾å¼ - * - * @author ZT - */ -@Component -public class BpmTaskAssignStartUserExpression { - - @Resource - private BpmProcessInstanceService processInstanceService; - - /** - * 计算审批的候选人 - * - * @param execution æµç¨‹æ‰§è¡Œå®žä½“ - * @return å‘起人 - */ - public Set calculateUsers(ExecutionEntityImpl execution) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); - return SetUtils.asSet(startUserId); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java deleted file mode 100644 index 9c0a760..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; - -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -/** - * 部门的负责人 {@link BpmTaskCandidateStrategy} 抽象类 - * - * @author jason - */ -public abstract class AbstractBpmTaskCandidateDeptLeaderStrategy implements BpmTaskCandidateStrategy { - - @Resource - protected DeptApi deptApi; - @Resource - protected AdminUserApi adminUserApi; - - /** - * èŽ·å¾—æŒ‡å®šå±‚çº§çš„éƒ¨é—¨è´Ÿè´£äººï¼Œåªæœ‰ç¬¬ level 的负责人 - * - * @param dept 指定部门 - * @param level 第几级 - * @return éƒ¨é—¨è´Ÿè´£äººçš„ç¼–å· - */ - protected Long getAssignLevelDeptLeaderId(DeptRespDTO dept, Integer level) { - Assert.isTrue(level > 0, "level 必须大于 0"); - if (dept == null) { - return null; - } - DeptRespDTO currentDept = dept; - for (int i = 1; i < level; i++) { - DeptRespDTO parentDept = deptApi.getDept(currentDept.getParentId()).getCheckedData(); - if (parentDept == null) { // 找ä¸åˆ°çˆ¶çº§éƒ¨é—¨ï¼Œåˆ°äº†æœ€é«˜çº§ã€‚返回最高级的部门负责人 - break; - } - currentDept = parentDept; - } - return currentDept.getLeaderUserId(); - } - - /** - * èŽ·å¾—è¿žç»­å±‚çº§çš„éƒ¨é—¨è´Ÿè´£äººï¼ŒåŒ…å« [1, level] 的负责人 - * - * @param deptIds æŒ‡å®šéƒ¨é—¨ç¼–å·æ•°ç»„ - * @param level 最大层级 - * @return 连续部门负责人 Id - */ - protected Set getMultiLevelDeptLeaderIds(List deptIds, Integer level) { - Assert.isTrue(level > 0, "level 必须大于 0"); - if (CollUtil.isEmpty(deptIds)) { - return new HashSet<>(); - } - Set deptLeaderIds = new LinkedHashSet<>(); // ä¿è¯æœ‰åº - for (Long deptId : deptIds) { - DeptRespDTO dept = deptApi.getDept(deptId).getCheckedData(); - for (int i = 0; i < level; i++) { - if (dept.getLeaderUserId() != null) { - deptLeaderIds.add(dept.getLeaderUserId()); - } - DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()).getCheckedData(); - if (parentDept == null) { // 找ä¸åˆ°çˆ¶çº§éƒ¨é—¨. å·²ç»åˆ°äº†æœ€é«˜å±‚级了 - break; - } - dept = parentDept; - } - } - return deptLeaderIds; - } - - /** - * 获å–å‘起人的部门 - * - * @param startUserId å‘起人 Id - */ - protected DeptRespDTO getStartUserDept(Long startUserId) { - AdminUserRespDTO startUser = adminUserApi.getUser(startUserId).getCheckedData(); - if (CollUtil.isEmpty(startUser.getDeptIds())) { // 找ä¸åˆ°éƒ¨é—¨ - return null; - } - return deptApi.getDept(DeptUtil.getDeptId(startUser)).getCheckedData(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateApproveUserSelectStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateApproveUserSelectStrategy.java deleted file mode 100644 index bfd429c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateApproveUserSelectStrategy.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user.BpmTaskCandidateUserStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.google.common.collect.Sets; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -/** - * 审批人自选 {@link BpmTaskCandidateUserStrategy} 实现类 - * 审批人在审批时选择下一个节点的审批人 - * - * @author smallNorthLee - */ -@Component -public class BpmTaskCandidateApproveUserSelectStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT; - } - - @Override - public void validateParam(String param) {} - - @Override - public boolean isParamRequired() { - return false; - } - - @Override - public LinkedHashSet calculateUsersByTask(DelegateExecution execution, String param) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Assert.notNull(processInstance, "æµç¨‹å®žä¾‹({})ä¸èƒ½ä¸ºç©º", execution.getProcessInstanceId()); - Map> approveUserSelectAssignees = FlowableUtils.getApproveUserSelectAssignees(processInstance); - Assert.notNull(approveUserSelectAssignees, "æµç¨‹å®žä¾‹({}) 的下一个执行节点审批人ä¸èƒ½ä¸ºç©º", - execution.getProcessInstanceId()); - if (approveUserSelectAssignees == null) { - return Sets.newLinkedHashSet(); - } - // 获得审批人 - List assignees = approveUserSelectAssignees.get(execution.getCurrentActivityId()); - return CollUtil.isNotEmpty(assignees) ? new LinkedHashSet<>(assignees) : Sets.newLinkedHashSet(); - } - - @Override - public LinkedHashSet calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - if (processVariables == null) { - return Sets.newLinkedHashSet(); - } - // æµç¨‹é¢„测时会使用,å…许审批人为空,如果为空å‰ç«¯ä¼šå¼¹å‡ºæç¤ºé€‰æ‹©ä¸‹ä¸€ä¸ªèŠ‚ç‚¹å®¡æ‰¹äººï¼Œé¿å…æµç¨‹æ— æ³•进行,审批时会真正校验节点是å¦é…置审批人 - Map> approveUserSelectAssignees = FlowableUtils.getApproveUserSelectAssignees(processVariables); - if (approveUserSelectAssignees == null) { - return Sets.newLinkedHashSet(); - } - // 获得审批人 - List assignees = approveUserSelectAssignees.get(activityId); - return CollUtil.isNotEmpty(assignees) ? new LinkedHashSet<>(assignees) : Sets.newLinkedHashSet(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderMultiStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderMultiStrategy.java deleted file mode 100644 index f851e66..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderMultiStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -/** - * 连续多级部门的负责人 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author jason - */ -@Component -public class BpmTaskCandidateDeptLeaderMultiStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.MULTI_DEPT_LEADER_MULTI; - } - - @Override - public void validateParam(String param) { - // 傿•°æ ¼å¼: | 分隔:1)左边为部门(多个部门用 , 分隔)。2)å³è¾¹ä¸ºéƒ¨é—¨å±‚级 - String[] params = param.split("\\|"); - Assert.isTrue(params.length == 2, "傿•°æ ¼å¼ä¸åŒ¹é…"); - List deptIds = StrUtils.splitToLong(params[0], ","); - int level = Integer.parseInt(params[1]); - // 校验部门存在 - deptApi.validateDeptList(deptIds).checkError(); - Assert.isTrue(level > 0, "部门层级必须大于 0"); - } - - @Override - public Set calculateUsers(String param) { - String[] params = param.split("\\|"); - List deptIds = StrUtils.splitToLong(params[0], ","); - int level = Integer.parseInt(params[1]); - return super.getMultiLevelDeptLeaderIds(deptIds, level); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderStrategy.java deleted file mode 100644 index ad1c93b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptLeaderStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * 部门的负责人 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateDeptLeaderStrategy implements BpmTaskCandidateStrategy { - - @Resource - private DeptApi deptApi; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.DEPT_LEADER; - } - - @Override - public void validateParam(String param) { - Set deptIds = StrUtils.splitToLongSet(param); - deptApi.validateDeptList(deptIds).checkError(); - } - - @Override - public Set calculateUsers(String param) { - Set deptIds = StrUtils.splitToLongSet(param); - List depts = deptApi.getDeptList(deptIds).getCheckedData(); - return convertSet(depts, DeptRespDTO::getLeaderUserId); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptMemberStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptMemberStrategy.java deleted file mode 100644 index aa2c3f0..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateDeptMemberStrategy.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * 部门的æˆå‘˜ {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateDeptMemberStrategy implements BpmTaskCandidateStrategy { - - @Resource - private DeptApi deptApi; - @Resource - private AdminUserApi adminUserApi; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.DEPT_MEMBER; - } - - @Override - public void validateParam(String param) { - Set deptIds = StrUtils.splitToLongSet(param); - deptApi.validateDeptList(deptIds).checkError(); - } - - @Override - public Set calculateUsers(String param) { - Set deptIds = StrUtils.splitToLongSet(param); - List users = adminUserApi.getUserListByDeptIds(deptIds).getCheckedData(); - return convertSet(users, AdminUserRespDTO::getId); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderMultiStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderMultiStrategy.java deleted file mode 100644 index 04e4963..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderMultiStrategy.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static cn.hutool.core.collection.ListUtil.toList; - -/** - * å‘起人连续多级部门的负责人 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author jason - */ -@Component -public class BpmTaskCandidateStartUserDeptLeaderMultiStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Resource - @Lazy - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.START_USER_DEPT_LEADER_MULTI; - } - - @Override - public void validateParam(String param) { - int level = Integer.parseInt(param); // 傿•°æ˜¯éƒ¨é—¨çš„层级 - Assert.isTrue(level > 0, "部门的层级必须大于 0"); - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - int level = Integer.parseInt(param); // 傿•°æ˜¯éƒ¨é—¨çš„层级 - // 获得æµç¨‹å‘起人 - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); - // 获å–å‘起人的 multi 部门负责人 - DeptRespDTO dept = super.getStartUserDept(startUserId); - if (dept == null) { - return new HashSet<>(); - } - return super.getMultiLevelDeptLeaderIds(toList(dept.getId()), level); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - int level = Integer.parseInt(param); // 傿•°æ˜¯éƒ¨é—¨çš„层级 - DeptRespDTO dept = super.getStartUserDept(startUserId); - if (dept == null) { - return new HashSet<>(); - } - return super.getMultiLevelDeptLeaderIds(toList(dept.getId()), level); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderStrategy.java deleted file mode 100644 index 9670fa9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserDeptLeaderStrategy.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.SetUtils.asSet; - -/** - * å‘起人的部门负责人, å¯ä»¥æ˜¯ä¸Šçº§éƒ¨é—¨è´Ÿè´£äºº {@link BpmTaskCandidateStrategy} 实现类 - * - * @author jason - */ -@Component -public class BpmTaskCandidateStartUserDeptLeaderStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Resource - @Lazy // é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.START_USER_DEPT_LEADER; - } - - @Override - public void validateParam(String param) { - // 傿•°æ˜¯éƒ¨é—¨çš„层级 - Assert.isTrue(Integer.parseInt(param) > 0, "部门的层级必须大于 0"); - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - // 获得æµç¨‹å‘起人 - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); - // 获å–å‘起人的部门负责人 - return getStartUserDeptLeader(startUserId, param); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - // 获å–å‘起人的部门负责人 - return getStartUserDeptLeader(startUserId, param); - } - - private Set getStartUserDeptLeader(Long startUserId, String param) { - int level = Integer.parseInt(param); // 傿•°æ˜¯éƒ¨é—¨çš„层级 - DeptRespDTO dept = super.getStartUserDept(startUserId); - if (dept == null) { - return new HashSet<>(); - } - Long deptLeaderId = super.getAssignLevelDeptLeaderId(dept, level); - return deptLeaderId != null ? asSet(deptLeaderId) : new HashSet<>(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserSelectStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserSelectStrategy.java deleted file mode 100644 index 189e5db..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/dept/BpmTaskCandidateStartUserSelectStrategy.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user.BpmTaskCandidateUserStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.google.common.collect.Sets; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -/** - * å‘起人自选 {@link BpmTaskCandidateUserStrategy} 实现类 - * - * @author ZT - */ -@Component -public class BpmTaskCandidateStartUserSelectStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.START_USER_SELECT; - } - - @Override - public void validateParam(String param) {} - - @Override - public boolean isParamRequired() { - return false; - } - - @Override - public LinkedHashSet calculateUsersByTask(DelegateExecution execution, String param) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - Assert.notNull(processInstance, "æµç¨‹å®žä¾‹({})ä¸èƒ½ä¸ºç©º", execution.getProcessInstanceId()); - Map> startUserSelectAssignees = FlowableUtils.getStartUserSelectAssignees(processInstance); - Assert.notNull(startUserSelectAssignees, "æµç¨‹å®žä¾‹({}) çš„å‘起人自选审批人ä¸èƒ½ä¸ºç©º", - execution.getProcessInstanceId()); - // 获得审批人 - List assignees = startUserSelectAssignees.get(execution.getCurrentActivityId()); - return CollUtil.isNotEmpty(assignees) ? new LinkedHashSet<>(assignees) : Sets.newLinkedHashSet(); - } - - @Override - public LinkedHashSet calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - if (processVariables == null) { - return Sets.newLinkedHashSet(); - } - Map> startUserSelectAssignees = FlowableUtils.getStartUserSelectAssignees(processVariables); - if (startUserSelectAssignees == null) { - return Sets.newLinkedHashSet(); - } - // 获得审批人 - List assignees = startUserSelectAssignees.get(activityId); - return CollUtil.isNotEmpty(assignees) ? new LinkedHashSet<>(assignees) : Sets.newLinkedHashSet(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormDeptLeaderStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormDeptLeaderStrategy.java deleted file mode 100644 index 119b59d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormDeptLeaderStrategy.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.form; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Assert; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.dept.AbstractBpmTaskCandidateDeptLeaderStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.springframework.stereotype.Component; - -import java.util.Map; -import java.util.Set; - -/** - * 表å•内部门负责人 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author jason - */ -@Component -public class BpmTaskCandidateFormDeptLeaderStrategy extends AbstractBpmTaskCandidateDeptLeaderStrategy { - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.FORM_DEPT_LEADER; - } - - @Override - public void validateParam(String param) { - // 傿•°æ ¼å¼: | 分隔:1)左边为表å•内部门字段。2)å³è¾¹ä¸ºéƒ¨é—¨å±‚级 - String[] params = param.split("\\|"); - Assert.isTrue(params.length == 2, "傿•°æ ¼å¼ä¸åŒ¹é…"); - Assert.notEmpty(param, "表å•内部门字段ä¸èƒ½ä¸ºç©º"); - int level = Integer.parseInt(params[1]); - Assert.isTrue(level > 0, "部门层级必须大于 0"); - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - String[] params = param.split("\\|"); - Object result = execution.getVariable(params[0]); - int level = Integer.parseInt(params[1]); - return super.getMultiLevelDeptLeaderIds(Convert.toList(Long.class, result), level); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, - String param, Long startUserId, String processDefinitionId, - Map processVariables) { - String[] params = param.split("\\|"); - Object result = processVariables == null ? null : processVariables.get(params[0]); - int level = Integer.parseInt(params[1]); - return super.getMultiLevelDeptLeaderIds(Convert.toList(Long.class, result), level); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormUserStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormUserStrategy.java deleted file mode 100644 index 435717b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/form/BpmTaskCandidateFormUserStrategy.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.form; - -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user.BpmTaskCandidateUserStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.springframework.stereotype.Component; - -import java.util.Map; -import java.util.Set; - -/** - * 表å•内用户字段 {@link BpmTaskCandidateUserStrategy} 实现类 - * - * @author jason - */ -@Component -public class BpmTaskCandidateFormUserStrategy implements BpmTaskCandidateStrategy { - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.FORM_USER; - } - - @Override - public void validateParam(String param) { - Assert.notEmpty(param, "表å•内用户字段ä¸èƒ½ä¸ºç©º"); - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - Object result = execution.getVariable(param); - return CollectionUtils.toLinkedHashSet(Long.class, result); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, - String param, Long startUserId, String processDefinitionId, - Map processVariables) { - Object result = processVariables == null ? null : processVariables.get(param); - return CollectionUtils.toLinkedHashSet(Long.class, result); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateAssignEmptyStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateAssignEmptyStrategy.java deleted file mode 100644 index 8c360bc..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateAssignEmptyStrategy.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.other; - -import cn.hutool.core.lang.Assert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.enums.definition.BpmUserTaskAssignEmptyHandlerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.engine.delegate.DelegateExecution; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -/** - * 审批人为空 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateAssignEmptyStrategy implements BpmTaskCandidateStrategy { - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessDefinitionService processDefinitionService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.ASSIGN_EMPTY; - } - - @Override - public void validateParam(String param) { - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - return getCandidateUsers(execution.getProcessDefinitionId(), execution.getCurrentFlowElement()); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - FlowElement flowElement = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); - return getCandidateUsers(processDefinitionId, flowElement); - } - - private Set getCandidateUsers(String processDefinitionId, FlowElement flowElement) { - // 情况一:指定人员审批 - Integer assignEmptyHandlerType = BpmnModelUtils.parseAssignEmptyHandlerType(flowElement); - if (Objects.equals(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.ASSIGN_USER.getType())) { - return new HashSet<>(BpmnModelUtils.parseAssignEmptyHandlerUserIds(flowElement)); - } - - // 情况二:æµç¨‹ç®¡ç†å‘˜ - if (Objects.equals(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.ASSIGN_ADMIN.getType())) { - BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(processDefinitionId); - Assert.notNull(processDefinition, "æµç¨‹å®šä¹‰({})ä¸å­˜åœ¨", processDefinitionId); - return new HashSet<>(processDefinition.getManagerUserIds()); - } - - // éƒ½ä¸æ»¡è¶³ï¼Œè¿˜æ˜¯è¿”回空 - return new HashSet<>(); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateExpressionStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateExpressionStrategy.java deleted file mode 100644 index 8350a8a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/other/BpmTaskCandidateExpressionStrategy.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.other; - -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.google.common.collect.Sets; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.api.FlowableException; -import org.flowable.engine.delegate.DelegateExecution; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * æµç¨‹è¡¨è¾¾å¼ {@link BpmTaskCandidateStrategy} 实现类 - * - * @author ZT - */ -@Component -@Slf4j -public class BpmTaskCandidateExpressionStrategy implements BpmTaskCandidateStrategy { - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.EXPRESSION; - } - - @Override - public void validateParam(String param) { - // do nothing 因为它基本åšä¸äº†æ ¡éªŒ - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - Object result = FlowableUtils.getExpressionValue(execution, param); - return CollectionUtils.toLinkedHashSet(Long.class, result); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - Map variables = processVariables == null ? new HashMap<>() : processVariables; - try { - Object result = FlowableUtils.getExpressionValue(variables, param); - return CollectionUtils.toLinkedHashSet(Long.class, result); - } catch (FlowableException ex) { - // 预测未è¿è¡Œçš„节点时候,表达å¼å¦‚æžœåŒ…å« execution 或者ä¸å­˜åœ¨çš„æµç¨‹å˜é‡ä¼šæŠ›å¼‚常, - log.warn("[calculateUsersByActivity][表达å¼({}) å˜é‡({}) è§£æžæŠ¥é”™", param, variables, ex); - // ä¸èƒ½é¢„测候选人,返回空列表, é¿å…æµç¨‹æ— æ³•进行 - return Sets.newHashSet(); - } - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateGroupStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateGroupStrategy.java deleted file mode 100644 index 5bc1232..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateGroupStrategy.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user; - -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.service.definition.BpmUserGroupService; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; - -/** - * 用户组 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateGroupStrategy implements BpmTaskCandidateStrategy { - - @Resource - private BpmUserGroupService userGroupService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.USER_GROUP; - } - - @Override - public void validateParam(String param) { - Set groupIds = StrUtils.splitToLongSet(param); - userGroupService.validUserGroups(groupIds); - } - - @Override - public Set calculateUsers(String param) { - Set groupIds = StrUtils.splitToLongSet(param); - List groups = userGroupService.getUserGroupList(groupIds); - return convertSetByFlatMap(groups, BpmUserGroupDO::getUserIds, Collection::stream); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidatePostStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidatePostStrategy.java deleted file mode 100644 index 74edf8a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidatePostStrategy.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user; - -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.system.api.dept.PostApi; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * å²—ä½ {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidatePostStrategy implements BpmTaskCandidateStrategy { - - @Resource - private PostApi postApi; - @Resource - private AdminUserApi adminUserApi; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.POST; - } - - @Override - public void validateParam(String param) { - Set postIds = StrUtils.splitToLongSet(param); - postApi.validPostList(postIds); - } - - @Override - public Set calculateUsers(String param) { - Set postIds = StrUtils.splitToLongSet(param); - List users = adminUserApi.getUserListByPostIds(postIds).getCheckedData(); - return convertSet(users, AdminUserRespDTO::getId); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateRoleStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateRoleStrategy.java deleted file mode 100644 index f8223d9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateRoleStrategy.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user; - -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.system.api.permission.PermissionApi; -import com.zt.plat.module.system.api.permission.RoleApi; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 角色 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateRoleStrategy implements BpmTaskCandidateStrategy { - - @Resource - private RoleApi roleApi; - @Resource - private PermissionApi permissionApi; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.ROLE; - } - - @Override - public void validateParam(String param) { - Set roleIds = StrUtils.splitToLongSet(param); - roleApi.validRoleList(roleIds); - } - - @Override - public Set calculateUsers(String param) { - Set roleIds = StrUtils.splitToLongSet(param); - return permissionApi.getUserRoleIdListByRoleIds(roleIds).getCheckedData(); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateStartUserStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateStartUserStrategy.java deleted file mode 100644 index ed527fa..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateStartUserStrategy.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user; - -import com.zt.plat.framework.common.util.collection.SetUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.Map; -import java.util.Set; - -/** - * å‘起人自己 {@link BpmTaskCandidateUserStrategy} 实现类 - *

- * 适åˆåœºæ™¯ï¼šç”¨äºŽéœ€è¦å‘起人信æ¯å¤æ ¸ç­‰åœºæ™¯ - * - * @author jason - */ -@Component -public class BpmTaskCandidateStartUserStrategy implements BpmTaskCandidateStrategy { - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.START_USER; - } - - @Override - public void validateParam(String param) { - } - - @Override - public boolean isParamRequired() { - return false; - } - - @Override - public Set calculateUsersByTask(DelegateExecution execution, String param) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); - return SetUtils.asSet(Long.valueOf(processInstance.getStartUserId())); - } - - @Override - public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, String param, - Long startUserId, String processDefinitionId, Map processVariables) { - return SetUtils.asSet(startUserId); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateUserStrategy.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateUserStrategy.java deleted file mode 100644 index f6a64ee..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/candidate/strategy/user/BpmTaskCandidateUserStrategy.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.candidate.strategy.user; - -import cn.hutool.core.text.StrPool; -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.system.api.user.AdminUserApi; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.LinkedHashSet; - -/** - * 用户 {@link BpmTaskCandidateStrategy} 实现类 - * - * @author kyle - */ -@Component -public class BpmTaskCandidateUserStrategy implements BpmTaskCandidateStrategy { - - @Resource - private AdminUserApi adminUserApi; - - @Override - public BpmTaskCandidateStrategyEnum getStrategy() { - return BpmTaskCandidateStrategyEnum.USER; - } - - @Override - public void validateParam(String param) { - adminUserApi.validateUserList(StrUtils.splitToLongSet(param)).checkError(); - } - - @Override - public LinkedHashSet calculateUsers(String param) { - return new LinkedHashSet<>(StrUtils.splitToLong(param, StrPool.COMMA)); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/el/VariableConvertByTypeExpressionFunction.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/el/VariableConvertByTypeExpressionFunction.java deleted file mode 100644 index c5db881..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/el/VariableConvertByTypeExpressionFunction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.el; - -import org.flowable.common.engine.api.variable.VariableContainer; -import org.flowable.common.engine.impl.el.function.AbstractFlowableVariableExpressionFunction; -import org.springframework.stereotype.Component; - -/** - * æ ¹æ®æµç¨‹å˜é‡ variable 的类型,转æ¢å‚数的值 - * - * ç›®å‰ç”¨äºŽ ConditionNodeConvert çš„ buildConditionExpression 方法中 - * - * @author jason - */ -@Component -public class VariableConvertByTypeExpressionFunction extends AbstractFlowableVariableExpressionFunction { - - public VariableConvertByTypeExpressionFunction() { - super("convertByType"); - } - - public static Object convertByType(VariableContainer variableContainer, String variableName, Object parmaValue) { - Object variable = variableContainer.getVariable(variableName); - if (variable != null && parmaValue != null) { - // å¦‚æžœå€¼ä¸æ˜¯å­—符串类型,æµç¨‹å˜é‡çš„类型是字符串,把值转æˆå­—符串 - if (!(parmaValue instanceof String) && variable instanceof String ) { - return parmaValue.toString(); - } - } - return parmaValue; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java deleted file mode 100644 index 9a8b399..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.enums; - -import cn.hutool.core.util.ArrayUtil; -import com.zt.plat.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * BPM 任务的候选人策略枚举 - * - * 例如说:分é…给指定人审批 - * - * @author ZT - */ -@Getter -@AllArgsConstructor -public enum BpmTaskCandidateStrategyEnum implements ArrayValuable { - - ROLE(10, "角色"), - DEPT_MEMBER(20, "部门的æˆå‘˜"), // 包括负责人 - DEPT_LEADER(21, "部门的负责人"), - MULTI_DEPT_LEADER_MULTI(23, "连续多级部门的负责人"), - POST(22, "å²—ä½"), - USER(30, "用户"), - APPROVE_USER_SELECT(34, "审批人自身"), // 当å‰å®¡æ‰¹äººï¼Œå¯åœ¨å®¡æ‰¹æ—¶ï¼Œé€‰æ‹©ä¸‹ä¸€ä¸ªèŠ‚ç‚¹çš„å®¡æ‰¹äºº - START_USER_SELECT(35, "å‘起人自选"), // 申请人自己,å¯åœ¨æäº¤ç”³è¯·æ—¶ï¼Œé€‰æ‹©æ­¤èŠ‚ç‚¹çš„å®¡æ‰¹äºº - START_USER(36, "å‘起人自己"), // 申请人自己, 一般紧挨开始节点,常用于å‘起人信æ¯å®¡æ ¸åœºæ™¯ - START_USER_DEPT_LEADER(37, "å‘起人部门负责人"), - START_USER_DEPT_LEADER_MULTI(38, "å‘起人连续多级部门的负责人"), - USER_GROUP(40, "用户组"), - FORM_USER(50, "表å•内用户字段"), - FORM_DEPT_LEADER(51, "表å•内部门负责人"), - EXPRESSION(60, "æµç¨‹è¡¨è¾¾å¼"), // è¡¨è¾¾å¼ ExpressionManager - ASSIGN_EMPTY(1, "审批人为空"), - ; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmTaskCandidateStrategyEnum::getStrategy).toArray(Integer[]::new); - - /** - * 类型 - */ - private final Integer strategy; - /** - * æè¿° - */ - private final String description; - - public static BpmTaskCandidateStrategyEnum valueOf(Integer strategy) { - return ArrayUtil.firstMatch(o -> o.getStrategy().equals(strategy), values()); - } - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java deleted file mode 100644 index de18134..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.enums; - -import com.zt.plat.module.bpm.enums.definition.BpmModelTypeEnum; - -/** - * BPMN XML 常é‡ä¿¡æ¯ - * - * @author ZT - */ -public interface BpmnModelConstants { - - String BPMN_FILE_SUFFIX = ".bpmn"; - - /** - * BPMN 中的命å空间 - */ - String NAMESPACE = "http://flowable.org/bpmn"; - - /** - * BPMN UserTask 的扩展属性,用于标记候选人策略 - */ - String USER_TASK_CANDIDATE_STRATEGY = "candidateStrategy"; - /** - * BPMN UserTask çš„æ‰©å±•å±žæ€§ï¼Œç”¨äºŽæ ‡è®°å€™é€‰äººå‚æ•° - */ - String USER_TASK_CANDIDATE_PARAM = "candidateParam"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记边界事件类型 - */ - String BOUNDARY_EVENT_TYPE = "boundaryEventType"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务超时执行动作 - */ - String USER_TASK_TIMEOUT_HANDLER_TYPE = "timeoutHandlerType"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务的审批人与å‘èµ·äººç›¸åŒæ—¶ï¼Œå¯¹åº”的处ç†ç±»åž‹ - */ - String USER_TASK_ASSIGN_START_USER_HANDLER_TYPE = "assignStartUserHandlerType"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务的空处ç†ç±»åž‹ - */ - String USER_TASK_ASSIGN_EMPTY_HANDLER_TYPE = "assignEmptyHandlerType"; - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务的空处ç†çš„æŒ‡å®šç”¨æˆ·ç¼–å·æ•°ç»„ - */ - String USER_TASK_ASSIGN_USER_IDS = "assignEmptyUserIds"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务拒ç»å¤„ç†ç±»åž‹ - */ - String USER_TASK_REJECT_HANDLER_TYPE = "rejectHandlerType"; - /** - * BPMN ExtensionElement 的扩展属性,用于标记用户任务拒ç»åŽçš„退回的任务 Id - */ - String USER_TASK_REJECT_RETURN_TASK_ID = "rejectReturnTaskId"; - - /** - * BPMN UserTask 的扩展属性,用于标记用户任务的审批类型 - */ - String USER_TASK_APPROVE_TYPE = "approveType"; - - /** - * BPMN UserTask çš„æ‰©å±•å±žæ€§ï¼Œç”¨äºŽæ ‡è®°ç”¨æˆ·ä»»åŠ¡çš„å®¡æ‰¹æ–¹å¼ - */ - String USER_TASK_APPROVE_METHOD = "approveMethod"; - - /** - * BPMN Child Process çš„æ‰©å±•å±žæ€§ï¼Œç”¨äºŽæ ‡è®°å¤šå®žä¾‹æ¥æºç±»åž‹ - */ - String CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE = "childProcessMultiInstanceSourceType"; - - /** - * BPMN ExtensionElement æµç¨‹è¡¨å•字段æƒé™å…ƒç´ , 用于标记字段æƒé™ - */ - String FORM_FIELD_PERMISSION_ELEMENT = "fieldsPermission"; - - /** - * BPMN ExtensionElement Attribute, 用于标记表å•字段 - */ - String FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE = "field"; - /** - * BPMN ExtensionElement Attribute, ç”¨äºŽæ ‡è®°è¡¨å•æƒé™ - */ - String FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE = "permission"; - - /** - * BPMN ExtensionElement æ“作按钮设置元素, 用于审批节点æ“作按钮设置 - */ - String BUTTON_SETTING_ELEMENT = "buttonsSetting"; - - /** - * BPMN ExtensionElement Attribute, ç”¨äºŽæ ‡è®°æŒ‰é’®ç¼–å· - */ - String BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE = "id"; - - /** - * BPMN ExtensionElement Attribute, 用于标记按钮显示åç§° - */ - String BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE = "displayName"; - - /** - * BPMN ExtensionElement Attribute, 用于标记按钮是å¦å¯ç”¨ - */ - String BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE = "enable"; - - /** - * BPMN ExtensionElement 的扩展属性,用于标记触å‘器的类型 - */ - String TRIGGER_TYPE = "triggerType"; - /** - * BPMN ExtensionElement 的扩展属性,用于标记触å‘噍傿•° - */ - String TRIGGER_PARAM = "triggerParam"; - - /** - * BPMN Start Event Node Id - */ - String START_EVENT_NODE_ID = "StartEvent"; - - /** - * å‘起人节点 ID - */ - String START_USER_NODE_ID = "StartUserNode"; - - /** - * 是å¦éœ€è¦ç­¾å - */ - String SIGN_ENABLE = "signEnable"; - - /** - * 审批æ„è§æ˜¯å¦å¿…å¡« - */ - String REASON_REQUIRE = "reasonRequire"; - - /** - * 节点类型 - * - * ç›®å‰åªæœ‰ {@link BpmModelTypeEnum#SIMPLE} çš„ UserTask 节点会设置该属性,用于区分是审批节点ã€è¿˜æ˜¯åŠžç†èŠ‚ç‚¹ - */ - String NODE_TYPE = "nodeType"; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java deleted file mode 100644 index 0e6a697..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.enums; - -import org.flowable.engine.runtime.ProcessInstance; - -/** - * BPM Variable é€šç”¨å¸¸é‡ - * - * @author ZT - */ -public class BpmnVariableConstants { - - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - çŠ¶æ€ - * - * @see ProcessInstance#getProcessVariables() - */ - public static final String PROCESS_INSTANCE_VARIABLE_STATUS = "PROCESS_STATUS"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - ç†ç”± - * - * 例如说:审批ä¸é€šè¿‡çš„ç†ç”±ï¼ˆç›®å‰å®¡æ ¸é€šè¿‡æš‚æ—¶ä¸ä¼šè®°å½•) - * - * @see ProcessInstance#getProcessVariables() - */ - public static final String PROCESS_INSTANCE_VARIABLE_REASON = "PROCESS_REASON"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - å‘起用户选择的审批人 Map - * - * @see ProcessInstance#getProcessVariables() - * @see BpmTaskCandidateStrategyEnum#START_USER_SELECT - */ - public static final String PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES = "PROCESS_START_USER_SELECT_ASSIGNEES"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - 审批人选择的审批人 Map - * - * @see ProcessInstance#getProcessVariables() - * @see BpmTaskCandidateStrategyEnum#APPROVE_USER_SELECT - */ - public static final String PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES = "PROCESS_APPROVE_USER_SELECT_ASSIGNEES"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - å‘起用户 ID - * - * @see ProcessInstance#getProcessVariables() - */ - public static final String PROCESS_INSTANCE_VARIABLE_START_USER_ID = "PROCESS_START_USER_ID"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - 用于判断æµç¨‹å®žä¾‹å˜é‡èŠ‚ç‚¹æ˜¯å¦é©³å›ž. æ ¼å¼ RETURN_FLAG_{节点 id} - * - * 目的是:驳回到å‘起节点时,因为审批人与å‘起人相åŒï¼Œæ‰€ä»¥è¢«è‡ªåŠ¨é€šè¿‡ã€‚ä½†æ˜¯ï¼Œæ­¤æ—¶è¿˜æ˜¯å¸Œæœ›ä¸è¦è‡ªåŠ¨é€šè¿‡ - * - * @see ProcessInstance#getProcessVariables() - */ - public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - 是å¦è·³è¿‡è¡¨è¾¾å¼ - * - * @see ProcessInstance#getProcessVariables() - * @see Flowable/Activiti之SkipExpression 完æˆè‡ªåŠ¨å®¡æ‰¹ - */ - public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; - - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - 用于判断æµç¨‹æ˜¯å¦éœ€è¦è·³è¿‡å‘起人节点 - * - * @see ProcessInstance#getProcessVariables() - */ - public static final String PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE = "PROCESS_SKIP_START_USER_NODE"; - - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - æµç¨‹å¼€å§‹æ—¶é—´ - * - * ã€éžå­˜å‚¨å˜é‡ã€‘ç”¨äºŽéƒ¨åˆ†éœ€è¦ format 的场景,例如说:æµç¨‹å®žä¾‹çš„自定义标题 - */ - public static final String PROCESS_START_TIME = "PROCESS_START_TIME"; - /** - * æµç¨‹å®žä¾‹çš„å˜é‡ - æµç¨‹å®šä¹‰åç§° - */ - public static final String PROCESS_DEFINITION_NAME = "PROCESS_DEFINITION_NAME"; - - /** - * 任务的å˜é‡ - çŠ¶æ€ - * - * @see org.flowable.task.api.Task#getTaskLocalVariables() - */ - public static final String TASK_VARIABLE_STATUS = "TASK_STATUS"; - /** - * 任务的å˜é‡ - ç†ç”± - * - * 例如说:审批通过ã€ä¸é€šè¿‡çš„ç†ç”± - * - * @see org.flowable.task.api.Task#getTaskLocalVariables() - */ - public static final String TASK_VARIABLE_REASON = "TASK_REASON"; - /** - * 任务å˜é‡ - ç­¾å图片 URL - */ - public static final String TASK_SIGN_PIC_URL = "TASK_SIGN_PIC_URL"; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/event/BpmProcessInstanceEventPublisher.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/event/BpmProcessInstanceEventPublisher.java deleted file mode 100644 index 5ec3654..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/event/BpmProcessInstanceEventPublisher.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.event; - -import com.zt.plat.module.bpm.api.event.BpmProcessInstanceStatusEvent; -import jakarta.validation.Valid; -import lombok.AllArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.validation.annotation.Validated; - -/** - * {@link BpmProcessInstanceStatusEvent} 的生产者 - * - * @author ZT - */ -@AllArgsConstructor -@Validated -public class BpmProcessInstanceEventPublisher { - - private final ApplicationEventPublisher publisher; - - public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceStatusEvent event) { - publisher.publishEvent(event); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmCopyTaskDelegate.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmCopyTaskDelegate.java deleted file mode 100644 index a821f05..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmCopyTaskDelegate.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceCopyService; -import jakarta.annotation.Resource; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -import static com.zt.plat.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate.BEAN_NAME; - -/** - * å¤„ç†æŠ„é€ç”¨æˆ·çš„ {@link JavaDelegate} 的实现类 - *

- * ç›®å‰åªæœ‰ä»¿é’‰é’‰/飞书模å¼çš„ã€æŠ„é€èŠ‚ç‚¹ã€‘ä½¿ç”¨ - * - * @author jason - */ -@Component(BEAN_NAME) -public class BpmCopyTaskDelegate implements JavaDelegate { - - public static final String BEAN_NAME = "bpmCopyTaskDelegate"; - - @Resource - private BpmTaskCandidateInvoker taskCandidateInvoker; - - @Resource - private BpmProcessInstanceCopyService processInstanceCopyService; - - @Override - public void execute(DelegateExecution execution) { - // 1. 获得抄é€äºº - Set userIds = taskCandidateInvoker.calculateUsersByTask(execution); - if (CollUtil.isEmpty(userIds)) { - return; - } - // 2. æ‰§è¡ŒæŠ„é€ - FlowElement currentFlowElement = execution.getCurrentFlowElement(); - processInstanceCopyService.createProcessInstanceCopy(userIds, null, execution.getProcessInstanceId(), - currentFlowElement.getId(), currentFlowElement.getName(), null); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java deleted file mode 100644 index 7c4c0e9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener; - -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.google.common.collect.ImmutableSet; -import jakarta.annotation.Resource; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; -import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; -import org.flowable.engine.delegate.event.FlowableCancelledEvent; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * ç›‘å¬ {@link ProcessInstance} 的状æ€å˜æ›´ï¼Œæ›´æ–°å…¶å¯¹åº”çš„ status çŠ¶æ€ - * - * @author jason - */ -@Component -public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEventListener { - - public static final Set PROCESS_INSTANCE_EVENTS = ImmutableSet.builder() - .add(FlowableEngineEventType.PROCESS_CREATED) - .add(FlowableEngineEventType.PROCESS_COMPLETED) - .add(FlowableEngineEventType.PROCESS_CANCELLED) - .build(); - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - public BpmProcessInstanceEventListener(){ - super(PROCESS_INSTANCE_EVENTS); - } - - @Override - protected void processCreated(FlowableEngineEntityEvent event) { - processInstanceService.processProcessInstanceCreated((ProcessInstance)event.getEntity()); - } - - @Override - protected void processCompleted(FlowableEngineEntityEvent event) { - processInstanceService.processProcessInstanceCompleted((ProcessInstance)event.getEntity()); - } - - @Override // 特殊情况:当跳转到 EndEvent æµç¨‹å®žä¾‹æœªç»“æŸ, 会执行 deleteProcessInstance 方法 - protected void processCancelled(FlowableCancelledEvent event) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(event.getProcessInstanceId()); - processInstanceService.processProcessInstanceCompleted(processInstance); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java deleted file mode 100644 index eda5244..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.module.bpm.enums.definition.BpmBoundaryEventTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.service.definition.BpmModelService; -import com.zt.plat.module.bpm.service.task.BpmTaskService; -import com.google.common.collect.ImmutableSet; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BoundaryEvent; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; -import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; -import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.job.api.Job; -import org.flowable.task.api.Task; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -/** - * ç›‘å¬ {@link Task} çš„å¼€å§‹ä¸Žå®Œæˆ - * - * @author jason - */ -@Component -@Slf4j -public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmModelService modelService; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmTaskService taskService; - - public static final Set TASK_EVENTS = ImmutableSet.builder() - .add(FlowableEngineEventType.TASK_CREATED) - .add(FlowableEngineEventType.TASK_ASSIGNED) - .add(FlowableEngineEventType.TASK_COMPLETED) // 由于审批通过时,已ç»è®°å½•了 task çš„ status 为通过,这里仅处ç†ä»»åŠ¡åŽç½®é€šçŸ¥ã€‚ - .add(FlowableEngineEventType.ACTIVITY_CANCELLED) - .add(FlowableEngineEventType.TIMER_FIRED) // 监å¬å®¡æ‰¹è¶…æ—¶ - .build(); - - public BpmTaskEventListener() { - super(TASK_EVENTS); - } - - @Override - protected void taskCreated(FlowableEngineEntityEvent event) { - taskService.processTaskCreated((Task) event.getEntity()); - } - - @Override - protected void taskAssigned(FlowableEngineEntityEvent event) { - taskService.processTaskAssigned((Task) event.getEntity()); - } - - @Override - protected void taskCompleted(FlowableEngineEntityEvent event) { - taskService.processTaskCompleted((Task) event.getEntity()); - } - - @Override - protected void activityCancelled(FlowableActivityCancelledEvent event) { - List activityList = taskService.getHistoricActivityListByExecutionId(event.getExecutionId()); - if (CollUtil.isEmpty(activityList)) { - log.error("[activityCancelled][使用 executionId({}) 查找ä¸åˆ°å¯¹åº”的活动实例]", event.getExecutionId()); - return; - } - // éåŽ†å¤„ç† - activityList.forEach(activity -> { - if (StrUtil.isEmpty(activity.getTaskId())) { - return; - } - taskService.processTaskCanceled(activity.getTaskId()); - }); - } - - @Override - @SuppressWarnings("PatternVariableCanBeUsed") - protected void timerFired(FlowableEngineEntityEvent event) { - // 1.1 åªå¤„ç† BoundaryEvent 边界计时时间 - String processDefinitionId = event.getProcessDefinitionId(); - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processDefinitionId); - Job entity = (Job) event.getEntity(); - FlowElement element = BpmnModelUtils.getFlowElementById(bpmnModel, entity.getElementId()); - if (!(element instanceof BoundaryEvent)) { - return; - } - // 1.2 判断是å¦ä¸ºè¶…æ—¶å¤„ç† - BoundaryEvent boundaryEvent = (BoundaryEvent) element; - String boundaryEventType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, - BpmnModelConstants.BOUNDARY_EVENT_TYPE); - BpmBoundaryEventTypeEnum bpmTimerBoundaryEventType = BpmBoundaryEventTypeEnum.typeOf(NumberUtils.parseInt(boundaryEventType)); - - // 2. 处ç†è¶…æ—¶ - if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT)) { - // 2.1 ç”¨æˆ·ä»»åŠ¡è¶…æ—¶å¤„ç† - String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, - BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); - String taskKey = boundaryEvent.getAttachedToRefId(); - taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); - // 2.2 å»¶è¿Ÿå™¨è¶…æ—¶å¤„ç† - } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT)) { - String taskKey = boundaryEvent.getAttachedToRefId(); - taskService.triggerTask(event.getProcessInstanceId(), taskKey); - // 2.3 å­æµç¨‹è¶…æ—¶å¤„ç† - } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventTypeEnum.CHILD_PROCESS_TIMEOUT)) { - String taskKey = boundaryEvent.getAttachedToRefId(); - taskService.processChildProcessTimeout(event.getProcessInstanceId(), taskKey); - } - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java deleted file mode 100644 index f88ce20..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener; - -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.service.task.trigger.BpmTrigger; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.EnumMap; -import java.util.List; - -import static com.zt.plat.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate.BEAN_NAME; - - -/** - * 处ç†è§¦å‘器任务 {@link JavaDelegate} 的实现类 - *

- * ç›®å‰åªæœ‰ Simple 设计器ã€è§¦å‘器节点】使用 - * - * @author jason - */ -@Component(BEAN_NAME) -@Slf4j -public class BpmTriggerTaskDelegate implements JavaDelegate { - - public static final String BEAN_NAME = "bpmTriggerTaskDelegate"; - - @Resource - private List triggers; - - private final EnumMap triggerMap = new EnumMap<>(BpmTriggerTypeEnum.class); - - @PostConstruct - private void init() { - triggers.forEach(trigger -> triggerMap.put(trigger.getType(), trigger)); - } - - @Override - public void execute(DelegateExecution execution) { - FlowElement flowElement = execution.getCurrentFlowElement(); - BpmTriggerTypeEnum bpmTriggerType = BpmnModelUtils.parserTriggerType(flowElement); - BpmTrigger bpmTrigger = triggerMap.get(bpmTriggerType); - if (bpmTrigger == null) { - log.error("[execute][FlowElement({}), {} 找ä¸åˆ°åŒ¹é…的触å‘器]", execution.getCurrentActivityId(), flowElement); - return; - } - bpmTrigger.execute(execution.getProcessInstanceId(), BpmnModelUtils.parserTriggerParam(flowElement)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateClassExecutionListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateClassExecutionListener.java deleted file mode 100644 index 84763fe..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateClassExecutionListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.exection; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; - -/** - * 类型为 class çš„ ExecutionListener 监å¬å™¨ç¤ºä¾‹ - * - * @author ZT - */ -@Slf4j -public class DemoDelegateClassExecutionListener implements JavaDelegate { - - @Override - public void execute(DelegateExecution execution) { - log.info("[execute][execution({}) 被调用ï¼å˜é‡æœ‰ï¼š{}]", execution.getId(), - execution.getCurrentFlowableListener().getFieldExtensions()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateExpressionExecutionListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateExpressionExecutionListener.java deleted file mode 100644 index 64dba65..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoDelegateExpressionExecutionListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.exection; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -/** - * 类型为 delegateExpression çš„ ExecutionListener 监å¬å™¨ç¤ºä¾‹ - * - * å’Œ {@link DemoDelegateClassExecutionListener} çš„å·®å¼‚æ˜¯ï¼Œéœ€è¦æ³¨å†Œåˆ° Spring 中 - */ -@Component -@Slf4j -public class DemoDelegateExpressionExecutionListener implements JavaDelegate { - - @Override - public void execute(DelegateExecution execution) { - log.info("[execute][execution({}) 被调用ï¼å˜é‡æœ‰ï¼š{}]", execution.getId(), - execution.getCurrentFlowableListener().getFieldExtensions()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoSpringExpressionExecutionListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoSpringExpressionExecutionListener.java deleted file mode 100644 index c6e5b99..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/exection/DemoSpringExpressionExecutionListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.exection; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.springframework.stereotype.Component; - -/** - * 类型为 expression çš„ ExecutionListener 监å¬å™¨ç¤ºä¾‹ - * - * å’Œ {@link DemoDelegateClassExecutionListener} çš„å·®å¼‚æ˜¯ï¼Œéœ€è¦æ³¨å†Œåˆ° Spring 中,但ä¸ç”¨å®žçް {@link org.flowable.engine.delegate.JavaDelegate} æŽ¥å£ - */ -@Component -@Slf4j -public class DemoSpringExpressionExecutionListener { - - public void execute(DelegateExecution execution) { - log.info("[execute][execution({}) 被调用ï¼å˜é‡æœ‰ï¼š{}]", execution.getId(), - execution.getCurrentFlowableListener().getFieldExtensions()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateClassTaskListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateClassTaskListener.java deleted file mode 100644 index 6b4e94e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateClassTaskListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.task; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.TaskListener; -import org.flowable.task.service.delegate.DelegateTask; - -/** - * 类型为 class çš„ TaskListener 监å¬å™¨ç¤ºä¾‹ - * - * @author ZT - */ -@Slf4j -public class DemoDelegateClassTaskListener implements TaskListener { - - @Override - public void notify(DelegateTask delegateTask) { - log.info("[execute][task({}) 被调用]", delegateTask.getId()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateExpressionTaskListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateExpressionTaskListener.java deleted file mode 100644 index 41fa05b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoDelegateExpressionTaskListener.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.task; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.TaskListener; -import org.flowable.task.service.delegate.DelegateTask; -import org.springframework.stereotype.Component; - -/** - * 类型为 delegateExpression çš„ TaskListener 监å¬å™¨ç¤ºä¾‹ - * - * @author ZT - */ -@Component -@Slf4j -public class DemoDelegateExpressionTaskListener implements TaskListener { - - @Override - public void notify(DelegateTask delegateTask) { - log.info("[execute][task({}) 被调用]", delegateTask.getId()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoSpringExpressionTaskListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoSpringExpressionTaskListener.java deleted file mode 100644 index b9a4ccf..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/demo/task/DemoSpringExpressionTaskListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.listener.demo.task; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.task.service.delegate.DelegateTask; -import org.springframework.stereotype.Component; - -/** - * 类型为 expression çš„ TaskListener 监å¬å™¨ç¤ºä¾‹ - * - * @author ZT - */ -@Slf4j -@Component -public class DemoSpringExpressionTaskListener { - - public void notify(DelegateTask delegateTask) { - log.info("[execute][task({}) 被调用]", delegateTask.getId()); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java deleted file mode 100644 index de5b2a4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.util; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.framework.common.pojo.CommonResult; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.spring.SpringUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.enums.definition.BpmHttpRequestParamTypeEnum; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.fasterxml.jackson.core.type.TypeReference; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR; - -/** - * 工作æµå‘èµ· HTTP 请求工具类 - * - * @author ZT - */ -@Slf4j -public class BpmHttpRequestUtils { - - public static void executeBpmHttpRequest(ProcessInstance processInstance, - String url, - List headerParams, - List bodyParams, - Boolean handleResponse, - List> response) { - RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class); - BpmProcessInstanceService processInstanceService = SpringUtils.getBean(BpmProcessInstanceService.class); - - // 1.1 设置请求头 - MultiValueMap headers = buildHttpHeaders(processInstance, headerParams); - // 1.2 设置请求体 - MultiValueMap body = buildHttpBody(processInstance, bodyParams); - - // 2. å‘起请求 - ResponseEntity responseEntity = sendHttpRequest(url, headers, body, restTemplate); - - // 3. 处ç†è¿”回 - if (Boolean.FALSE.equals(handleResponse)) { - return; - } - // 3.1 判断是å¦éœ€è¦è§£æžè¿”回值 - if (responseEntity == null - || StrUtil.isEmpty(responseEntity.getBody()) - || !responseEntity.getStatusCode().is2xxSuccessful() - || CollUtil.isEmpty(response)) { - return; - } - // 3.2 è§£æžè¿”回值, è¿”å›žå€¼å¿…é¡»ç¬¦åˆ CommonResult 规范。 - CommonResult> respResult = JsonUtils.parseObjectQuietly(responseEntity.getBody(), - new TypeReference<>() {}); - if (respResult == null || !respResult.isSuccess()) { - return; - } - // 3.3 获å–éœ€è¦æ›´æ–°çš„æµç¨‹å˜é‡ - Map updateVariables = getNeedUpdatedVariablesFromResponse(respResult.getData(), response); - // 3.4 æ›´æ–°æµç¨‹å˜é‡ - if (CollUtil.isNotEmpty(updateVariables)) { - processInstanceService.updateProcessInstanceVariables(processInstance.getId(), updateVariables); - } - } - - public static ResponseEntity sendHttpRequest(String url, - MultiValueMap headers, - MultiValueMap body, - RestTemplate restTemplate) { - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - ResponseEntity responseEntity; - try { - responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - log.info("[sendHttpRequest][HTTP 触å‘器,请求头:{},请求体:{},å“应结果:{}]", headers, body, responseEntity); - } catch (RestClientException e) { - log.error("[sendHttpRequest][HTTP 触å‘器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); - throw exception(PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR); - } - return responseEntity; - } - - public static MultiValueMap buildHttpHeaders(ProcessInstance processInstance, - List headerSettings) { - Map processVariables = processInstance.getProcessVariables(); - MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add(HEADER_TENANT_ID, processInstance.getTenantId()); - addHttpRequestParam(headers, headerSettings, processVariables); - return headers; - } - - public static MultiValueMap buildHttpBody(ProcessInstance processInstance, - List bodySettings) { - Map processVariables = processInstance.getProcessVariables(); - MultiValueMap body = new LinkedMultiValueMap<>(); - addHttpRequestParam(body, bodySettings, processVariables); - body.add("processInstanceId", processInstance.getId()); - return body; - } - - /** - * 从请求返回值获å–éœ€è¦æ›´æ–°çš„æµç¨‹å˜é‡ - * - * @param result 请求返回结果 - * @param responseSettings 返回设置 - * @return éœ€è¦æ›´æ–°çš„æµç¨‹å˜é‡ - */ - public static Map getNeedUpdatedVariablesFromResponse(Map result, - List> responseSettings) { - Map updateVariables = new HashMap<>(); - if (CollUtil.isEmpty(result)) { - return updateVariables; - } - responseSettings.forEach(responseSetting -> { - if (StrUtil.isNotEmpty(responseSetting.getKey()) && result.containsKey(responseSetting.getValue())) { - updateVariables.put(responseSetting.getKey(), result.get(responseSetting.getValue())); - } - }); - return updateVariables; - } - - /** - * 添加 HTTP è¯·æ±‚å‚æ•°ã€‚请求头或者请求体 - * - * @param params HTTP è¯·æ±‚å‚æ•° - * @param paramSettings HTTP è¯·æ±‚å‚æ•°è®¾ç½® - * @param processVariables æµç¨‹å˜é‡ - */ - public static void addHttpRequestParam(MultiValueMap params, - List paramSettings, - Map processVariables) { - if (CollUtil.isEmpty(paramSettings)) { - return; - } - paramSettings.forEach(item -> { - if (item.getType().equals(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType())) { - params.add(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmHttpRequestParamTypeEnum.FROM_FORM.getType())) { - params.add(item.getKey(), processVariables.get(item.getValue()).toString()); - } - }); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmnModelUtils.java deleted file mode 100644 index b53a819..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ /dev/null @@ -1,1025 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.util; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.string.StrUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import com.zt.plat.module.bpm.enums.definition.*; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants; -import com.google.common.collect.Maps; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.*; -import org.flowable.common.engine.api.FlowableException; -import org.flowable.common.engine.impl.util.io.BytesStreamSource; -import org.flowable.engine.impl.el.FixedValue; - -import java.util.*; - -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*; -import static org.flowable.bpmn.constants.BpmnXMLConstants.FLOWABLE_EXTENSIONS_NAMESPACE; -import static org.flowable.bpmn.constants.BpmnXMLConstants.FLOWABLE_EXTENSIONS_PREFIX; - -/** - * BPMN Model æ“作工具类。目å‰åˆ†æˆä¸‰éƒ¨åˆ†ï¼š - * - * 1. BPMN 修改 + è§£æžå…ƒç´ ç›¸å…³çš„æ–¹æ³• - * 2. BPMN ç®€å•æŸ¥æ‰¾ç›¸å…³çš„æ–¹æ³• - * 3. BPMN 夿‚é历相关的方法 - * 4. BPMN æµç¨‹é¢„测相关的方法 - * - * @author ZT - */ -@Slf4j -public class BpmnModelUtils { - - // ========== BPMN 修改 + è§£æžå…ƒç´ ç›¸å…³çš„æ–¹æ³• ========== - - public static void addExtensionElement(FlowElement element, String name, String value) { - if (value == null) { - return; - } - ExtensionElement extensionElement = new ExtensionElement(); - extensionElement.setNamespace(FLOWABLE_EXTENSIONS_NAMESPACE); - extensionElement.setNamespacePrefix(FLOWABLE_EXTENSIONS_PREFIX); - extensionElement.setElementText(value); - extensionElement.setName(name); - element.addExtensionElement(extensionElement); - } - - public static void addExtensionElement(FlowElement element, String name, Integer value) { - if (value == null) { - return; - } - addExtensionElement(element, name, String.valueOf(value)); - } - - public static void addExtensionElementJson(FlowElement element, String name, Object value) { - if (value == null) { - return; - } - addExtensionElement(element, name, JsonUtils.toJsonString(value)); - } - - public static void addExtensionElement(FlowElement element, String name, Map attributes) { - if (attributes == null) { - return; - } - ExtensionElement extensionElement = new ExtensionElement(); - extensionElement.setNamespace(FLOWABLE_EXTENSIONS_NAMESPACE); - extensionElement.setNamespacePrefix(FLOWABLE_EXTENSIONS_PREFIX); - extensionElement.setName(name); - attributes.forEach((key, value) -> { - ExtensionAttribute extensionAttribute = new ExtensionAttribute(key, value); - extensionElement.addAttribute(extensionAttribute); - }); - element.addExtensionElement(extensionElement); - } - - /** - * è§£æžæ‰©å±•元素 - * - * @param flowElement 节点 - * @param elementName 元素åç§° - * @return 扩展元素 - */ - public static String parseExtensionElement(FlowElement flowElement, String elementName) { - if (flowElement == null) { - return null; - } - ExtensionElement element = CollUtil.getFirst(flowElement.getExtensionElements().get(elementName)); - return element != null ? element.getElementText() : null; - } - - /** - * 给节点添加候选人元素 - * - * @param candidateStrategy 候选人策略 - * @param candidateParam å€™é€‰äººå‚æ•°ï¼Œå…许空 - * @param flowElement 节点 - */ - public static void addCandidateElements(Integer candidateStrategy, String candidateParam, FlowElement flowElement) { - addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY, - candidateStrategy == null ? null : candidateStrategy.toString()); - addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_PARAM, candidateParam); - } - - /** - * è§£æžå€™é€‰äººç­–ç•¥ - * - * @param userTask 任务节点 - * @return 候选人策略 - */ - public static Integer parseCandidateStrategy(FlowElement userTask) { - Integer candidateStrategy = NumberUtils.parseInt(userTask.getAttributeValue( - BpmnModelConstants.NAMESPACE, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY)); - // TODO @ZT å°è¯•从 ExtensionElement å–. åŽç»­ç›¸å…³æ‰©å±•是å¦éƒ½å¯ä»¥ å­˜ extensionElement。 å¦‚è¡¨å•æƒé™ã€‚ 按钮æƒé™ - if (candidateStrategy == null) { - ExtensionElement element = CollUtil.getFirst(userTask.getExtensionElements().get(BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY)); - candidateStrategy = element != null ? NumberUtils.parseInt(element.getElementText()) : null; - } - return candidateStrategy; - } - - /** - * è§£æžå€™é€‰äººå‚æ•° - * - * @param userTask 任务节点 - * @return å€™é€‰äººå‚æ•° - */ - public static String parseCandidateParam(FlowElement userTask) { - String candidateParam = userTask.getAttributeValue( - BpmnModelConstants.NAMESPACE, BpmnModelConstants.USER_TASK_CANDIDATE_PARAM); - if (candidateParam == null) { - ExtensionElement element = CollUtil.getFirst(userTask.getExtensionElements().get(BpmnModelConstants.USER_TASK_CANDIDATE_PARAM)); - candidateParam = element != null ? element.getElementText() : null; - } - return candidateParam; - } - - /** - * è§£æžå®¡æ‰¹ç±»åž‹ - * - * @see BpmUserTaskApproveTypeEnum - * @param userTask 任务节点 - * @return 审批类型 - */ - public static Integer parseApproveType(FlowElement userTask) { - return NumberUtils.parseInt(parseExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE)); - } - - /** - * è§£æžå­æµç¨‹å¤šå®žä¾‹æ¥æºç±»åž‹ - * - * @see BpmChildProcessMultiInstanceSourceTypeEnum - * @param element 任务节点 - * @return å¤šå®žä¾‹æ¥æºç±»åž‹ - */ - public static Integer parseMultiInstanceSourceType(FlowElement element) { - return NumberUtils.parseInt(parseExtensionElement(element, BpmnModelConstants.CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE)); - } - - /** - * 添加任务拒ç»å¤„ç†å…ƒç´  - * - * @param rejectHandler 任务拒ç»å¤„ç† - * @param userTask 任务节点 - */ - public static void addTaskRejectElements(BpmSimpleModelNodeVO.RejectHandler rejectHandler, UserTask userTask) { - if (rejectHandler == null) { - return; - } - addExtensionElement(userTask, USER_TASK_REJECT_HANDLER_TYPE, StrUtil.toStringOrNull(rejectHandler.getType())); - addExtensionElement(userTask, USER_TASK_REJECT_RETURN_TASK_ID, rejectHandler.getReturnNodeId()); - } - - /** - * è§£æžä»»åŠ¡æ‹’ç»å¤„ç†ç±»åž‹ - * - * @param userTask 任务节点 - * @return 任务拒ç»å¤„ç†ç±»åž‹ - */ - public static BpmUserTaskRejectHandlerTypeEnum parseRejectHandlerType(FlowElement userTask) { - Integer rejectHandlerType = NumberUtils.parseInt(parseExtensionElement(userTask, USER_TASK_REJECT_HANDLER_TYPE)); - return BpmUserTaskRejectHandlerTypeEnum.typeOf(rejectHandlerType); - } - - /** - * è§£æžä»»åŠ¡æ‹’ç»è¿”回任务节点 ID - * - * @param flowElement 任务节点 - * @return 任务拒ç»è¿”回任务节点 ID - */ - public static String parseReturnTaskId(FlowElement flowElement) { - return parseExtensionElement(flowElement, USER_TASK_REJECT_RETURN_TASK_ID); - } - - /** - * 给节点添加用户任务的审批人与å‘èµ·äººç›¸åŒæ—¶ï¼Œå¤„ç†ç±»åž‹æžšä¸¾ - * - * @see BpmUserTaskAssignStartUserHandlerTypeEnum - * @param assignStartUserHandlerType å‘起人处ç†ç±»åž‹ - * @param userTask 任务节点 - */ - public static void addAssignStartUserHandlerType(Integer assignStartUserHandlerType, UserTask userTask) { - if (assignStartUserHandlerType == null) { - return; - } - addExtensionElement(userTask, USER_TASK_ASSIGN_START_USER_HANDLER_TYPE, assignStartUserHandlerType.toString()); - } - - /** - * 给节点添加用户任务的审批人为空时,处ç†ç±»åž‹æžšä¸¾ - * - * @see BpmUserTaskAssignEmptyHandlerTypeEnum - * @param emptyHandler ç©ºå¤„ç† - * @param userTask 任务节点 - */ - public static void addAssignEmptyHandlerType(BpmSimpleModelNodeVO.AssignEmptyHandler emptyHandler, UserTask userTask) { - if (emptyHandler == null) { - return; - } - addExtensionElement(userTask, USER_TASK_ASSIGN_EMPTY_HANDLER_TYPE, StrUtil.toStringOrNull(emptyHandler.getType())); - addExtensionElement(userTask, USER_TASK_ASSIGN_USER_IDS, StrUtil.join(",", emptyHandler.getUserIds())); - } - - /** - * è§£æžç”¨æˆ·ä»»åŠ¡çš„å®¡æ‰¹äººä¸Žå‘èµ·äººç›¸åŒæ—¶ï¼Œå¤„ç†ç±»åž‹æžšä¸¾ - * - * @param userTask 任务节点 - * @return 处ç†ç±»åž‹æžšä¸¾ - */ - public static Integer parseAssignStartUserHandlerType(FlowElement userTask) { - return NumberUtils.parseInt(parseExtensionElement(userTask, USER_TASK_ASSIGN_START_USER_HANDLER_TYPE)); - } - - /** - * è§£æžç”¨æˆ·ä»»åŠ¡çš„å®¡æ‰¹äººä¸ºç©ºæ—¶ï¼Œå¤„ç†ç±»åž‹æžšä¸¾ - * - * @param userTask 任务节点 - * @return 处ç†ç±»åž‹æžšä¸¾ - */ - public static Integer parseAssignEmptyHandlerType(FlowElement userTask) { - return NumberUtils.parseInt(parseExtensionElement(userTask, USER_TASK_ASSIGN_EMPTY_HANDLER_TYPE)); - } - - /** - * è§£æžç”¨æˆ·ä»»åŠ¡çš„å®¡æ‰¹äººä¸ºç©ºæ—¶ï¼Œå¤„ç†ç”¨æˆ· ID 数组 - * - * @param userTask 任务节点 - * @return 处ç†ç”¨æˆ· ID 数组 - */ - public static List parseAssignEmptyHandlerUserIds(FlowElement userTask) { - return StrUtils.splitToLong(parseExtensionElement(userTask, USER_TASK_ASSIGN_USER_IDS), ","); - } - - /** - * 给节点添加表å•字段æƒé™å…ƒç´  - * - * @param fieldsPermissions 表å•字段æƒé™ - * @param flowElement 节点 - */ - public static void addFormFieldsPermission(List> fieldsPermissions, FlowElement flowElement) { - if (CollUtil.isNotEmpty(fieldsPermissions)) { - fieldsPermissions.forEach(item -> addExtensionElement(flowElement, FORM_FIELD_PERMISSION_ELEMENT, item)); - } - } - - /** - * è§£æžè¡¨å•字段æƒé™ - * - * @param bpmnModel bpmnModel 对象 - * @param flowElementId 元素 ID - * @return 表å•字段æƒé™ - */ - public static Map parseFormFieldsPermission(BpmnModel bpmnModel, String flowElementId) { - if (bpmnModel == null || StrUtil.isEmpty(flowElementId)) { - return null; - } - FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); - if (flowElement == null) { - return null; - } - List extensionElements = flowElement.getExtensionElements().get(FORM_FIELD_PERMISSION_ELEMENT); - if (CollUtil.isEmpty(extensionElements)) { - return null; - } - Map fieldsPermission = MapUtil.newHashMap(); - extensionElements.forEach(element -> { - String field = element.getAttributeValue(null, FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE); - String permission = element.getAttributeValue(null, FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE); - if (StrUtil.isNotEmpty(field) && StrUtil.isNotEmpty(permission)) { - fieldsPermission.put(field, permission); - } - }); - return fieldsPermission; - } - - /** - * 给节点添加æ“作按钮设置元素 - */ - public static void addButtonsSetting(List buttonsSetting, UserTask userTask) { - if (CollUtil.isNotEmpty(buttonsSetting)) { - List> list = CollectionUtils.convertList(buttonsSetting, item -> { - Map settingMap = Maps.newHashMapWithExpectedSize(3); - settingMap.put(BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE, String.valueOf(item.getId())); - settingMap.put(BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE, item.getDisplayName()); - settingMap.put(BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE, String.valueOf(item.getEnable())); - return settingMap; - }); - list.forEach(item -> addExtensionElement(userTask, BUTTON_SETTING_ELEMENT, item)); - } - } - - /** - * è§£æžæ“作按钮设置 - * - * @param bpmnModel bpmnModel 对象 - * @param flowElementId 元素 ID - * @return æ“作按钮设置 - */ - public static Map parseButtonsSetting(BpmnModel bpmnModel, String flowElementId) { - FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); - if (flowElement == null) { - return null; - } - List extensionElements = flowElement.getExtensionElements().get(BUTTON_SETTING_ELEMENT); - if (CollUtil.isEmpty(extensionElements)) { - return null; - } - Map buttonSettings = Maps.newHashMapWithExpectedSize(extensionElements.size()); - extensionElements.forEach(element -> { - String id = element.getAttributeValue(null, BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE); - String displayName = element.getAttributeValue(null, BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE); - String enable = element.getAttributeValue(null, BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE); - if (StrUtil.isNotEmpty(id)) { - BpmTaskRespVO.OperationButtonSetting setting = new BpmTaskRespVO.OperationButtonSetting(); - buttonSettings.put(Integer.valueOf(id), setting.setDisplayName(displayName).setEnable(Boolean.parseBoolean(enable))); - } - }); - return buttonSettings; - } - - /** - * è§£æžè¾¹ç•Œäº‹ä»¶æ‰©å±•元素 - * - * @param boundaryEvent 边界事件 - * @param customElement 元素 - * @return 扩展元素 - */ - public static String parseBoundaryEventExtensionElement(BoundaryEvent boundaryEvent, String customElement) { - if (boundaryEvent == null) { - return null; - } - ExtensionElement extensionElement = CollUtil.getFirst(boundaryEvent.getExtensionElements().get(customElement)); - return Optional.ofNullable(extensionElement).map(ExtensionElement::getElementText).orElse(null); - } - - public static void addSignEnable(Boolean signEnable, FlowElement userTask) { - addExtensionElement(userTask, SIGN_ENABLE, - ObjUtil.isNotNull(signEnable) ? signEnable.toString() : Boolean.FALSE.toString()); - } - - public static Boolean parseSignEnable(BpmnModel bpmnModel, String flowElementId) { - FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); - if (flowElement == null) { - return false; - } - List extensionElements = flowElement.getExtensionElements().get(SIGN_ENABLE); - if (CollUtil.isEmpty(extensionElements)) { - return false; - } - return Convert.toBool(extensionElements.get(0).getElementText(), false); - } - - public static void addReasonRequire(Boolean reasonRequire, FlowElement userTask) { - addExtensionElement(userTask, REASON_REQUIRE, - ObjUtil.isNotNull(reasonRequire) ? reasonRequire.toString() : Boolean.FALSE.toString()); - } - - public static Boolean parseReasonRequire(BpmnModel bpmnModel, String flowElementId) { - FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); - if (flowElement == null) { - return false; - } - List extensionElements = flowElement.getExtensionElements().get(REASON_REQUIRE); - if (CollUtil.isEmpty(extensionElements)) { - return false; - } - return Convert.toBool(extensionElements.get(0).getElementText(), false); - } - - public static void addListenerConfig(FlowableListener flowableListener, BpmSimpleModelNodeVO.ListenerHandler handler) { - FieldExtension fieldExtension = new FieldExtension(); - fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(handler)); - flowableListener.getFieldExtensions().add(fieldExtension); - } - - public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FixedValue fixedValue) { - String expressionText = fixedValue.getExpressionText(); - Assert.notNull(expressionText, "监å¬å™¨æ‰©å±•字段({})ä¸èƒ½ä¸ºç©º", expressionText); - return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class); - } - - public static BpmTriggerTypeEnum parserTriggerType(FlowElement flowElement) { - Integer triggerType = NumberUtils.parseInt(parseExtensionElement(flowElement, TRIGGER_TYPE)); - return BpmTriggerTypeEnum.typeOf(triggerType); - } - - public static String parserTriggerParam(FlowElement flowElement) { - return parseExtensionElement(flowElement, TRIGGER_PARAM); - } - - /** - * 给节点添加节点类型 - * - * @param nodeType 节点类型 - * @param flowElement 节点 - */ - public static void addNodeType(Integer nodeType, FlowElement flowElement) { - addExtensionElement(flowElement, BpmnModelConstants.NODE_TYPE, nodeType); - } - - /** - * è§£æžèŠ‚ç‚¹ç±»åž‹ - * - * @param flowElement 节点 - * @return 节点类型 - */ - public static Integer parseNodeType(FlowElement flowElement) { - return NumberUtils.parseInt(parseExtensionElement(flowElement, BpmnModelConstants.NODE_TYPE)); - } - - // ========== BPM ç®€å•æŸ¥æ‰¾ç›¸å…³çš„æ–¹æ³• ========== - - /** - * æ ¹æ®èŠ‚ç‚¹ï¼ŒèŽ·å–å…¥å£è¿žçº¿ - * - * @param source 起始节点 - * @return å…¥å£è¿žçº¿åˆ—表 - */ - public static List getElementIncomingFlows(FlowElement source) { - if (source instanceof FlowNode) { - return ((FlowNode) source).getIncomingFlows(); - } - return new ArrayList<>(); - } - - /** - * æ ¹æ®èŠ‚ç‚¹ï¼ŒèŽ·å–出å£è¿žçº¿ - * - * @param source 起始节点 - * @return 出å£è¿žçº¿åˆ—表 - */ - public static List getElementOutgoingFlows(FlowElement source) { - if (source instanceof FlowNode) { - return ((FlowNode) source).getOutgoingFlows(); - } - return new ArrayList<>(); - } - - /** - * èŽ·å–æµç¨‹å…ƒç´ ä¿¡æ¯ - * - * @param model bpmnModel 对象 - * @param flowElementId 元素 ID - * @return å…ƒç´ ä¿¡æ¯ - */ - public static FlowElement getFlowElementById(BpmnModel model, String flowElementId) { - Process process = model.getMainProcess(); - return process.getFlowElement(flowElementId); - } - - /** - * 获得 BPMN æµç¨‹ä¸­ï¼ŒæŒ‡å®šçš„元素们 - * - * @param model 模型 - * @param clazz 指定元素。例如说,{@link UserTask}ã€{@link Gateway} 等等 - * @return 元素们 - */ - @SuppressWarnings("unchecked") - public static List getBpmnModelElements(BpmnModel model, Class clazz) { - List result = new ArrayList<>(); - model.getProcesses().forEach(process -> process.getFlowElements().forEach(flowElement -> { - if (flowElement.getClass().isAssignableFrom(clazz)) { - result.add((T) flowElement); - } - })); - return result; - } - - public static StartEvent getStartEvent(BpmnModel model) { - Process process = model.getMainProcess(); - // 从 initialFlowElement 找 - FlowElement startElement = process.getInitialFlowElement(); - if (startElement instanceof StartEvent) { - return (StartEvent) startElement; - } - // 从 flowElementList 找 - return (StartEvent) CollUtil.findOne(process.getFlowElements(), flowElement -> flowElement instanceof StartEvent); - } - - public static EndEvent getEndEvent(BpmnModel model) { - Process process = model.getMainProcess(); - // 从 flowElementList 找 endEvent - return (EndEvent) CollUtil.findOne(process.getFlowElements(), flowElement -> flowElement instanceof EndEvent); - } - - public static BpmnModel getBpmnModel(byte[] bpmnBytes) { - if (ArrayUtil.isEmpty(bpmnBytes)) { - return null; - } - BpmnXMLConverter converter = new BpmnXMLConverter(); - // 补充说明:由于在 Flowable 中自定义了属性,所以 validateSchema 传递 false - return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), false, false); - } - - public static String getBpmnXml(BpmnModel model) { - if (model == null) { - return null; - } - BpmnXMLConverter converter = new BpmnXMLConverter(); - return StrUtil.utf8Str(converter.convertToXML(model)); - } - - public static String getBpmnXml(byte[] bpmnBytes) { - if (ArrayUtil.isEmpty(bpmnBytes)) { - return null; - } - return StrUtil.utf8Str(bpmnBytes); - } - - // ========== BPMN 夿‚é历相关的方法 ========== - - /** - * 找到 source 节点之å‰çš„æ‰€æœ‰ç”¨æˆ·ä»»åŠ¡èŠ‚ç‚¹ - * - * @param source 起始节点 - * @param hasSequenceFlow å·²ç»ç»è¿‡çš„连线的 ID,用于判断线路是å¦é‡å¤ - * @param userTaskList 已找到的用户任务节点 - * @return 用户任务节点 数组 - */ - public static List getPreviousUserTaskList(FlowElement source, Set hasSequenceFlow, List userTaskList) { - userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; - hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; - // 如果该节点为开始节点,且存在上级å­èŠ‚ç‚¹ï¼Œåˆ™é¡ºç€ä¸Šçº§å­èŠ‚ç‚¹ç»§ç»­è¿­ä»£ - if (source instanceof StartEvent && source.getSubProcess() != null) { - userTaskList = getPreviousUserTaskList(source.getSubProcess(), hasSequenceFlow, userTaskList); - } - - // æ ¹æ®ç±»åž‹ï¼ŒèŽ·å–å…¥å£è¿žçº¿ - List sequenceFlows = getElementIncomingFlows(source); - if (sequenceFlows == null) { - return userTaskList; - } - // 循环找到目标元素 - for (SequenceFlow sequenceFlow : sequenceFlows) { - // 如果å‘现连线é‡å¤ï¼Œè¯´æ˜Žå¾ªçŽ¯äº†ï¼Œè·³è¿‡è¿™ä¸ªå¾ªçŽ¯ - if (hasSequenceFlow.contains(sequenceFlow.getId())) { - continue; - } - // 添加已ç»èµ°è¿‡çš„连线 - hasSequenceFlow.add(sequenceFlow.getId()); - // 类型为用户节点,则新增父级节点 - if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { - userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); - } - // ç±»åž‹ä¸ºå­æµç¨‹ï¼Œåˆ™æ·»åŠ å­æµç¨‹å¼€å§‹èŠ‚ç‚¹å‡ºå£å¤„相连的节点 - if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { - // 获å–å­æµç¨‹ç”¨æˆ·ä»»åŠ¡èŠ‚ç‚¹ - List childUserTaskList = findChildProcessUserTaskList((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null); - // 如果找到节点,则说明该线路找到节点,ä¸ç»§ç»­å‘下找,å之继续 - if (CollUtil.isNotEmpty(childUserTaskList)) { - userTaskList.addAll(childUserTaskList); - } - } - // 继续迭代 - userTaskList = getPreviousUserTaskList(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList); - } - return userTaskList; - } - - /** - * 迭代获å–å­æµç¨‹ç”¨æˆ·ä»»åŠ¡èŠ‚ç‚¹ - * - * @param source 起始节点 - * @param hasSequenceFlow å·²ç»ç»è¿‡çš„连线的 ID,用于判断线路是å¦é‡å¤ - * @param userTaskList éœ€è¦æ’¤å›žçš„用户任务列表 - * @return 用户任务节点 - */ - public static List findChildProcessUserTaskList(FlowElement source, Set hasSequenceFlow, List userTaskList) { - hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; - userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; - - // æ ¹æ®ç±»åž‹ï¼ŒèŽ·å–出å£è¿žçº¿ - List sequenceFlows = getElementOutgoingFlows(source); - if (sequenceFlows == null) { - return userTaskList; - } - // 循环找到目标元素 - for (SequenceFlow sequenceFlow : sequenceFlows) { - // 如果å‘现连线é‡å¤ï¼Œè¯´æ˜Žå¾ªçŽ¯äº†ï¼Œè·³è¿‡è¿™ä¸ªå¾ªçŽ¯ - if (hasSequenceFlow.contains(sequenceFlow.getId())) { - continue; - } - // 添加已ç»èµ°è¿‡çš„连线 - hasSequenceFlow.add(sequenceFlow.getId()); - // 如果为用户任务类型,且任务节点的 Key 正在è¿è¡Œçš„任务中存在,添加 - if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { - userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); - continue; - } - // å¦‚æžœèŠ‚ç‚¹ä¸ºå­æµç¨‹èŠ‚ç‚¹æƒ…å†µï¼Œåˆ™ä»ŽèŠ‚ç‚¹ä¸­çš„ç¬¬ä¸€ä¸ªèŠ‚ç‚¹å¼€å§‹èŽ·å– - if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { - List childUserTaskList = findChildProcessUserTaskList((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null); - // 如果找到节点,则说明该线路找到节点,ä¸ç»§ç»­å‘下找,å之继续 - if (CollUtil.isNotEmpty(childUserTaskList)) { - userTaskList.addAll(childUserTaskList); - continue; - } - } - // 继续迭代 - userTaskList = findChildProcessUserTaskList(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList); - } - return userTaskList; - } - - /** - * 迭代从åŽå‘剿‰«æï¼Œåˆ¤æ–­ç›®æ ‡èŠ‚ç‚¹ç›¸å¯¹äºŽå½“å‰èŠ‚ç‚¹æ˜¯å¦æ˜¯ä¸²è¡Œ - * ä¸å­˜åœ¨ç›´æŽ¥é€€å›žåˆ°å­æµç¨‹ä¸­çš„æƒ…å†µï¼Œä½†å­˜åœ¨ä»Žå­æµç¨‹å‡ºåŽ»åˆ°çˆ¶æµç¨‹æƒ…况 - * - * @param source 起始节点 - * @param target 目标节点 - * @param visitedElements å·²ç»ç»è¿‡çš„连线的 ID,用于判断线路是å¦é‡å¤ - * @return 结果 - */ - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - public static boolean isSequentialReachable(FlowElement source, FlowElement target, Set visitedElements) { - visitedElements = visitedElements == null ? new HashSet<>() : visitedElements; - // ä¸èƒ½æ˜¯å¼€å§‹äº‹ä»¶å’Œå­æµç¨‹ - if (source instanceof StartEvent && isInEventSubprocess(source)) { - return false; - } - - // æ ¹æ®ç±»åž‹ï¼ŒèŽ·å–å…¥å£è¿žçº¿ - List sequenceFlows = getElementIncomingFlows(source); - if (CollUtil.isEmpty(sequenceFlows)) { - return true; - } - // 循环找到目标元素 - for (SequenceFlow sequenceFlow : sequenceFlows) { - // 如果å‘现连线é‡å¤ï¼Œè¯´æ˜Žå¾ªçŽ¯äº†ï¼Œè·³è¿‡è¿™ä¸ªå¾ªçŽ¯ - if (visitedElements.contains(sequenceFlow.getId())) { - continue; - } - // 添加已ç»èµ°è¿‡çš„连线 - visitedElements.add(sequenceFlow.getId()); - // è¿™æ¡çº¿è·¯å­˜åœ¨ç›®æ ‡èŠ‚ç‚¹ï¼Œè¿™æ¡çº¿è·¯å®Œæˆï¼Œè¿›å…¥ä¸‹ä¸ªçº¿è·¯ - FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement(); - if (target.getId().equals(sourceFlowElement.getId())) { - continue; - } - // 如果目标节点为并行网关,则ä¸ç»§ç»­ - if (sourceFlowElement instanceof ParallelGateway) { - return false; - } - // å¦åˆ™å°±ç»§ç»­è¿­ä»£ - if (!isSequentialReachable(sourceFlowElement, target, visitedElements)) { - return false; - } - } - return true; - } - - /** - * 判断当å‰èŠ‚ç‚¹æ˜¯å¦å±žäºŽä¸åŒçš„å­æµç¨‹ - * - * @param flowElement 被判断的节点 - * @return true è¡¨ç¤ºå±žäºŽå­æµç¨‹ - */ - private static boolean isInEventSubprocess(FlowElement flowElement) { - FlowElementsContainer flowElementsContainer = flowElement.getParentContainer(); - while (flowElementsContainer != null) { - if (flowElementsContainer instanceof EventSubProcess) { - return true; - } - - if (flowElementsContainer instanceof FlowElement) { - flowElementsContainer = ((FlowElement) flowElementsContainer).getParentContainer(); - } else { - flowElementsContainer = null; - } - } - return false; - } - - /** - * æ ¹æ®æ­£åœ¨è¿è¡Œçš„任务节点,迭代获å–å­çº§ä»»åŠ¡èŠ‚ç‚¹åˆ—è¡¨ï¼Œå‘åŽæ‰¾ - * - * @param source 起始节点 - * @param runTaskKeyList 正在è¿è¡Œçš„任务 Keyï¼Œç”¨äºŽæ ¡éªŒä»»åŠ¡èŠ‚ç‚¹æ˜¯å¦æ˜¯æ­£åœ¨è¿è¡Œçš„节点 - * @param hasSequenceFlow å·²ç»ç»è¿‡çš„连线的 ID,用于判断线路是å¦é‡å¤ - * @param userTaskList éœ€è¦æ’¤å›žçš„用户任务列表 - * @return å­çº§ä»»åŠ¡èŠ‚ç‚¹åˆ—è¡¨ - */ - public static List iteratorFindChildUserTasks(FlowElement source, List runTaskKeyList, - Set hasSequenceFlow, List userTaskList) { - hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; - userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; - // 如果该节点为开始节点,且存在上级å­èŠ‚ç‚¹ï¼Œåˆ™é¡ºç€ä¸Šçº§å­èŠ‚ç‚¹ç»§ç»­è¿­ä»£ - if (source instanceof StartEvent && source.getSubProcess() != null) { - userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList); - } - - // æ ¹æ®ç±»åž‹ï¼ŒèŽ·å–出å£è¿žçº¿ - List sequenceFlows = getElementOutgoingFlows(source); - if (sequenceFlows == null) { - return userTaskList; - } - // 循环找到目标元素 - for (SequenceFlow sequenceFlow : sequenceFlows) { - // 如果å‘现连线é‡å¤ï¼Œè¯´æ˜Žå¾ªçŽ¯äº†ï¼Œè·³è¿‡è¿™ä¸ªå¾ªçŽ¯ - if (hasSequenceFlow.contains(sequenceFlow.getId())) { - continue; - } - // 添加已ç»èµ°è¿‡çš„连线 - hasSequenceFlow.add(sequenceFlow.getId()); - // 如果为用户任务类型,且任务节点的 Key 正在è¿è¡Œçš„任务中存在,添加 - if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) { - userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); - continue; - } - // å¦‚æžœèŠ‚ç‚¹ä¸ºå­æµç¨‹èŠ‚ç‚¹æƒ…å†µï¼Œåˆ™ä»ŽèŠ‚ç‚¹ä¸­çš„ç¬¬ä¸€ä¸ªèŠ‚ç‚¹å¼€å§‹èŽ·å– - if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { - List childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null); - // 如果找到节点,则说明该线路找到节点,ä¸ç»§ç»­å‘下找,å之继续 - if (CollUtil.isNotEmpty(childUserTaskList)) { - userTaskList.addAll(childUserTaskList); - continue; - } - } - // 继续迭代 - userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList); - } - return userTaskList; - } - - // ========== BPMN æµç¨‹é¢„测相关的方法 ========== - - /** - * æµç¨‹é¢„测,返回 StartEventã€UserTaskã€ServiceTaskã€EndEvent 节点元素,最终是 List 串行结果 - * - * @param bpmnModel BPMN 图 - * @param variables å˜é‡ - * @return 节点元素数组 - */ - public static List simulateProcess(BpmnModel bpmnModel, Map variables) { - List resultElements = new ArrayList<>(); - Set visitElements = new HashSet<>(); - - // 从 StartEvent 开始é历 - StartEvent startEvent = getStartEvent(bpmnModel); - simulateNextFlowElements(startEvent, variables, resultElements, visitElements); - - // å°† EndEvent 放在末尾。原因是,DFS é历,å¯èƒ½ EndEvent 在 resultElements 中 - List endEvents = CollUtil.removeWithAddIf(resultElements, - flowElement -> flowElement instanceof EndEvent); - resultElements.addAll(endEvents); - return resultElements; - } - - @SuppressWarnings("PatternVariableCanBeUsed") - private static void simulateNextFlowElements(FlowElement currentElement, Map variables, - List resultElements, Set visitElements) { - // 如果为空,或者已ç»éåŽ†è¿‡ï¼Œåˆ™ç›´æŽ¥ç»“æŸ - if (currentElement == null) { - return; - } - if (visitElements.contains(currentElement)) { - return; - } - visitElements.add(currentElement); - - // 情况:StartEvent/EndEvent/UserTask/ServiceTask - if (currentElement instanceof StartEvent - || currentElement instanceof EndEvent - || currentElement instanceof UserTask - || currentElement instanceof ServiceTask) { - // 添加元素 - FlowNode flowNode = (FlowNode) currentElement; - resultElements.add(flowNode); - // é历å­èŠ‚ç‚¹ - flowNode.getOutgoingFlows().forEach( - nextElement -> simulateNextFlowElements(nextElement.getTargetFlowElement(), variables, resultElements, visitElements)); - return; - } - - // 情况:ExclusiveGateway æŽ’å®ƒï¼Œåªæœ‰ä¸€ä¸ªæ»¡è¶³æ¡ä»¶çš„。如果没有,就走默认的 - if (currentElement instanceof ExclusiveGateway) { - // 查找满足æ¡ä»¶çš„ SequenceFlow 路径 - SequenceFlow matchSequenceFlow = findMatchSequenceFlowByExclusiveGateway((Gateway) currentElement, variables); - // é历满足æ¡ä»¶çš„ SequenceFlow 路径 - if (matchSequenceFlow != null) { - simulateNextFlowElements(matchSequenceFlow.getTargetFlowElement(), variables, resultElements, visitElements); - } - } - // 情况:InclusiveGateway 包容,多个满足æ¡ä»¶çš„。如果没有,就走默认的 - else if (currentElement instanceof InclusiveGateway) { - // 查找满足æ¡ä»¶çš„ SequenceFlow 路径 - Collection matchSequenceFlows = findMatchSequenceFlowsByInclusiveGateway((Gateway) currentElement, variables); - // é历满足æ¡ä»¶çš„ SequenceFlow 路径 - matchSequenceFlows.forEach( - flow -> simulateNextFlowElements(flow.getTargetFlowElement(), variables, resultElements, visitElements)); - } - // 情况:ParallelGateway 并行,都满足,都走 - else if (currentElement instanceof ParallelGateway) { - Gateway gateway = (Gateway) currentElement; - // é历å­èŠ‚ç‚¹ - gateway.getOutgoingFlows().forEach( - nextElement -> simulateNextFlowElements(nextElement.getTargetFlowElement(), variables, resultElements, visitElements)); - } - } - - /** - * æ ¹æ®å½“å‰èŠ‚ç‚¹ï¼ŒèŽ·å–下一个节点 - * - * @param currentElement 当å‰èŠ‚ç‚¹ - * @param bpmnModel BPMN模型 - * @param variables æµç¨‹å˜é‡ - */ - @SuppressWarnings("PatternVariableCanBeUsed") - public static List getNextFlowNodes(FlowElement currentElement, BpmnModel bpmnModel, - Map variables){ - List nextFlowNodes = new ArrayList<>(); // 下一个执行的æµç¨‹èŠ‚ç‚¹é›†åˆ - FlowNode currentNode = (FlowNode) currentElement; // 当剿‰§è¡ŒèŠ‚ç‚¹çš„åŸºæœ¬å±žæ€§ - List outgoingFlows = currentNode.getOutgoingFlows(); // 当å‰èŠ‚ç‚¹çš„å…³è”节点 - if (CollUtil.isEmpty(outgoingFlows)) { - log.warn("[getNextFlowNodes][当å‰èŠ‚ç‚¹({}) çš„ outgoingFlows 为空]", currentNode.getId()); - return nextFlowNodes; - } - - // é历æ¯ä¸ªå‡ºå£æµ - for (SequenceFlow outgoingFlow : outgoingFlows) { - // 获å–目标节点的基本属性 - FlowElement targetElement = bpmnModel.getFlowElement(outgoingFlow.getTargetRef()); - if (targetElement == null) { - continue; - } - // 如果是结æŸèŠ‚ç‚¹ï¼Œç›´æŽ¥è¿”å›ž - if (targetElement instanceof EndEvent) { - break; - } - // 情况一:处ç†ä¸åŒç±»åž‹çš„网关 - if (targetElement instanceof Gateway) { - Gateway gateway = (Gateway) targetElement; - if (gateway instanceof ExclusiveGateway) { - handleExclusiveGateway(gateway, bpmnModel, variables, nextFlowNodes); - } else if (gateway instanceof InclusiveGateway) { - handleInclusiveGateway(gateway, bpmnModel, variables, nextFlowNodes); - } else if (gateway instanceof ParallelGateway) { - handleParallelGateway(gateway, bpmnModel, variables, nextFlowNodes); - } - } else { - // æƒ…å†µäºŒï¼šå¦‚æžœä¸æ˜¯ç½‘关,直接添加到下一个节点列表 - nextFlowNodes.add((FlowNode) targetElement); - } - } - return nextFlowNodes; - } - - /** - * å¤„ç†æŽ’å®ƒç½‘å…³ - * - * @param gateway 排他网关 - * @param bpmnModel BPMN模型 - * @param variables æµç¨‹å˜é‡ - * @param nextFlowNodes 下一个执行的æµç¨‹èŠ‚ç‚¹é›†åˆ - */ - private static void handleExclusiveGateway(Gateway gateway, BpmnModel bpmnModel, - Map variables, List nextFlowNodes) { - // 查找满足æ¡ä»¶çš„ SequenceFlow 路径 - SequenceFlow matchSequenceFlow = findMatchSequenceFlowByExclusiveGateway(gateway, variables); - // é历满足æ¡ä»¶çš„ SequenceFlow 路径 - if (matchSequenceFlow != null) { - FlowElement targetElement = bpmnModel.getFlowElement(matchSequenceFlow.getTargetRef()); - if (targetElement instanceof FlowNode) { - nextFlowNodes.add((FlowNode) targetElement); - } - } - } - - /** - * å¤„ç†æŽ’å®ƒç½‘å…³ï¼ˆExclusive Gatewayï¼‰ï¼Œé€‰æ‹©ç¬¦åˆæ¡ä»¶çš„路径 - * - * @param gateway 排他网关 - * @param variables æµç¨‹å˜é‡ - * @return ç¬¦åˆæ¡ä»¶çš„路径 - */ - private static SequenceFlow findMatchSequenceFlowByExclusiveGateway(Gateway gateway, Map variables) { - SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), - flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) - && (evalConditionExpress(variables, flow.getConditionExpression()))); - if (matchSequenceFlow == null) { - matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), - flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId())); - // ç‰¹æ®Šï¼šæ²¡æœ‰é»˜è®¤çš„æƒ…å†µä¸‹ï¼Œå¹¶ä¸”åªæœ‰ 1 个æ¡ä»¶ï¼Œåˆ™è®¤ä¸ºå®ƒæ˜¯é»˜è®¤çš„ - if (matchSequenceFlow == null && gateway.getOutgoingFlows().size() == 1) { - matchSequenceFlow = gateway.getOutgoingFlows().get(0); - } - } - return matchSequenceFlow; - } - - /** - * 处ç†åŒ…容网关 - * - * @param gateway 排他网关 - * @param bpmnModel BPMN模型 - * @param variables æµç¨‹å˜é‡ - * @param nextFlowNodes 下一个执行的æµç¨‹èŠ‚ç‚¹é›†åˆ - */ - private static void handleInclusiveGateway(Gateway gateway, BpmnModel bpmnModel, - Map variables, List nextFlowNodes) { - // 查找满足æ¡ä»¶çš„ SequenceFlow è·¯å¾„é›†åˆ - Collection matchSequenceFlows = findMatchSequenceFlowsByInclusiveGateway(gateway, variables); - // é历满足æ¡ä»¶çš„ SequenceFlow 路径,获å–目标节点 - matchSequenceFlows.forEach(flow -> { - FlowElement targetElement = bpmnModel.getFlowElement(flow.getTargetRef()); - if (targetElement instanceof FlowNode) { - nextFlowNodes.add((FlowNode) targetElement); - } - }); - } - - /** - * å¤„ç†æŽ’å®ƒç½‘å…³ï¼ˆInclusive Gatewayï¼‰ï¼Œé€‰æ‹©ç¬¦åˆæ¡ä»¶çš„路径 - * - * @param gateway 排他网关 - * @param variables æµç¨‹å˜é‡ - * @return ç¬¦åˆæ¡ä»¶çš„路径 - */ - private static Collection findMatchSequenceFlowsByInclusiveGateway(Gateway gateway, Map variables) { - // 查找满足æ¡ä»¶çš„ SequenceFlow 路径 - Collection matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(), - flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) - && evalConditionExpress(variables, flow.getConditionExpression())); - if (CollUtil.isEmpty(matchSequenceFlows)) { - matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(), - flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId())); - // ç‰¹æ®Šï¼šæ²¡æœ‰é»˜è®¤çš„æƒ…å†µä¸‹ï¼Œå¹¶ä¸”åªæœ‰ 1 个æ¡ä»¶ï¼Œåˆ™è®¤ä¸ºå®ƒæ˜¯é»˜è®¤çš„ - if (CollUtil.isEmpty(matchSequenceFlows) && gateway.getOutgoingFlows().size() == 1) { - matchSequenceFlows = gateway.getOutgoingFlows(); - } - } - return matchSequenceFlows; - } - - - /** - * 处ç†å¹¶è¡Œç½‘å…³ - * - * @param gateway 排他网关 - * @param bpmnModel BPMN模型 - * @param variables æµç¨‹å˜é‡ - * @param nextFlowNodes 下一个执行的æµç¨‹èŠ‚ç‚¹é›†åˆ - */ - private static void handleParallelGateway(Gateway gateway, BpmnModel bpmnModel, - Map variables, List nextFlowNodes) { - // 并行网关,é历所有出å£è·¯å¾„,获å–目标节点 - gateway.getOutgoingFlows().forEach(flow -> { - FlowElement targetElement = bpmnModel.getFlowElement(flow.getTargetRef()); - if (targetElement instanceof FlowNode) { - nextFlowNodes.add((FlowNode) targetElement); - } - }); - } - - /** - * 计算æ¡ä»¶è¡¨è¾¾å¼æ˜¯å¦ä¸º true 满足æ¡ä»¶ - * - * @param variables æµç¨‹å®žä¾‹ - * @param expression æ¡ä»¶è¡¨è¾¾å¼ - * @return æ˜¯å¦æ»¡è¶³æ¡ä»¶ - */ - public static boolean evalConditionExpress(Map variables, String expression) { - if (expression == null) { - return Boolean.FALSE; - } - // 如果 variables 为空,则创建一个的原因?å¯èƒ½ expression 的计算,ä¸ä¾èµ–于 variables - if (variables == null) { - variables = new HashMap<>(); - } - - // 执行计算 - try { - Object result = FlowableUtils.getExpressionValue(variables, expression); - return Boolean.TRUE.equals(result); - } catch (FlowableException ex) { - // 为什么使用 info 日志?原因是,expression 如果从 variables å–ä¸åˆ°å€¼ï¼Œä¼šæŠ¥é”™ã€‚å®žé™…è¿™ç§æƒ…况下,å¯ä»¥å¿½ç•¥ - log.info("[evalConditionExpress][æ¡ä»¶è¡¨è¾¾å¼({}) å˜é‡({}) è§£æžæŠ¥é”™]", expression, variables, ex); - return Boolean.FALSE; - } - } - - @SuppressWarnings("PatternVariableCanBeUsed") - public static boolean isSequentialUserTask(FlowElement flowElement) { - if (!(flowElement instanceof UserTask)) { - return false; - } - UserTask userTask = (UserTask) flowElement; - MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics(); - return loopCharacteristics != null && loopCharacteristics.isSequential(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/FlowableUtils.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/FlowableUtils.java deleted file mode 100644 index 7d54ce5..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ /dev/null @@ -1,362 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.util; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.zt.plat.framework.common.core.KeyValue; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.tenant.core.context.TenantContextHolder; -import com.zt.plat.framework.tenant.core.util.TenantUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; -import lombok.SneakyThrows; -import org.flowable.common.engine.api.delegate.Expression; -import org.flowable.common.engine.api.variable.VariableContainer; -import org.flowable.common.engine.impl.el.ExpressionManager; -import org.flowable.common.engine.impl.identity.Authentication; -import org.flowable.common.engine.impl.variable.MapDelegateVariableContainer; -import org.flowable.engine.ManagementService; -import org.flowable.engine.ProcessEngineConfiguration; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.TaskInfo; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.Callable; -import java.util.stream.Collectors; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -/** - * Flowable 相关的工具方法 - * - * @author ZT - */ -public class FlowableUtils { - - // ========== User 相关的工具方法 ========== - - public static void setAuthenticatedUserId(Long userId) { - Authentication.setAuthenticatedUserId(String.valueOf(userId)); - } - - public static void clearAuthenticatedUserId() { - Authentication.setAuthenticatedUserId(null); - } - - public static V executeAuthenticatedUserId(Long userId, Callable callable) { - setAuthenticatedUserId(userId); - try { - return callable.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } finally { - clearAuthenticatedUserId(); - } - } - - public static String getTenantId() { - Long tenantId = TenantContextHolder.getTenantId(); - return tenantId != null ? String.valueOf(tenantId) : ProcessEngineConfiguration.NO_TENANT_ID; - } - - public static void execute(String tenantIdStr, Runnable runnable) { - if (ObjectUtil.isEmpty(tenantIdStr) - || Objects.equals(tenantIdStr, ProcessEngineConfiguration.NO_TENANT_ID)) { - runnable.run(); - } else { - Long tenantId = Long.valueOf(tenantIdStr); - TenantUtils.execute(tenantId, runnable); - } - } - - @SneakyThrows - public static V execute(String tenantIdStr, Callable callable) { - if (ObjectUtil.isEmpty(tenantIdStr) - || Objects.equals(tenantIdStr, ProcessEngineConfiguration.NO_TENANT_ID)) { - return callable.call(); - } else { - Long tenantId = Long.valueOf(tenantIdStr); - return TenantUtils.execute(tenantId, callable); - } - } - - // ========== Execution 相关的工具方法 ========== - - /** - * æ ¼å¼åŒ–å¤šå®žä¾‹ï¼ˆå¹¶ç­¾ã€æˆ–签)的 collectionVariable å˜é‡ï¼ˆå¤šå®žä¾‹å¯¹åº”的多审批人列表) - * - * @param activityId æ´»åŠ¨ç¼–å· - * @return collectionVariable å˜é‡ - */ - public static String formatExecutionCollectionVariable(String activityId) { - return activityId + "_assignees"; - } - - /** - * æ ¼å¼åŒ–å¤šå®žä¾‹ï¼ˆå¹¶ç­¾ã€æˆ–签)的 collectionElementVariable å˜é‡ï¼ˆå½“å‰å®žä¾‹å¯¹åº”的一个审批人) - * - * @param activityId æ´»åŠ¨ç¼–å· - * @return collectionElementVariable å˜é‡ - */ - public static String formatExecutionCollectionElementVariable(String activityId) { - return activityId + "_assignee"; - } - - // ========== ProcessInstance 相关的工具方法 ========== - - public static Integer getProcessInstanceStatus(ProcessInstance processInstance) { - return getProcessInstanceStatus(processInstance.getProcessVariables()); - } - - public static Integer getProcessInstanceStatus(HistoricProcessInstance processInstance) { - return getProcessInstanceStatus(processInstance.getProcessVariables()); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„çŠ¶æ€ - * - * @param processVariables æµç¨‹å®žä¾‹çš„ variables - * @return çŠ¶æ€ - */ - private static Integer getProcessInstanceStatus(Map processVariables) { - return (Integer) processVariables.get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„审批原因 - * - * @param processInstance æµç¨‹å®žä¾‹ - * @return 审批原因 - */ - public static String getProcessInstanceReason(HistoricProcessInstance processInstance) { - return (String) processInstance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„è¡¨å• - * - * @param processInstance æµç¨‹å®žä¾‹ - * @return è¡¨å• - */ - public static Map getProcessInstanceFormVariable(ProcessInstance processInstance) { - Map processVariables = new HashMap<>(processInstance.getProcessVariables()); - return filterProcessInstanceFormVariable(processVariables); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„è¡¨å• - * - * @param processInstance æµç¨‹å®žä¾‹ - * @return è¡¨å• - */ - public static Map getProcessInstanceFormVariable(HistoricProcessInstance processInstance) { - Map processVariables = new HashMap<>(processInstance.getProcessVariables()); - return filterProcessInstanceFormVariable(processVariables); - } - - /** - * 过滤æµç¨‹å®žä¾‹çš„è¡¨å• - * - * 为什么è¦è¿‡æ»¤ï¼Ÿç›®å‰ä½¿ç”¨ processVariables 存储所有æµç¨‹å®žä¾‹çš„æ‹“展字段,需è¦è¿‡æ»¤æŽ‰ä¸€éƒ¨åˆ†çš„系统字段,从而实现表å•的展示 - * - * @param processVariables æµç¨‹å®žä¾‹çš„ variables - * @return 过滤åŽçš„è¡¨å• - */ - public static Map filterProcessInstanceFormVariable(Map processVariables) { - processVariables.remove(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - return processVariables; - } - - /** - * 获得æµç¨‹å®žä¾‹çš„å‘起用户选择的审批人 Map - * - * @param processInstance æµç¨‹å®žä¾‹ - * @return å‘起用户选择的审批人 Map - */ - public static Map> getStartUserSelectAssignees(ProcessInstance processInstance) { - return processInstance != null ? getStartUserSelectAssignees(processInstance.getProcessVariables()) : null; - } - - /** - * 获得æµç¨‹å®žä¾‹çš„å‘起用户选择的审批人 Map - * - * @param processVariables æµç¨‹å˜é‡ - * @return å‘起用户选择的审批人 Map - */ - @SuppressWarnings("unchecked") - public static Map> getStartUserSelectAssignees(Map processVariables) { - if (processVariables == null) { - return new HashMap<>(); - } - return (Map>) processVariables.get( - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„审批用户选择的下一个节点的审批人 Map - * - * @param processInstance æµç¨‹å®žä¾‹ - * @return 审批用户选择的下一个节点的审批人Map - */ - public static Map> getApproveUserSelectAssignees(ProcessInstance processInstance) { - return processInstance != null ? getApproveUserSelectAssignees(processInstance.getProcessVariables()) : null; - } - - /** - * 获得æµç¨‹å®žä¾‹çš„审批用户选择的下一个节点的审批人 Map - * - * @param processVariables æµç¨‹å˜é‡ - * @return 审批用户选择的下一个节点的审批人Map Map - */ - @SuppressWarnings("unchecked") - public static Map> getApproveUserSelectAssignees(Map processVariables) { - if (processVariables == null) { - return new HashMap<>(); - } - return (Map>) processVariables.get( - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„æ‘˜è¦ - * - * 仅有 {@link BpmModelFormTypeEnum#getType()} 表å•ï¼Œæ‰æœ‰æ‘˜è¦ã€‚ - * åŽŸå› æ˜¯ï¼Œåªæœ‰å®ƒæ‰æœ‰è¡¨å•项的é…置,从而å¯ä»¥æ ¹æ®é…置,展示摘è¦ã€‚ - * - * @param processDefinitionInfo æµç¨‹å®šä¹‰ - * @param processVariables æµç¨‹å®žä¾‹çš„ variables - * @return æ‘˜è¦ - */ - public static List> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, - Map processVariables) { - // åªæœ‰æµç¨‹è¡¨å•æ‰ä¼šæ˜¾ç¤ºæ‘˜è¦ï¼ - if (ObjectUtil.isNull(processDefinitionInfo) - || !BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { - return null; - } - - // è§£æžè¡¨å•é…ç½® - Map formFieldsMap = new HashMap<>(); - processDefinitionInfo.getFormFields().forEach(formFieldStr -> { - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); - if (formField != null) { - formFieldsMap.put(formField.getField(), formField); - } - }); - - // æƒ…å†µä¸€ï¼šå½“è‡ªå®šä¹‰äº†æ‘˜è¦ - if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) - && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { - return convertList(processDefinitionInfo.getSummarySetting().getSummary(), item -> { - BpmFormFieldVO formField = formFieldsMap.get(item); - if (formField != null) { - return new KeyValue(formField.getTitle(), - processVariables.getOrDefault(item, "").toString()); - } - return null; - }); - } - - // 情况二:默认摘è¦å±•示å‰ä¸‰ä¸ªè¡¨å•字段 - return formFieldsMap.entrySet().stream() - .limit(3) - .map(entry -> new KeyValue<>(entry.getValue().getTitle(), - MapUtil.getStr(processVariables, entry.getValue().getField(), ""))) - .collect(Collectors.toList()); - } - - // ========== Task 相关的工具方法 ========== - - /** - * èŽ·å¾—ä»»åŠ¡çš„çŠ¶æ€ - * - * @param task 任务 - * @return çŠ¶æ€ - */ - public static Integer getTaskStatus(TaskInfo task) { - return (Integer) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_STATUS); - } - - /** - * 获得任务的审批原因 - * - * @param task 任务 - * @return 审批原因 - */ - public static String getTaskReason(TaskInfo task) { - return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON); - } - - /** - * 获得任务的签å图片 URL - * - * @param task 任务 - * @return ç­¾å图片 URL - */ - public static String getTaskSignPicUrl(TaskInfo task) { - return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_SIGN_PIC_URL); - } - - /** - * èŽ·å¾—ä»»åŠ¡çš„è¡¨å• - * - * @param task 任务 - * @return è¡¨å• - */ - public static Map getTaskFormVariable(TaskInfo task) { - Map formVariables = new HashMap<>(task.getTaskLocalVariables()); - filterTaskFormVariable(formVariables); - return formVariables; - } - - /** - * è¿‡æ»¤ä»»åŠ¡çš„è¡¨å• - * - * 为什么è¦è¿‡æ»¤ï¼Ÿç›®å‰ä½¿ç”¨ taskLocalVariables 存储所有任务的拓展字段,需è¦è¿‡æ»¤æŽ‰ä¸€éƒ¨åˆ†çš„系统字段,从而实现表å•的展示 - * - * @param taskLocalVariables 任务的 taskLocalVariables - * @return 过滤åŽçš„è¡¨å• - */ - public static Map filterTaskFormVariable(Map taskLocalVariables) { - taskLocalVariables.remove(BpmnVariableConstants.TASK_VARIABLE_STATUS); - taskLocalVariables.remove(BpmnVariableConstants.TASK_VARIABLE_REASON); - return taskLocalVariables; - } - - // ========== Expression 相关的工具方法 ========== - - private static Object getExpressionValue(VariableContainer variableContainer, String expressionString, - ProcessEngineConfigurationImpl processEngineConfiguration) { - assert processEngineConfiguration != null; - ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager(); - assert expressionManager != null; - Expression expression = expressionManager.createExpression(expressionString); - return expression.getValue(variableContainer); - } - - public static Object getExpressionValue(VariableContainer variableContainer, String expressionString) { - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); - if (processEngineConfiguration != null) { - return getExpressionValue(variableContainer, expressionString, processEngineConfiguration); - } - // 如果 ProcessEngineConfigurationImpl 获å–ä¸åˆ°ï¼Œåˆ™éœ€è¦é€šè¿‡ ManagementService æ¥èŽ·å– - ManagementService managementService = SpringUtil.getBean(ManagementService.class); - assert managementService != null; - return managementService.executeCommand(context -> - getExpressionValue(variableContainer, expressionString, CommandContextUtil.getProcessEngineConfiguration())); - } - - public static Object getExpressionValue(Map variable, String expressionString) { - VariableContainer variableContainer = new MapDelegateVariableContainer(variable, VariableContainer.empty()); - return getExpressionValue(variableContainer, expressionString); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/SimpleModelUtils.java deleted file mode 100644 index cb03e01..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ /dev/null @@ -1,1007 +0,0 @@ -package com.zt.plat.module.bpm.framework.flowable.core.util; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.*; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; -import com.zt.plat.module.bpm.enums.definition.*; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; -import com.zt.plat.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate; -import com.zt.plat.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate; -import com.zt.plat.module.bpm.service.task.listener.BpmCallActivityListener; -import com.zt.plat.module.bpm.service.task.listener.BpmUserTaskListener; -import org.flowable.bpmn.BpmnAutoLayout; -import org.flowable.bpmn.constants.BpmnXMLConstants; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.*; -import org.flowable.engine.delegate.ExecutionListener; -import org.flowable.engine.delegate.TaskListener; - -import java.util.*; - -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*; -import static com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; -import static java.util.Arrays.asList; - -/** - * 仿钉钉/飞书的模型相关的工具方法 - *

- * 1. 核心的逻辑实现,å¯è§ {@link #buildBpmnModel(String, String, BpmSimpleModelNodeVO)} 方法 - * 2. 所有的 BpmSimpleModelNodeVO è½¬æ¢æˆ BPMN FlowNode 元素,å¯è§ {@link NodeConvert} 实现类 - * - * @author jason - */ -public class SimpleModelUtils { - - private static final Map NODE_CONVERTS = MapUtil.newHashMap(); - - static { - List converts = asList(new StartNodeConvert(), new EndNodeConvert(), - new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new TransactorNodeConvert(), - new DelayTimerNodeConvert(), new TriggerNodeConvert(), - new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert(), - new ChildProcessConvert()); - converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); - } - - /** - * 仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹æ•°æ®ç»“构(jsonï¼‰è½¬æ¢æˆ Bpmn Model - *

- * 整体逻辑如下: - * 1. 创建:BpmnModelã€Process 对象 - * 2. 转æ¢ï¼šå°† BpmSimpleModelNodeVO è½¬æ¢æˆ BPMN FlowNode 元素 - * 3. 连接:构建并添加节点之间的连线 Sequence Flow - * - * @param processId æµç¨‹æ ‡è¯† - * @param processName æµç¨‹åç§° - * @param simpleModelNode 仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹æ•°æ®ç»“æž„ - * @return Bpmn Model - */ - public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) { - // 1. 创建 BpmnModel - BpmnModel bpmnModel = new BpmnModel(); - bpmnModel.setTargetNamespace(BpmnXMLConstants.BPMN2_NAMESPACE); // 设置命å空间。ä¸åŠ è¿™ä¸ªï¼Œè§£æž Message 会报 NPE 异常 - // 创建 Process 对象 - Process process = new Process(); - process.setId(processId); - process.setName(processName); - process.setExecutable(Boolean.TRUE); - bpmnModel.addProcess(process); - - // 2.1 创建 StartNode 节点 - // 原因是:目å‰å‰ç«¯çš„第一个节点是“å‘起人节点â€ï¼Œæ‰€ä»¥è¿™é‡Œæž„建一个 StartNode,用于创建 Bpmn çš„ StartEvent 节点 - BpmSimpleModelNodeVO startNode = buildStartNode(); - startNode.setChildNode(simpleModelNode); - // 2.2 å°†å‰ç«¯ä¼ é€’çš„ simpleModelNode æ•°æ®ç»“构(jsonï¼‰ï¼Œè½¬æ¢æˆä»Ž BPMN FlowNode 元素,并添加到 Main Process 中 - traverseNodeToBuildFlowNode(startNode, process); - - // 3. 构建并添加节点之间的连线 Sequence Flow - EndEvent endEvent = getEndEvent(bpmnModel); - traverseNodeToBuildSequenceFlow(process, startNode, endEvent.getId()); - - // 4. 自动布局 - new BpmnAutoLayout(bpmnModel).execute(); - return bpmnModel; - } - - private static BpmSimpleModelNodeVO buildStartNode() { - return new BpmSimpleModelNodeVO().setId(START_EVENT_NODE_ID) - .setName(BpmSimpleModelNodeTypeEnum.START_NODE.getName()) - .setType(BpmSimpleModelNodeTypeEnum.START_NODE.getType()); - } - - /** - * é历节点,构建 FlowNode 元素 - * - * @param node SIMPLE 节点 - * @param process BPMN æµç¨‹ - */ - private static void traverseNodeToBuildFlowNode(BpmSimpleModelNodeVO node, Process process) { - // 1. åˆ¤æ–­æ˜¯å¦æœ‰æ•ˆèŠ‚ç‚¹ - if (!isValidNode(node)) { - return; - } - BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); - Assert.notNull(nodeType, "模型节点类型({})䏿”¯æŒ", node.getType()); - - // 2. 处ç†å½“å‰èŠ‚ç‚¹ - NodeConvert nodeConvert = NODE_CONVERTS.get(nodeType); - Assert.notNull(nodeConvert, "模型节点类型的转æ¢å™¨({})ä¸å­˜åœ¨", node.getType()); - List flowElements = nodeConvert.convertList(node); - flowElements.forEach(process::addFlowElement); - - // 3.1 æƒ…å†µä¸€ï¼šå¦‚æžœå½“å‰æ˜¯åˆ†æ”¯èŠ‚ç‚¹ï¼Œå¹¶ä¸”å­˜åœ¨æ¡ä»¶èŠ‚ç‚¹ï¼Œåˆ™å¤„ç†æ¯ä¸ªæ¡ä»¶çš„å­èŠ‚ç‚¹ - if (BpmSimpleModelNodeTypeEnum.isBranchNode(node.getType()) - && CollUtil.isNotEmpty(node.getConditionNodes())) { - // 注æ„:这里的 item.getChildNode() 处ç†çš„æ˜¯æ¯ä¸ªæ¡ä»¶çš„å­èŠ‚ç‚¹ï¼Œä¸æ˜¯å¤„ç†æ¡ä»¶ - node.getConditionNodes().forEach(item -> traverseNodeToBuildFlowNode(item.getChildNode(), process)); - } - - // 3.2 情况二:如果有“å­â€èŠ‚ç‚¹ï¼Œåˆ™é€’å½’å¤„ç†å­èŠ‚ç‚¹ - traverseNodeToBuildFlowNode(node.getChildNode(), process); - } - - /** - * é历节点,构建 SequenceFlow 元素 - * - * @param process Bpmn æµç¨‹ - * @param node 当å‰èŠ‚ç‚¹ - * @param targetNodeId 目标节点 ID - */ - private static void traverseNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { - // 1.1 无效节点返回 - if (!isValidNode(node)) { - return; - } - // 1.2 END_NODE 直接返回 - BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); - Assert.notNull(nodeType, "æ¨¡åž‹èŠ‚ç‚¹ç±»åž‹ä¸æ”¯æŒ"); - if (nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { - return; - } - - // 2.1 情况一:普通节点 - if (!BpmSimpleModelNodeTypeEnum.isBranchNode(node.getType())) { - traverseNormalNodeToBuildSequenceFlow(process, node, targetNodeId); - } else { - // 2.2 情况二:分支节点 - traverseBranchNodeToBuildSequenceFlow(process, node, targetNodeId); - } - } - - /** - * éåŽ†æ™®é€šï¼ˆéžæ¡ä»¶ï¼‰èŠ‚ç‚¹ï¼Œæž„å»º SequenceFlow 元素 - * - * @param process Bpmn æµç¨‹ - * @param node 当å‰èŠ‚ç‚¹ - * @param targetNodeId 目标节点 ID - */ - private static void traverseNormalNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { - BpmSimpleModelNodeVO childNode = node.getChildNode(); - boolean isChildNodeValid = isValidNode(childNode); - // 情况一:有“å­â€èŠ‚ç‚¹ï¼Œåˆ™å»ºç«‹è¿žçº¿ - // 情况二:没有“å­èŠ‚ç‚¹â€ï¼Œåˆ™ç›´æŽ¥è·Ÿ targetNodeId 建立连线。例如说,结æŸèŠ‚ç‚¹ã€æ¡ä»¶åˆ†æ”¯ï¼ˆåˆ†æ”¯èŠ‚ç‚¹çš„å­©å­èŠ‚ç‚¹æˆ–èšåˆèŠ‚ç‚¹ï¼‰çš„æœ€åŽä¸€ä¸ªèŠ‚ç‚¹ - String finalTargetNodeId = isChildNodeValid ? childNode.getId() : targetNodeId; - - // 如果没有附加节点:则直接建立连线 - if (StrUtil.isEmpty(node.getAttachNodeId())) { - SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), finalTargetNodeId); - process.addFlowElement(sequenceFlow); - } else { - // 如果有附加节点:需è¦å…ˆå»ºç«‹å’Œé™„加节点的连线,å†å»ºç«‹é™„加节点和目标节点的连线。例如说,触å‘器节点(HTTP 回调) - List sequenceFlows = buildAttachNodeSequenceFlow(node.getId(), node.getAttachNodeId(), finalTargetNodeId); - sequenceFlows.forEach(process::addFlowElement); - } - - // 因为有å­èŠ‚ç‚¹ï¼Œé€’å½’è°ƒç”¨åŽç»­å­èŠ‚ç‚¹ - if (isChildNodeValid) { - traverseNodeToBuildSequenceFlow(process, childNode, targetNodeId); - } - } - - /** - * 构建有附加节点的连线 - * - * @param nodeId 当å‰èŠ‚ç‚¹ ID - * @param attachNodeId 附属节点 ID - * @param targetNodeId 目标节点 ID - */ - private static List buildAttachNodeSequenceFlow(String nodeId, String attachNodeId, String targetNodeId) { - SequenceFlow sequenceFlow = buildBpmnSequenceFlow(nodeId, attachNodeId, null, null, null); - SequenceFlow attachSequenceFlow = buildBpmnSequenceFlow(attachNodeId, targetNodeId, null, null, null); - return CollUtil.newArrayList(sequenceFlow, attachSequenceFlow); - } - - /** - * é历æ¡ä»¶èŠ‚ç‚¹ï¼Œæž„å»º SequenceFlow 元素 - * - * @param process Bpmn æµç¨‹ - * @param node 当å‰èŠ‚ç‚¹ - * @param targetNodeId 目标节点 ID - */ - private static void traverseBranchNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { - BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); - BpmSimpleModelNodeVO childNode = node.getChildNode(); - List conditionNodes = node.getConditionNodes(); - // TODO @ZT 路由分支没有conditionNodes 这里注释会影å“å—?@jasonï¼šä¸€èµ·å¸®å¿™çž…çž…ï¼ -// Assert.notEmpty(conditionNodes, "分支节点的æ¡ä»¶èŠ‚ç‚¹ä¸èƒ½ä¸ºç©º"); - // 分支终点节点 ID - String branchEndNodeId = null; - if (nodeType == BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { // æ¡ä»¶åˆ†æ”¯æˆ–路由分支 - // åˆ†ä¸¤ç§æƒ…况 1. 分支节点有孩å­èŠ‚ç‚¹ä¸ºå­©å­èŠ‚ç‚¹ Id 2. 分支节点孩å­ä¸ºæ— æ•ˆèŠ‚ç‚¹æ—¶ (分支嵌套且为分支最åŽä¸€ä¸ªèŠ‚ç‚¹) 为分支终点节点 ID - branchEndNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; - } else if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { // 并行分支或包容分支 - // 分支节点:分支终点节点 Id 为程åºåˆ›å»ºçš„网关集åˆèŠ‚ç‚¹ã€‚ç›®å‰ä¸ä¼šä»Žå‰ç«¯ä¼ å…¥ã€‚ - branchEndNodeId = buildGatewayJoinId(node.getId()); - } - Assert.notEmpty(branchEndNodeId, "分支终点节点 Id ä¸èƒ½ä¸ºç©º"); - - // 3. é历分支节点 - if (nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { - // 路由分支é历 - for (BpmSimpleModelNodeVO.RouterSetting router : node.getRouterGroups()) { - SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), router); - process.addFlowElement(sequenceFlow); - } - } else { - // 下é¢çš„æ³¨é‡Šï¼Œä»¥å¦‚下情况举例å­ã€‚分支 1:A->B->C->D->E,分支 2:A->D->E。其中,A 为分支节点, D 为 A å­©å­èŠ‚ç‚¹ - for (BpmSimpleModelNodeVO item : conditionNodes) { - Assert.isTrue(Objects.equals(item.getType(), BpmSimpleModelNodeTypeEnum.CONDITION_NODE.getType()), - "æ¡ä»¶èŠ‚ç‚¹ç±»åž‹({})ä¸ç¬¦åˆ", item.getType()); - BpmSimpleModelNodeVO conditionChildNode = item.getChildNode(); - // 3.1 分支有åŽç»­èŠ‚ç‚¹ã€‚å³åˆ†æ”¯ 1: A->B->C->D 的情况 - if (isValidNode(conditionChildNode)) { - // 3.1.1 建立与åŽç»­çš„节点的连线。例如说,建立 A->B 的连线 - SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), conditionChildNode.getId(), item); - process.addFlowElement(sequenceFlow); - // 3.1.2 递归调用åŽç»­èŠ‚ç‚¹è¿žçº¿ã€‚ä¾‹å¦‚è¯´ï¼Œå»ºç«‹ B->C->D 的连线 - traverseNodeToBuildSequenceFlow(process, conditionChildNode, branchEndNodeId); - } else { - // 3.2 分支没有åŽç»­èŠ‚ç‚¹ã€‚ä¾‹å¦‚è¯´ï¼Œå»ºç«‹ A->D 的连线 - SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), branchEndNodeId, item); - process.addFlowElement(sequenceFlow); - } - } - } - - // 4.1 如果是并行分支ã€åŒ…容分支,由于是程åºåˆ›å»ºçš„èšåˆç½‘å…³ï¼Œéœ€è¦æ‰‹å·¥åˆ›å»ºèšåˆç½‘关和下一个节点的连线 - if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { - String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; - SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); - process.addFlowElement(sequenceFlow); - // 4.2 如果是路由分支,需è¦è¿žæŽ¥åŽç»­èŠ‚ç‚¹ä¸ºé»˜è®¤è·¯ç”± - } else if (nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { - SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getRouterDefaultFlowId(), - null, null); - process.addFlowElement(sequenceFlow); - } - - // 5. 递归调用åŽç»­èŠ‚ç‚¹ 继续递归。例如说,建立 D->E 的连线 - traverseNodeToBuildSequenceFlow(process, childNode, targetNodeId); - } - - private static SequenceFlow buildBpmnSequenceFlow(String sourceId, String targetId) { - return buildBpmnSequenceFlow(sourceId, targetId, null, null, null); - } - - private static SequenceFlow buildBpmnSequenceFlow(String sourceId, String targetId, - String sequenceFlowId, String sequenceFlowName, - String conditionExpression) { - Assert.notEmpty(sourceId, "sourceId ä¸èƒ½ä¸ºç©º"); - Assert.notEmpty(targetId, "targetId ä¸èƒ½ä¸ºç©º"); - // TODO @jason:如果 sequenceFlowId ä¸å­˜åœ¨çš„æ—¶å€™ï¼Œæ˜¯ä¸æ˜¯è¦ç”Ÿæˆä¸€ä¸ªé»˜è®¤çš„ sequenceFlowId? @ZT: 貌似ä¸éœ€è¦,Flowable 会默认生æˆï¼›TODO @jason:建议还是æžä¸€ä¸ªï¼Œä¸»è¦æ˜¯åŽç»­å¥½æŽ’查问题。 - // TODO @jason:如果 name ä¸å­˜åœ¨çš„æ—¶å€™ï¼Œæ˜¯ä¸æ˜¯è¦ç”Ÿæˆä¸€ä¸ªé»˜è®¤çš„ name? @ZT: ä¸éœ€è¦ç”Ÿæˆé»˜è®¤çš„å§ï¼Ÿ 这个会在æµç¨‹å›¾å±•示的, 一般用户填写的。ä¸å¥½ç”Ÿæˆé»˜è®¤çš„å§ï¼›TODO @jason:建议还是æžä¸€ä¸ªï¼Œä¸»è¦æ˜¯åŽç»­å¥½æŽ’查问题。 - SequenceFlow sequenceFlow = new SequenceFlow(sourceId, targetId); - if (StrUtil.isNotEmpty(sequenceFlowId)) { - sequenceFlow.setId(sequenceFlowId); - } - if (StrUtil.isNotEmpty(sequenceFlowName)) { - sequenceFlow.setName(sequenceFlowName); - } - if (StrUtil.isNotEmpty(conditionExpression)) { - sequenceFlow.setConditionExpression(conditionExpression); - } - return sequenceFlow; - } - - public static boolean isValidNode(BpmSimpleModelNodeVO node) { - return node != null && node.getId() != null; - } - - public static boolean isSequentialApproveNode(BpmSimpleModelNodeVO node) { - return BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType().equals(node.getType()) - && BpmUserTaskApproveMethodEnum.SEQUENTIAL.getMethod().equals(node.getApproveMethod()); - } - - // ========== å„ç§ convert 节点的方法: BpmSimpleModelNodeVO => BPMN FlowElement ========== - - private interface NodeConvert { - - default List convertList(BpmSimpleModelNodeVO node) { - return Collections.singletonList(convert(node)); - } - - default FlowElement convert(BpmSimpleModelNodeVO node) { - throw new UnsupportedOperationException("请实现该方法"); - } - - BpmSimpleModelNodeTypeEnum getType(); - - } - - private static class StartNodeConvert implements NodeConvert { - - @Override - public StartEvent convert(BpmSimpleModelNodeVO node) { - StartEvent startEvent = new StartEvent(); - startEvent.setId(node.getId()); - startEvent.setName(node.getName()); - return startEvent; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.START_NODE; - } - - } - - private static class EndNodeConvert implements NodeConvert { - - @Override - public EndEvent convert(BpmSimpleModelNodeVO node) { - EndEvent endEvent = new EndEvent(); - endEvent.setId(node.getId()); - endEvent.setName(node.getName()); - // TODO @ZT + jason:è¦ä¸è¦åŠ ä¸€ä¸ªç»ˆæ­¢å®šä¹‰ï¼Ÿ - return endEvent; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.END_NODE; - } - - } - - private static class StartUserNodeConvert implements NodeConvert { - - @Override - public UserTask convert(BpmSimpleModelNodeVO node) { - UserTask userTask = new UserTask(); - userTask.setId(node.getId()); - userTask.setName(node.getName()); - - // 人工审批 - addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, BpmUserTaskApproveTypeEnum.USER.getType()); - // 候选人策略为å‘起人自己 - addCandidateElements(BpmTaskCandidateStrategyEnum.START_USER.getStrategy(), null, userTask); - // 添加表å•字段æƒé™å±žæ€§å…ƒç´  - addFormFieldsPermission(node.getFieldsPermission(), userTask); - // 添加æ“作按钮é…置属性元素 - addButtonsSetting(node.getButtonsSetting(), userTask); - // 使用自动通过策略 - // TODO @ZT å¤ç”¨äº†SKIP, 是å¦éœ€è¦æ–°åŠ ä¸€ä¸ªç­–ç•¥ï¼›TODO @ZT:ã€å›žå¤ã€‘æ˜¯ä¸æ˜¯åº”该类似飞书,æžä¸ªè‰ç¨¿çжæ€ã€‚待定;还有一ç§ç­–ç•¥ï¼Œä¸æ ‡è®°è‡ªåŠ¨é€šè¿‡ï¼Œè€Œæ˜¯é¦–æ¬¡å‘èµ·åŽï¼Œç¬¬ä¸€ä¸ªèŠ‚ç‚¹ï¼Œè‡ªåŠ¨é€šè¿‡ï¼› - addAssignStartUserHandlerType(BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP.getType(), userTask); - return userTask; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.START_USER_NODE; - } - - } - - private static class ApproveNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - List flowElements = new ArrayList<>(2); - // 1. 构建用户任务 - UserTask userTask = buildBpmnUserTask(node); - flowElements.add(userTask); - - // 2. 添加用户任务的 Timer Boundary Event, ç”¨äºŽä»»åŠ¡çš„å®¡æ‰¹è¶…æ—¶å¤„ç† - if (node.getTimeoutHandler() != null && node.getTimeoutHandler().getEnable()) { - BoundaryEvent boundaryEvent = buildUserTaskTimeoutBoundaryEvent(userTask, node.getTimeoutHandler()); - flowElements.add(boundaryEvent); - } - return flowElements; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.APPROVE_NODE; - } - - /** - * 添加 UserTask 用户的审批超时 BoundaryEvent 事件 - * - * @param userTask 审批任务 - * @param timeoutHandler 超时处ç†å™¨ - * @return BoundaryEvent 超时事件 - */ - private BoundaryEvent buildUserTaskTimeoutBoundaryEvent(UserTask userTask, - BpmSimpleModelNodeVO.TimeoutHandler timeoutHandler) { - // 1. 创建 Timeout Boundary Event - String timeCycle = null; - if (Objects.equals(BpmUserTaskTimeoutHandlerTypeEnum.REMINDER.getType(), timeoutHandler.getType()) && - timeoutHandler.getMaxRemindCount() != null && timeoutHandler.getMaxRemindCount() > 1) { - timeCycle = String.format("R%d/%s", - timeoutHandler.getMaxRemindCount(), timeoutHandler.getTimeDuration()); - } - BoundaryEvent boundaryEvent = buildTimeoutBoundaryEvent(userTask, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT.getType(), - timeoutHandler.getTimeDuration(), timeCycle, null); - - // 2 添加超时执行动作元素 - addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_TYPE, timeoutHandler.getType()); - return boundaryEvent; - } - - private UserTask buildBpmnUserTask(BpmSimpleModelNodeVO node) { - UserTask userTask = new UserTask(); - userTask.setId(node.getId()); - userTask.setName(node.getName()); - - // å¦‚æžœä¸æ˜¯å®¡æ‰¹äººèŠ‚ç‚¹ï¼Œåˆ™ç›´æŽ¥è¿”å›ž - addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, node.getApproveType()); - if (ObjectUtil.notEqual(node.getApproveType(), BpmUserTaskApproveTypeEnum.USER.getType())) { - return userTask; - } - - // 添加候选人元素 - addCandidateElements(node.getCandidateStrategy(), node.getCandidateParam(), userTask); - // 添加表å•字段æƒé™å±žæ€§å…ƒç´  - addFormFieldsPermission(node.getFieldsPermission(), userTask); - // 添加æ“作按钮é…置属性元素 - addButtonsSetting(node.getButtonsSetting(), userTask); - // 处ç†å¤šå®žä¾‹ï¼ˆå®¡æ‰¹æ–¹å¼ï¼‰ - processMultiInstanceLoopCharacteristics(node.getApproveMethod(), node.getApproveRatio(), userTask); - // 添加任务被拒ç»çš„处ç†å…ƒç´  - addTaskRejectElements(node.getRejectHandler(), userTask); - // 添加用户任务的审批人与å‘èµ·äººç›¸åŒæ—¶çš„处ç†å…ƒç´  - addAssignStartUserHandlerType(node.getAssignStartUserHandlerType(), userTask); - // 添加用户任务的空处ç†å…ƒç´  - addAssignEmptyHandlerType(node.getAssignEmptyHandler(), userTask); - // 设置审批任务的截止时间 - if (node.getTimeoutHandler() != null && node.getTimeoutHandler().getEnable()) { - userTask.setDueDate(node.getTimeoutHandler().getTimeDuration()); - } - // 设置监å¬å™¨ - addUserTaskListener(node, userTask); - // 添加是å¦éœ€è¦ç­¾å - addSignEnable(node.getSignEnable(), userTask); - // 审批æ„è§ - addReasonRequire(node.getReasonRequire(), userTask); - // 节点类型 - addNodeType(node.getType(), userTask); - return userTask; - } - - private void addUserTaskListener(BpmSimpleModelNodeVO node, UserTask userTask) { - List flowableListeners = new ArrayList<>(3); - if (node.getTaskCreateListener() != null - && Boolean.TRUE.equals(node.getTaskCreateListener().getEnable())) { - FlowableListener flowableListener = new FlowableListener(); - flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); - flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - flowableListener.setImplementation(BpmUserTaskListener.DELEGATE_EXPRESSION); - addListenerConfig(flowableListener, node.getTaskCreateListener()); - flowableListeners.add(flowableListener); - } - if (node.getTaskAssignListener() != null - && Boolean.TRUE.equals(node.getTaskAssignListener().getEnable())) { - FlowableListener flowableListener = new FlowableListener(); - flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); - flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - flowableListener.setImplementation(BpmUserTaskListener.DELEGATE_EXPRESSION); - addListenerConfig(flowableListener, node.getTaskAssignListener()); - flowableListeners.add(flowableListener); - } - if (node.getTaskCompleteListener() != null - && Boolean.TRUE.equals(node.getTaskCompleteListener().getEnable())) { - FlowableListener flowableListener = new FlowableListener(); - flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); - flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - flowableListener.setImplementation(BpmUserTaskListener.DELEGATE_EXPRESSION); - addListenerConfig(flowableListener, node.getTaskCompleteListener()); - flowableListeners.add(flowableListener); - } - if (CollUtil.isNotEmpty(flowableListeners)) { - userTask.setTaskListeners(flowableListeners); - } - } - - private void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) { - BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); - Assert.notNull(approveMethodEnum, "审批方å¼({})ä¸èƒ½ä¸ºç©º", approveMethodEnum); - // 添加审批方å¼çš„æ‰©å±•属性 - addExtensionElement(userTask, USER_TASK_APPROVE_METHOD, approveMethod); - if (approveMethodEnum == BpmUserTaskApproveMethodEnum.RANDOM) { - // éšæœºå®¡æ‰¹ï¼Œä¸éœ€è¦è®¾ç½®å¤šå®žä¾‹å±žæ€§ - return; - } - - // 处ç†å¤šå®žä¾‹å®¡æ‰¹æ–¹å¼ - MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics(); - // 设置 collectionVariable。本系统用ä¸åˆ°ï¼Œä»…仅为了 Flowable æ ¡éªŒä¸æŠ¥é”™ - multiInstanceCharacteristics.setInputDataItem("${coll_userList}"); - if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) { - multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); - multiInstanceCharacteristics.setSequential(false); - } else if (approveMethodEnum == BpmUserTaskApproveMethodEnum.SEQUENTIAL) { - multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); - multiInstanceCharacteristics.setSequential(true); - multiInstanceCharacteristics.setLoopCardinality("1"); - } else if (approveMethodEnum == BpmUserTaskApproveMethodEnum.RATIO) { - Assert.notNull(approveRatio, "通过比例ä¸èƒ½ä¸ºç©º"); - multiInstanceCharacteristics.setCompletionCondition( - String.format(approveMethodEnum.getCompletionCondition(), String.format("%.2f", approveRatio / 100D))); - multiInstanceCharacteristics.setSequential(false); - } - userTask.setLoopCharacteristics(multiInstanceCharacteristics); - } - - } - - private static class TransactorNodeConvert extends ApproveNodeConvert { - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE; - } - - } - - private static class CopyNodeConvert implements NodeConvert { - - @Override - public ServiceTask convert(BpmSimpleModelNodeVO node) { - ServiceTask serviceTask = new ServiceTask(); - serviceTask.setId(node.getId()); - serviceTask.setName(node.getName()); - serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - serviceTask.setImplementation("${" + BpmCopyTaskDelegate.BEAN_NAME + "}"); - - // 添加抄é€å€™é€‰äººå…ƒç´  - addCandidateElements(node.getCandidateStrategy(), node.getCandidateParam(), serviceTask); - // 添加表å•字段æƒé™å±žæ€§å…ƒç´  - addFormFieldsPermission(node.getFieldsPermission(), serviceTask); - return serviceTask; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.COPY_NODE; - } - - } - - private static class ConditionBranchNodeConvert implements NodeConvert { - - @Override - public ExclusiveGateway convert(BpmSimpleModelNodeVO node) { - ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); - exclusiveGateway.setId(node.getId()); - // TODO @jason:setName - - // 设置默认的åºåˆ—æµï¼ˆæ¡ä»¶ï¼‰ - BpmSimpleModelNodeVO defaultSeqFlow = CollUtil.findOne(node.getConditionNodes(), - item -> BooleanUtil.isTrue(item.getConditionSetting().getDefaultFlow())); - Assert.notNull(defaultSeqFlow, "æ¡ä»¶åˆ†æ”¯èŠ‚ç‚¹({})的默认åºåˆ—æµä¸èƒ½ä¸ºç©º", node.getId()); - exclusiveGateway.setDefaultFlow(defaultSeqFlow.getId()); - return exclusiveGateway; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE; - } - - } - - private static class ParallelBranchNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - ParallelGateway parallelGateway = new ParallelGateway(); - parallelGateway.setId(node.getId()); - // TODO @jason:setName - - // 并行èšåˆç½‘关由程åºåˆ›å»ºï¼Œå‰ç«¯ä¸éœ€è¦ä¼ å…¥ - ParallelGateway joinParallelGateway = new ParallelGateway(); - joinParallelGateway.setId(buildGatewayJoinId(node.getId())); - // TODO @jason:setName - return CollUtil.newArrayList(parallelGateway, joinParallelGateway); - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE; - } - - } - - private static class InclusiveBranchNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - InclusiveGateway inclusiveGateway = new InclusiveGateway(); - inclusiveGateway.setId(node.getId()); - // 设置默认的åºåˆ—æµï¼ˆæ¡ä»¶ï¼‰ - BpmSimpleModelNodeVO defaultSeqFlow = CollUtil.findOne(node.getConditionNodes(), - item -> BooleanUtil.isTrue(item.getConditionSetting().getDefaultFlow())); - Assert.notNull(defaultSeqFlow, "包容分支节点({})的默认åºåˆ—æµä¸èƒ½ä¸ºç©º", node.getId()); - inclusiveGateway.setDefaultFlow(defaultSeqFlow.getId()); - // TODO @jason:setName - - // 并行èšåˆç½‘关由程åºåˆ›å»ºï¼Œå‰ç«¯ä¸éœ€è¦ä¼ å…¥ - InclusiveGateway joinInclusiveGateway = new InclusiveGateway(); - joinInclusiveGateway.setId(buildGatewayJoinId(node.getId())); - // TODO @jason:setName - return CollUtil.newArrayList(inclusiveGateway, joinInclusiveGateway); - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE; - } - - } - - public static class ConditionNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - // 原因是:正常情况下,它ä¸ä¼šè¢«è°ƒç”¨åˆ° - throw new UnsupportedOperationException("æ¡ä»¶èŠ‚ç‚¹ä¸æ”¯æŒè½¬æ¢"); - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.CONDITION_NODE; - } - - public static SequenceFlow buildSequenceFlow(String sourceId, String targetId, - BpmSimpleModelNodeVO node) { - String conditionExpression = buildConditionExpression(node.getConditionSetting()); - return buildBpmnSequenceFlow(sourceId, targetId, node.getId(), node.getName(), conditionExpression); - } - } - - /** - * 构造æ¡ä»¶è¡¨è¾¾å¼ - */ - public static String buildConditionExpression(BpmSimpleModelNodeVO.ConditionSetting conditionSetting) { - // 并行网关ä¸éœ€è¦è®¾ç½®æ¡ä»¶ - if (conditionSetting == null) { - return null; - } - return buildConditionExpression(conditionSetting.getConditionType(), conditionSetting.getConditionExpression(), - conditionSetting.getConditionGroups()); - } - - public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterSetting routerSetting) { - return buildConditionExpression(routerSetting.getConditionType(), routerSetting.getConditionExpression(), - routerSetting.getConditionGroups()); - } - - public static String buildConditionExpression(Integer conditionType, String conditionExpression, ConditionGroups conditionGroups) { - BpmSimpleModeConditionTypeEnum conditionTypeEnum = BpmSimpleModeConditionTypeEnum.valueOf(conditionType); - if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.EXPRESSION) { - return conditionExpression; - } - if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.RULE) { - if (conditionGroups == null || CollUtil.isEmpty(conditionGroups.getConditions())) { - return null; - } - List strConditionGroups = CollectionUtils.convertList(conditionGroups.getConditions(), item -> { - if (CollUtil.isEmpty(item.getRules())) { - return ""; - } - // æž„é€ è§„åˆ™è¡¨è¾¾å¼ - List list = CollectionUtils.convertList(item.getRules(), (rule) -> { - String rightSide = NumberUtil.isNumber(rule.getRightSide()) ? rule.getRightSide() - : "\"" + rule.getRightSide() + "\""; // å¦‚æžœéžæ•°å€¼ç±»åž‹åŠ å¼•å· - return String.format(" %s %s var:convertByType(%s,%s)", rule.getLeftSide(), rule.getOpCode(), rule.getLeftSide(), rightSide); - }); - // 构造æ¡ä»¶ç»„çš„è¡¨è¾¾å¼ - Boolean and = item.getAnd(); - return "(" + CollUtil.join(list, and ? " && " : " || ") + ")"; - }); - return String.format("${%s}", CollUtil.join(strConditionGroups, conditionGroups.getAnd() ? " && " : " || ")); - } - return null; - } - - public static class DelayTimerNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - List flowElements = new ArrayList<>(2); - // 1. 构建接收任务,通过接收任务å¯å¡ä½èŠ‚ç‚¹ - ReceiveTask receiveTask = new ReceiveTask(); - receiveTask.setId(node.getId()); - receiveTask.setName(node.getName()); - flowElements.add(receiveTask); - - // 2. 添加接收任务的 Timer Boundary Event - if (node.getDelaySetting() != null) { - BoundaryEvent boundaryEvent = null; - if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { - boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), - node.getDelaySetting().getDelayTime(), null, null); - } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { - boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), - null, null, node.getDelaySetting().getDelayTime()); - } else { - throw new UnsupportedOperationException("䏿”¯æŒçš„延迟类型:" + node.getDelaySetting()); - } - flowElements.add(boundaryEvent); - } - return flowElements; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.DELAY_TIMER_NODE; - } - } - - public static class TriggerNodeConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - Assert.notNull(node.getTriggerSetting(), "触å‘器节点设置ä¸èƒ½ä¸ºç©º"); - List flowElements = new ArrayList<>(2); - // HTTP 回调请求。需è¦é™„加一个 ReceiveTaskã€å‘起请求åŽã€ç­‰å¾…回调执行 - if (BpmTriggerTypeEnum.HTTP_CALLBACK.getType().equals(node.getTriggerSetting().getType())) { - Assert.notNull(node.getTriggerSetting().getHttpRequestSetting(), "触å‘器 HTTP 回调请求设置ä¸èƒ½ä¸ºç©º"); - ReceiveTask receiveTask = new ReceiveTask(); - receiveTask.setId("Activity_" + IdUtil.fastUUID()); - receiveTask.setName("HTTP 回调"); - node.setAttachNodeId(receiveTask.getId()); - flowElements.add(receiveTask); - // é‡è¦ï¼šè®¾ç½® callbackTaskDefineKey,用于 HTTP 回调 - node.getTriggerSetting().getHttpRequestSetting().setCallbackTaskDefineKey(receiveTask.getId()); - } - - // 触å‘器使用 ServiceTask æ¥å®žçް - ServiceTask serviceTask = new ServiceTask(); - serviceTask.setId(node.getId()); - serviceTask.setName(node.getName()); - serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - serviceTask.setImplementation("${" + BpmTriggerTaskDelegate.BEAN_NAME + "}"); - addExtensionElement(serviceTask, TRIGGER_TYPE, node.getTriggerSetting().getType()); - if (node.getTriggerSetting().getHttpRequestSetting() != null) { - addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getHttpRequestSetting()); - } - if (node.getTriggerSetting().getFormSettings() != null) { - addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getFormSettings()); - } - flowElements.add(serviceTask); - return flowElements; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.TRIGGER_NODE; - } - } - - public static class RouteBranchNodeConvert implements NodeConvert { - - @Override - public ExclusiveGateway convert(BpmSimpleModelNodeVO node) { - ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); - exclusiveGateway.setId(node.getId()); - - // 设置默认的åºåˆ—æµï¼ˆæ¡ä»¶ï¼‰ - node.setRouterDefaultFlowId("Flow_" + IdUtil.fastUUID()); - exclusiveGateway.setDefaultFlow(node.getRouterDefaultFlowId()); - return exclusiveGateway; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE; - } - - public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterSetting router) { - String conditionExpression = SimpleModelUtils.buildConditionExpression(router); - return buildBpmnSequenceFlow(nodeId, router.getNodeId(), null, null, conditionExpression); - } - - } - - private static class ChildProcessConvert implements NodeConvert { - - @Override - public List convertList(BpmSimpleModelNodeVO node) { - List flowElements = new ArrayList<>(2); - BpmSimpleModelNodeVO.ChildProcessSetting childProcessSetting = node.getChildProcessSetting(); - List inVariables = childProcessSetting.getInVariables() == null ? - new ArrayList<>() : new ArrayList<>(childProcessSetting.getInVariables()); - CallActivity callActivity = new CallActivity(); - callActivity.setId(node.getId()); - callActivity.setName(node.getName()); - callActivity.setCalledElementType("key"); - // 1. 是å¦å¼‚æ­¥ - if (node.getChildProcessSetting().getAsync()) { - callActivity.setAsynchronous(true); - } - - // 2. è°ƒç”¨çš„å­æµç¨‹ - callActivity.setCalledElement(childProcessSetting.getCalledProcessDefinitionKey()); - callActivity.setProcessInstanceName(childProcessSetting.getCalledProcessDefinitionName()); - - // 3. 是å¦è‡ªåŠ¨è·³è¿‡å­æµç¨‹å‘起节点 - IOParameter ioParameter = new IOParameter(); - ioParameter.setSourceExpression(childProcessSetting.getSkipStartUserNode().toString()); - ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE); - inVariables.add(ioParameter); - - // 4. ã€é»˜è®¤éœ€è¦ä¼ é€’的一些å˜é‡ã€‘æµç¨‹çŠ¶æ€ - ioParameter = new IOParameter(); - ioParameter.setSource(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - inVariables.add(ioParameter); - - // 5. 主→å­å˜é‡ä¼ é€’ã€å­->主å˜é‡ä¼ é€’ - callActivity.setInParameters(inVariables); - if (ArrayUtil.isNotEmpty(childProcessSetting.getOutVariables()) && ObjUtil.notEqual(childProcessSetting.getAsync(), Boolean.TRUE)) { - callActivity.setOutParameters(childProcessSetting.getOutVariables()); - } - - // 6. å­æµç¨‹å‘起人é…ç½® - List executionListeners = new ArrayList<>(); - FlowableListener flowableListener = new FlowableListener(); - flowableListener.setEvent(ExecutionListener.EVENTNAME_START); - flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - flowableListener.setImplementation(BpmCallActivityListener.DELEGATE_EXPRESSION); - FieldExtension fieldExtension = new FieldExtension(); - fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(childProcessSetting.getStartUserSetting())); - flowableListener.getFieldExtensions().add(fieldExtension); - executionListeners.add(flowableListener); - callActivity.setExecutionListeners(executionListeners); - - // 7. 超时设置 - if (childProcessSetting.getTimeoutSetting() != null && Boolean.TRUE.equals(childProcessSetting.getTimeoutSetting().getEnable())) { - BoundaryEvent boundaryEvent = null; - if (childProcessSetting.getTimeoutSetting().getType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { - boundaryEvent = buildTimeoutBoundaryEvent(callActivity, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), - childProcessSetting.getTimeoutSetting().getTimeExpression(), null, null); - } else if (childProcessSetting.getTimeoutSetting().getType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { - boundaryEvent = buildTimeoutBoundaryEvent(callActivity, BpmBoundaryEventTypeEnum.CHILD_PROCESS_TIMEOUT.getType(), - null, null, childProcessSetting.getTimeoutSetting().getTimeExpression()); - } - flowElements.add(boundaryEvent); - } - - // 8. 多实例 - if (childProcessSetting.getMultiInstanceSetting() != null && Boolean.TRUE.equals(childProcessSetting.getMultiInstanceSetting().getEnable())) { - MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics(); - multiInstanceCharacteristics.setSequential(childProcessSetting.getMultiInstanceSetting().getSequential()); - if (childProcessSetting.getMultiInstanceSetting().getSourceType().equals(BpmChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY.getType())) { - multiInstanceCharacteristics.setLoopCardinality(childProcessSetting.getMultiInstanceSetting().getSource()); - } - if (childProcessSetting.getMultiInstanceSetting().getSourceType().equals(BpmChildProcessMultiInstanceSourceTypeEnum.NUMBER_FORM.getType()) || - childProcessSetting.getMultiInstanceSetting().getSourceType().equals(BpmChildProcessMultiInstanceSourceTypeEnum.MULTIPLE_FORM.getType())) { - multiInstanceCharacteristics.setInputDataItem(childProcessSetting.getMultiInstanceSetting().getSource()); - } - multiInstanceCharacteristics.setCompletionCondition(String.format(BpmUserTaskApproveMethodEnum.RATIO.getCompletionCondition(), - String.format("%.2f", childProcessSetting.getMultiInstanceSetting().getApproveRatio() / 100D))); - callActivity.setLoopCharacteristics(multiInstanceCharacteristics); - addExtensionElement(callActivity, CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE, childProcessSetting.getMultiInstanceSetting().getSourceType()); - } - - // 添加节点类型 - addNodeType(node.getType(), callActivity); - flowElements.add(callActivity); - return flowElements; - } - - @Override - public BpmSimpleModelNodeTypeEnum getType() { - return BpmSimpleModelNodeTypeEnum.CHILD_PROCESS; - } - - } - - private static String buildGatewayJoinId(String id) { - return id + "_join"; - } - - private static BoundaryEvent buildTimeoutBoundaryEvent(Activity attachedToRef, Integer type, - String timeDuration, String timeCycle, String timeDate) { - // 1.1 定时器边界事件 - BoundaryEvent boundaryEvent = new BoundaryEvent(); - boundaryEvent.setId("Event-" + IdUtil.fastUUID()); - boundaryEvent.setCancelActivity(false); // 设置关è”的任务为ä¸ä¼šè¢«ä¸­æ–­ - boundaryEvent.setAttachedToRef(attachedToRef); - // 1.2 å®šä¹‰è¶…æ—¶æ—¶é—´è¡¨è¾¾å¼ - TimerEventDefinition eventDefinition = new TimerEventDefinition(); - if (ObjUtil.isNotNull(timeDuration)) { - eventDefinition.setTimeDuration(timeDuration); - } - if (ObjUtil.isNotNull(timeDuration)) { - eventDefinition.setTimeCycle(timeCycle); - } - if (ObjUtil.isNotNull(timeDate)) { - eventDefinition.setTimeDate(timeDate); - } - boundaryEvent.addEventDefinition(eventDefinition); - - // 2. 添加定时器边界事件类型 - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, type); - return boundaryEvent; - } - - // ========== SIMPLE æµç¨‹é¢„测相关的方法 ========== - - public static List simulateProcess(BpmSimpleModelNodeVO rootNode, Map variables) { - List resultNodes = new ArrayList<>(); - - // 从头开始é历 - simulateNextNode(rootNode, variables, resultNodes); - return resultNodes; - } - - private static void simulateNextNode(BpmSimpleModelNodeVO currentNode, Map variables, - List resultNodes) { - // 如果ä¸åˆæ³•ï¼ˆåŒ…æ‹¬ä¸ºç©ºï¼‰ï¼Œåˆ™ç›´æŽ¥ç»“æŸ - if (!isValidNode(currentNode)) { - return; - } - BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(currentNode.getType()); - Assert.notNull(nodeType, "æ¨¡åž‹èŠ‚ç‚¹ç±»åž‹ä¸æ”¯æŒ"); - - // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE/TRANSACTOR_NODE - if (nodeType == BpmSimpleModelNodeTypeEnum.START_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.START_USER_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.APPROVE_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE - || nodeType == BpmSimpleModelNodeTypeEnum.CHILD_PROCESS - || nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { - // 添加元素 - resultNodes.add(currentNode); - } - - // 情况:CONDITION_BRANCH_NODE æŽ’å®ƒï¼Œåªæœ‰ä¸€ä¸ªæ»¡è¶³æ¡ä»¶çš„。如果没有,就走默认的 - if (nodeType == BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE) { - // 查找满足æ¡ä»¶çš„ BpmSimpleModelNodeVO 节点 - BpmSimpleModelNodeVO matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), - conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) - && evalConditionExpress(variables, conditionNode.getConditionSetting())); - if (matchConditionNode == null) { - matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), - conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); - } - Assert.notNull(matchConditionNode, "找ä¸åˆ°æ¡ä»¶èŠ‚ç‚¹({})", currentNode); - // é历满足æ¡ä»¶çš„ BpmSimpleModelNodeVO 节点 - simulateNextNode(matchConditionNode.getChildNode(), variables, resultNodes); - } - - // 情况:INCLUSIVE_BRANCH_NODE 包容,多个满足æ¡ä»¶çš„。如果没有,就走默认的 - if (nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { - // 查找满足æ¡ä»¶çš„ BpmSimpleModelNodeVO 节点 - Collection matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), - conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) - && evalConditionExpress(variables, conditionNode.getConditionSetting())); - if (CollUtil.isEmpty(matchConditionNodes)) { - matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), - conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); - } - Assert.isTrue(!matchConditionNodes.isEmpty(), "找ä¸åˆ°æ¡ä»¶èŠ‚ç‚¹({})", currentNode); - // é历满足æ¡ä»¶çš„ BpmSimpleModelNodeVO 节点 - matchConditionNodes.forEach(matchConditionNode -> - simulateNextNode(matchConditionNode.getChildNode(), variables, resultNodes)); - } - - // 情况:PARALLEL_BRANCH_NODE 并行,都满足,都走 - if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE) { - // é历所有 BpmSimpleModelNodeVO 节点 - currentNode.getConditionNodes().forEach(matchConditionNode -> - simulateNextNode(matchConditionNode.getChildNode(), variables, resultNodes)); - } - - // é历å­èŠ‚ç‚¹ - simulateNextNode(currentNode.getChildNode(), variables, resultNodes); - } - - public static boolean evalConditionExpress(Map variables, BpmSimpleModelNodeVO.ConditionSetting conditionSetting) { - return BpmnModelUtils.evalConditionExpress(variables, buildConditionExpression(conditionSetting)); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/package-info.java deleted file mode 100644 index 73f8350..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 bpm 模å—çš„ framework å°è£… - * - * @author ZT - */ -package com.zt.plat.module.bpm.framework; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/DscBpmRpcConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/DscBpmRpcConfiguration.java new file mode 100644 index 0000000..5759ec1 --- /dev/null +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/DscBpmRpcConfiguration.java @@ -0,0 +1,16 @@ +package com.zt.plat.module.bpm.framework.rpc.config; + +import com.zt.plat.module.capital.api.splyAmountRequest.AmountRequestApi; +import com.zt.plat.module.capital.api.splyAmtCrdtAppl.AmountCreditApplyApi; +import com.zt.plat.module.product.api.MesProcessRoutApi; +import com.zt.plat.module.product.api.plan.MesCompanyPlanApi; +import com.zt.plat.module.product.api.plan.MesFactoryPlanApi; +import com.zt.plat.module.qms.api.task.QmsApi; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +@Configuration(value = "dscBpmRpcConfiguration", proxyBeanMethods = false) +@EnableFeignClients(clients = {AmountCreditApplyApi.class, MesCompanyPlanApi.class, MesFactoryPlanApi.class, + MesProcessRoutApi.class, QmsApi.class, AmountRequestApi .class}) +public class DscBpmRpcConfiguration { +} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java deleted file mode 100644 index 30b7068..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zt.plat.module.bpm.framework.rpc.config; - -import com.zt.plat.module.capital.api.splyAmountRequest.AmountRequestApi; -import com.zt.plat.module.capital.api.splyAmtCrdtAppl.AmountCreditApplyApi; -import com.zt.plat.module.product.api.MesProcessRoutApi; -import com.zt.plat.module.product.api.plan.MesCompanyPlanApi; -import com.zt.plat.module.product.api.plan.MesFactoryPlanApi; -import com.zt.plat.module.qms.api.task.QmsApi; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.PostApi; -import com.zt.plat.module.system.api.dict.DictDataApi; -import com.zt.plat.module.system.api.permission.PermissionApi; -import com.zt.plat.module.system.api.permission.RoleApi; -import com.zt.plat.module.system.api.sms.SmsSendApi; -import com.zt.plat.module.system.api.user.AdminUserApi; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Configuration; - -@Configuration(value = "bpmRpcConfiguration", proxyBeanMethods = false) -@EnableFeignClients(clients = {RoleApi.class, DeptApi.class, PostApi.class, AdminUserApi.class, SmsSendApi.class, DictDataApi.class, - PermissionApi.class, AmountCreditApplyApi.class, MesProcessRoutApi.class, MesFactoryPlanApi.class, MesCompanyPlanApi.class, AmountRequestApi.class, QmsApi.class}) -public class RpcConfiguration { -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/package-info.java deleted file mode 100644 index 4a733c4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package com.zt.plat.module.bpm.framework.rpc; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/config/SecurityConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/config/SecurityConfiguration.java deleted file mode 100644 index 5e59e23..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/config/SecurityConfiguration.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.zt.plat.module.bpm.framework.security.config; - -import com.zt.plat.framework.security.config.AuthorizeRequestsCustomizer; -import com.zt.plat.module.bpm.enums.ApiConstants; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; - -/** - * Bpm 模å—çš„ Security é…ç½® - */ -@Configuration(proxyBeanMethods = false, value = "bpmSecurityConfiguration") -public class SecurityConfiguration { - - @Bean("bpmAuthorizeRequestsCustomizer") - public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { - return new AuthorizeRequestsCustomizer() { - - @Override - public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) { - // TODO ZT:这个æ¯ä¸ªé¡¹ç›®éƒ½éœ€è¦é‡å¤é…ç½®ï¼Œå¾—æ‰æ‘¸æœ‰æ²¡é€šç”¨çš„æ–¹æ¡ˆ - // Swagger æŽ¥å£æ–‡æ¡£ - registry.requestMatchers("/v3/api-docs/**").permitAll() - .requestMatchers("/webjars/**").permitAll() - .requestMatchers("/swagger-ui").permitAll() - .requestMatchers("/swagger-ui/**").permitAll(); - // Druid 监控 - registry.requestMatchers("/druid/**").permitAll(); - // Spring Boot Actuator 的安全é…ç½® - registry.requestMatchers("/actuator").permitAll() - .requestMatchers("/actuator/**").permitAll(); - // RPC æœåŠ¡çš„å®‰å…¨é…ç½® - registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll(); - } - - }; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/core/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/core/package-info.java deleted file mode 100644 index a637358..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/security/core/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package com.zt.plat.module.bpm.framework.security.core; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/config/BpmWebConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/config/BpmWebConfiguration.java deleted file mode 100644 index fed2cc5..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/config/BpmWebConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.zt.plat.module.bpm.framework.web.config; - -import com.zt.plat.framework.common.enums.WebFilterOrderEnum; -import com.zt.plat.framework.swagger.config.ZtSwaggerAutoConfiguration; -import com.zt.plat.module.bpm.framework.web.core.FlowableWebFilter; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * bpm 模å—çš„ web 组件的 Configuration - * - * @author ZT - */ -@Configuration(proxyBeanMethods = false) -public class BpmWebConfiguration { - - /** - * é…ç½® Flowable Web 过滤器 - */ - @Bean - public FilterRegistrationBean flowableWebFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new FlowableWebFilter()); - registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER); - return registrationBean; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/core/FlowableWebFilter.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/core/FlowableWebFilter.java deleted file mode 100644 index 4699de5..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/core/FlowableWebFilter.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.bpm.framework.web.core; - -import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; - -/** - * Flowable Web 过滤器,将 userId 设置到 {@link org.flowable.common.engine.impl.identity.Authentication} 中 - * - * @author jason - */ -public class FlowableWebFilter extends OncePerRequestFilter { - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - try { - // 设置工作æµçš„用户 - Long userId = SecurityFrameworkUtils.getLoginUserId(); - if (userId != null) { - FlowableUtils.setAuthenticatedUserId(userId); - } - // 过滤 - chain.doFilter(request, response); - } finally { - // æ¸…ç† - FlowableUtils.clearAuthenticatedUserId(); - } - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/package-info.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/package-info.java deleted file mode 100644 index 62601dc..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * bpm 模å—çš„ web é…ç½® - */ -package com.zt.plat.module.bpm.framework.web; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryService.java deleted file mode 100644 index 6e24f44..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import jakarta.validation.Valid; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * BPM æµç¨‹åˆ†ç±» Service æŽ¥å£ - * - * @author ZT - */ -public interface BpmCategoryService { - - /** - * 创建æµç¨‹åˆ†ç±» - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createCategory(@Valid BpmCategorySaveReqVO createReqVO); - - /** - * æ›´æ–°æµç¨‹åˆ†ç±» - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateCategory(@Valid BpmCategorySaveReqVO updateReqVO); - - /** - * 删除æµç¨‹åˆ†ç±» - * - * @param id ç¼–å· - */ - void deleteCategory(Long id); - - /** - * 获得æµç¨‹åˆ†ç±» - * - * @param id ç¼–å· - * @return BPM æµç¨‹åˆ†ç±» - */ - BpmCategoryDO getCategory(Long id); - - /** - * 获得æµç¨‹åˆ†ç±»åˆ†é¡µ - * - * @param pageReqVO 分页查询 - * @return æµç¨‹åˆ†ç±»åˆ†é¡µ - */ - PageResult getCategoryPage(BpmCategoryPageReqVO pageReqVO); - - /** - * 获得æµç¨‹åˆ†ç±» Mapï¼ŒåŸºäºŽæŒ‡å®šç¼–ç  - * - * @param codes ç¼–å·æ•°ç»„ - * @return æµç¨‹åˆ†ç±» Map - */ - default Map getCategoryMap(Collection codes) { - return convertMap(getCategoryListByCode(codes), BpmCategoryDO::getCode); - } - - /** - * 获得æµç¨‹åˆ†ç±»åˆ—è¡¨ï¼ŒåŸºäºŽæŒ‡å®šç¼–ç  - * - * @return æµç¨‹åˆ†ç±»åˆ—表 - */ - List getCategoryListByCode(Collection codes); - - /** - * 获得æµç¨‹åˆ†ç±»åˆ—è¡¨ï¼ŒåŸºäºŽæŒ‡å®šçŠ¶æ€ - * - * @param status çŠ¶æ€ - * @return æµç¨‹åˆ†ç±»åˆ—表 - */ - List getCategoryListByStatus(Integer status); - - /** - * æ‰¹é‡æ›´æ–°æµç¨‹åˆ†ç±»çš„æŽ’åºï¼šæ¯ä¸ªåˆ†ç±»çš„ sort 值,从 0 开始递增 - * - * @param ids 分类编å·åˆ—表 - */ - void updateCategorySortBatch(List ids); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryServiceImpl.java deleted file mode 100644 index d111015..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmCategoryServiceImpl.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmCategoryDO; -import com.zt.plat.module.bpm.dal.mysql.category.BpmCategoryMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; - -/** - * BPM æµç¨‹åˆ†ç±» Service 实现类 - * - * @author ZT - */ -@Service -@Validated -public class BpmCategoryServiceImpl implements BpmCategoryService { - - @Resource - private BpmCategoryMapper bpmCategoryMapper; - - @Override - public Long createCategory(BpmCategorySaveReqVO createReqVO) { - // 校验唯一 - validateCategoryNameUnique(createReqVO); - validateCategoryCodeUnique(createReqVO); - // æ’å…¥ - BpmCategoryDO category = BeanUtils.toBean(createReqVO, BpmCategoryDO.class); - bpmCategoryMapper.insert(category); - return category.getId(); - } - - @Override - public void updateCategory(BpmCategorySaveReqVO updateReqVO) { - // 校验存在 - validateCategoryExists(updateReqVO.getId()); - validateCategoryNameUnique(updateReqVO); - validateCategoryCodeUnique(updateReqVO); - // æ›´æ–° - BpmCategoryDO updateObj = BeanUtils.toBean(updateReqVO, BpmCategoryDO.class); - bpmCategoryMapper.updateById(updateObj); - } - - private void validateCategoryNameUnique(BpmCategorySaveReqVO updateReqVO) { - BpmCategoryDO category = bpmCategoryMapper.selectByName(updateReqVO.getName()); - if (category == null - || ObjUtil.equal(category.getId(), updateReqVO.getId())) { - return; - } - throw exception(CATEGORY_NAME_DUPLICATE, updateReqVO.getName()); - } - - private void validateCategoryCodeUnique(BpmCategorySaveReqVO updateReqVO) { - BpmCategoryDO category = bpmCategoryMapper.selectByCode(updateReqVO.getCode()); - if (category == null - || ObjUtil.equal(category.getId(), updateReqVO.getId())) { - return; - } - throw exception(CATEGORY_CODE_DUPLICATE, updateReqVO.getCode()); - } - - @Override - public void deleteCategory(Long id) { - // 校验存在 - validateCategoryExists(id); - // 删除 - bpmCategoryMapper.deleteById(id); - } - - private void validateCategoryExists(Long id) { - if (bpmCategoryMapper.selectById(id) == null) { - throw exception(CATEGORY_NOT_EXISTS); - } - } - - @Override - public BpmCategoryDO getCategory(Long id) { - return bpmCategoryMapper.selectById(id); - } - - @Override - public PageResult getCategoryPage(BpmCategoryPageReqVO pageReqVO) { - return bpmCategoryMapper.selectPage(pageReqVO); - } - - @Override - public List getCategoryListByCode(Collection codes) { - if (CollUtil.isEmpty(codes)) { - return Collections.emptyList(); - } - return bpmCategoryMapper.selectListByCode(codes); - } - - @Override - public List getCategoryListByStatus(Integer status) { - return bpmCategoryMapper.selectListByStatus(status); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCategorySortBatch(List ids) { - // 校验分类都存在 - List categories = bpmCategoryMapper.selectByIds(ids); - if (categories.size() != ids.size()) { - throw exception(CATEGORY_NOT_EXISTS); - } - - // æ‰¹é‡æ›´æ–°æŽ’åº - List updateList = IntStream.range(0, ids.size()) - .mapToObj(index -> new BpmCategoryDO().setId(ids.get(index)).setSort(index)) - .collect(Collectors.toList()); - bpmCategoryMapper.updateBatch(updateList); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormService.java deleted file mode 100644 index 6a5a8c0..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormService.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import jakarta.validation.Valid; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - - -/** - * 动æ€è¡¨å• Service æŽ¥å£ - * - * @author @风里雾里 - */ -public interface BpmFormService { - - /** - * 创建动æ€è¡¨å• - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createForm(@Valid BpmFormSaveReqVO createReqVO); - - /** - * 更新动æ€è¡¨å• - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateForm(@Valid BpmFormSaveReqVO updateReqVO); - - /** - * 删除动æ€è¡¨å• - * - * @param id ç¼–å· - */ - void deleteForm(Long id); - - /** - * 获得动æ€è¡¨å• - * - * @param id ç¼–å· - * @return 动æ€è¡¨å• - */ - BpmFormDO getForm(Long id); - - /** - * 获得动æ€è¡¨å•列表 - * - * @return 动æ€è¡¨å•列表 - */ - List getFormList(); - - /** - * 获得动æ€è¡¨å•列表 - * - * @param ids ç¼–å· - * @return 动æ€è¡¨å•列表 - */ - List getFormList(Collection ids); - - /** - * 获得动æ€è¡¨å• Map - * - * @param ids ç¼–å· - * @return 动æ€è¡¨å• Map - */ - default Map getFormMap(Collection ids) { - return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId); - } - - /** - * 获得动æ€è¡¨å•分页 - * - * @param pageReqVO 分页查询 - * @return 动æ€è¡¨å•分页 - */ - PageResult getFormPage(BpmFormPageReqVO pageReqVO); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormServiceImpl.java deleted file mode 100644 index 768239d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmFormServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.mysql.definition.BpmFormMapper; -import com.zt.plat.module.bpm.enums.ErrorCodeConstants; -import com.zt.plat.module.bpm.service.definition.dto.BpmFormFieldRespDTO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.*; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; - -/** - * 动æ€è¡¨å• Service 实现类 - * - * @author 风里雾里 - */ -@Service -@Validated -public class BpmFormServiceImpl implements BpmFormService { - - @Resource - private BpmFormMapper formMapper; - - @Override - public Long createForm(BpmFormSaveReqVO createReqVO) { - this.validateFields(createReqVO.getFields()); - // æ’å…¥ - BpmFormDO form = BeanUtils.toBean(createReqVO, BpmFormDO.class); - formMapper.insert(form); - // 返回 - return form.getId(); - } - - @Override - public void updateForm(BpmFormSaveReqVO updateReqVO) { - validateFields(updateReqVO.getFields()); - // 校验存在 - validateFormExists(updateReqVO.getId()); - // æ›´æ–° - BpmFormDO updateObj = BeanUtils.toBean(updateReqVO, BpmFormDO.class); - formMapper.updateById(updateObj); - } - - @Override - public void deleteForm(Long id) { - // 校验存在 - this.validateFormExists(id); - // 删除 - formMapper.deleteById(id); - } - - private void validateFormExists(Long id) { - if (formMapper.selectById(id) == null) { - throw exception(ErrorCodeConstants.FORM_NOT_EXISTS); - } - } - - @Override - public BpmFormDO getForm(Long id) { - return formMapper.selectById(id); - } - - @Override - public List getFormList() { - return formMapper.selectList(); - } - - @Override - public List getFormList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return formMapper.selectBatchIds(ids); - } - - @Override - public PageResult getFormPage(BpmFormPageReqVO pageReqVO) { - return formMapper.selectPage(pageReqVO); - } - - /** - * 校验 Field,é¿å… field é‡å¤ - * - * @param fields field 数组 - */ - private void validateFields(List fields) { - if (true) { // TODO ZT:兼容 Vue3 工作æµï¼šå› ä¸ºé‡‡ç”¨äº†æ–°çš„表å•è®¾è®¡å™¨ï¼Œæ‰€ä»¥æš‚æ—¶ä¸æ ¡éªŒ - return; - } - Map fieldMap = new HashMap<>(); // key 是 vModel,value 是 label - for (String field : fields) { - BpmFormFieldRespDTO fieldDTO = JsonUtils.parseObject(field, BpmFormFieldRespDTO.class); - Assert.notNull(fieldDTO); - String oldLabel = fieldMap.put(fieldDTO.getVModel(), fieldDTO.getLabel()); - // 如果ä¸å­˜åœ¨ï¼Œåˆ™ç›´æŽ¥è¿”回 - if (oldLabel == null) { - continue; - } - // 如果存在,则报错 - throw exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); - } - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelService.java deleted file mode 100644 index a9f8b1d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelService.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelSaveReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelUpdateReqVO; -import jakarta.validation.Valid; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.repository.Model; - -import java.util.List; - -/** - * æµç¨‹æ¨¡åž‹æŽ¥å£ - * - * @author yunlongn - */ -public interface BpmModelService { - - /** - * 获得æµç¨‹æ¨¡åž‹åˆ—表 - * - * @param name 模型åç§° - * @return æµç¨‹æ¨¡åž‹åˆ—表 - */ - List getModelList(String name); - - /** - * 创建æµç¨‹æ¨¡åž‹ - * - * @param modelVO åˆ›å»ºä¿¡æ¯ - * @return 创建的æµç¨‹æ¨¡åž‹çš„ç¼–å· - */ - String createModel(@Valid BpmModelSaveReqVO modelVO); - - /** - * 获得æµç¨‹æ¨¡å— - * - * @param id ç¼–å· - * @return æµç¨‹æ¨¡åž‹ - */ - Model getModel(String id); - - /** - * 获得æµç¨‹æ¨¡åž‹çš„ BPMN XML - * - * @param id ç¼–å· - * @return BPMN XML - */ - byte[] getModelBpmnXML(String id); - - /** - * 修改æµç¨‹æ¨¡åž‹çš„ BPMN XML - * - * @param id ç¼–å· - * @param bpmnXml BPMN XML - */ - void updateModelBpmnXml(String id, String bpmnXml); - - /** - * 修改æµç¨‹æ¨¡åž‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateModel(Long userId, @Valid BpmModelSaveReqVO updateReqVO); - - /** - * æ‰¹é‡æ›´æ–°æ¨¡åž‹æŽ’åº - * - * @param userId ç”¨æˆ·ç¼–å· - * @param ids ç¼–å·åˆ—表 - */ - void updateModelSortBatch(Long userId, List ids); - - /** - * å°†æµç¨‹æ¨¡åž‹ï¼Œéƒ¨ç½²æˆä¸€ä¸ªæµç¨‹å®šä¹‰ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param id ç¼–å· - */ - void deployModel(Long userId, String id); - - /** - * 删除模型 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param id ç¼–å· - */ - void deleteModel(Long userId, String id); - - /** - * æ¸…ç†æ¨¡åž‹ï¼ŒåŒ…括æµç¨‹å®žä¾‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param id ç¼–å· - */ - void cleanModel(Long userId, String id); - - /** - * 修改模型的状æ€ï¼Œå®žé™…更新的部署的æµç¨‹å®šä¹‰çš„çŠ¶æ€ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param id ç¼–å· - * @param state çŠ¶æ€ - */ - void updateModelState(Long userId, String id, Integer state); - - /** - * 获得æµç¨‹å®šä¹‰ç¼–å·å¯¹åº”çš„ BPMN Model - * - * @param processDefinitionId æµç¨‹å®šä¹‰ç¼–å· - * @return BPMN Model - */ - BpmnModel getBpmnModelByDefinitionId(String processDefinitionId); - - // ========== 仿钉钉/飞书的精简模型 ========= - - /** - * 获å–仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹ç»“æž„ - * - * @param modelId æµç¨‹æ¨¡åž‹ç¼–å· - * @return 仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹ç»“æž„ - */ - BpmSimpleModelNodeVO getSimpleModel(String modelId); - - /** - * 更新仿钉钉æµç¨‹è®¾è®¡æ¨¡åž‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO è¯·æ±‚ä¿¡æ¯ - */ - void updateSimpleModel(Long userId, @Valid BpmSimpleModelUpdateReqVO reqVO); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelServiceImpl.java deleted file mode 100644 index f4815c2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmModelServiceImpl.java +++ /dev/null @@ -1,432 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.validation.ValidationUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelSaveReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelUpdateReqVO; -import com.zt.plat.module.bpm.convert.definition.BpmModelConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmModelTypeEnum; -import com.zt.plat.module.bpm.enums.task.BpmReasonEnum; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.SimpleModelUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceCopyService; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.*; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ModelQuery; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.util.*; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertMap; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; -import static com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseCandidateStrategy; - -/** - * æµç¨‹æ¨¡åž‹å®žçŽ°ï¼šä¸»è¦è¿›è¡Œ Flowable {@link Model} 的维护 - * - * @author yunlongn - * @author ZT - * @author jason - */ -@Service -@Validated -@Slf4j -public class BpmModelServiceImpl implements BpmModelService { - - @Resource - private RepositoryService repositoryService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmFormService bpmFormService; - - @Resource - private BpmTaskCandidateInvoker taskCandidateInvoker; - - @Resource - private HistoryService historyService; - @Resource - private RuntimeService runtimeService; - @Resource - private TaskService taskService; - @Resource - private BpmProcessInstanceCopyService processInstanceCopyService; - - @Override - public List getModelList(String name) { - ModelQuery modelQuery = repositoryService.createModelQuery(); - if (StrUtil.isNotEmpty(name)) { - modelQuery.modelNameLike("%" + name + "%"); - } - modelQuery.modelTenantId(FlowableUtils.getTenantId()); - return modelQuery.list(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createModel(@Valid BpmModelSaveReqVO createReqVO) { - if (!ValidationUtils.isXmlNCName(createReqVO.getKey())) { - throw exception(MODEL_KEY_VALID); - } - // 1. 校验æµç¨‹æ ‡è¯†å·²ç»å­˜åœ¨ - Model keyModel = getModelByKey(createReqVO.getKey()); - if (keyModel != null) { - throw exception(MODEL_KEY_EXISTS, createReqVO.getKey()); - } - - // 2. 创建 Model 对象 - createReqVO.setSort(System.currentTimeMillis()); // ä½¿ç”¨å½“å‰æ—¶é—´ï¼Œä½œä¸ºæŽ’åº - Model model = repositoryService.newModel(); - BpmModelConvert.INSTANCE.copyToModel(model, createReqVO); - model.setTenantId(FlowableUtils.getTenantId()); - - // 3. ä¿å­˜æ¨¡åž‹ - saveModel(model, createReqVO); - return model.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个æ“作,所以开å¯äº‹åŠ¡ - public void updateModel(Long userId, BpmModelSaveReqVO updateReqVO) { - // 1. 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(updateReqVO.getId(), userId); - - // 2. å¡«å…… Model ä¿¡æ¯ - BpmModelConvert.INSTANCE.copyToModel(model, updateReqVO); - - // 3. ä¿å­˜æ¨¡åž‹ - saveModel(model, updateReqVO); - } - - /** - * ä¿å­˜æ¨¡åž‹çš„基本信æ¯ã€æµç¨‹å›¾ - * - * @param model 模型 - * @param saveReqVO ä¿å­˜ä¿¡æ¯ - */ - private void saveModel(Model model, BpmModelSaveReqVO saveReqVO) { - // 1. ä¿å­˜æ¨¡åž‹çš„åŸºç¡€ä¿¡æ¯ - repositoryService.saveModel(model); - - // 2. ä¿å­˜æµç¨‹å›¾ - if (ObjUtil.equals(BpmModelTypeEnum.BPMN.getType(), saveReqVO.getType()) - && StrUtil.isNotEmpty(saveReqVO.getBpmnXml())) { - updateModelBpmnXml(model.getId(), saveReqVO.getBpmnXml()); - } else if (ObjUtil.equals(BpmModelTypeEnum.SIMPLE.getType(), saveReqVO.getType()) - && saveReqVO.getSimpleModel() != null) { - // JSON è½¬æ¢æˆ bpmnModel - BpmnModel bpmnModel = SimpleModelUtils.buildBpmnModel(model.getKey(), model.getName(), - saveReqVO.getSimpleModel()); - // ä¿å­˜ Bpmn XML - updateModelBpmnXml(model.getId(), BpmnModelUtils.getBpmnXml(bpmnModel)); - // ä¿å­˜ JSON æ•°æ® - updateModelSimpleJson(model.getId(), saveReqVO.getSimpleModel()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateModelSortBatch(Long userId, List ids) { - // 1.1 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - List models = repositoryService.createModelQuery() - .modelTenantId(FlowableUtils.getTenantId()).list(); - models.removeIf(model -> !ids.contains(model.getId())); - if (ids.size() != models.size()) { - throw exception(MODEL_NOT_EXISTS); - } - Map modelMap = convertMap(models, Model::getId); - // 1.2 校验是å¦ä¸ºç®¡ç†å‘˜ - ids.forEach(id -> validateModelManager(id, userId)); - - // ä¿å­˜æŽ’åº - long sort = System.currentTimeMillis(); // 使用时间戳 - i ä½œä¸ºæŽ’åº - for (int i = ids.size() - 1; i > 0; i--) { - Model model = modelMap.get(ids.get(i)); - // 更新模型 - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model).setSort(sort); - model.setMetaInfo(JsonUtils.toJsonString(metaInfo)); - repositoryService.saveModel(model); - // æ›´æ–°æŽ’åº - processDefinitionService.updateProcessDefinitionSortByModelId(model.getId(), sort); - sort--; - } - } - - private Model validateModelExists(String id) { - Model model = repositoryService.getModel(id); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - return model; - } - - /** - * æ ¡éªŒæ˜¯å¦æœ‰æµç¨‹æ¨¡åž‹çš„ç®¡ç†æƒé™ - * - * @param id æµç¨‹æ¨¡åž‹ç¼–å· - * @param userId ç”¨æˆ·ç¼–å· - * @return æµç¨‹æ¨¡åž‹ - */ - private Model validateModelManager(String id, Long userId) { - Model model = validateModelExists(id); - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); - if (metaInfo == null || !CollUtil.contains(metaInfo.getManagerUserIds(), userId)) { - throw exception(MODEL_UPDATE_FAIL_NOT_MANAGER, model.getName()); - } - return model; - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个æ“作,所以开å¯äº‹åŠ¡ - public void deployModel(Long userId, String id) { - // 1.1 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(id, userId); - BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); - // 1.2 校验æµç¨‹å›¾ - byte[] bpmnBytes = getModelBpmnXML(model.getId()); - validateBpmnXml(bpmnBytes, metaInfo.getType()); - // 1.3 校验表å•å·²é… - BpmFormDO form = validateFormConfig(metaInfo); - // 1.4 校验任务分é…规则已é…ç½® - taskCandidateInvoker.validateBpmnConfig(bpmnBytes); - // 1.5 获å–仿钉钉æµç¨‹è®¾è®¡å™¨æ¨¡åž‹æ•°æ® - String simpleJson = getModelSimpleJson(model.getId()); - - // 2.1 创建æµç¨‹å®šä¹‰ - String definitionId = processDefinitionService.createProcessDefinition(model, metaInfo, bpmnBytes, simpleJson, - form); - - // 2.2 å°†è€çš„æµç¨‹å®šä¹‰è¿›è¡ŒæŒ‚èµ·ã€‚ä¹Ÿå°±æ˜¯è¯´ï¼Œåªæœ‰æœ€æ–°éƒ¨ç½²çš„æµç¨‹å®šä¹‰ï¼Œæ‰å¯ä»¥å‘起任务。 - updateProcessDefinitionSuspended(model.getDeploymentId()); - - // 2.3 æ›´æ–° model çš„ deploymentIdï¼Œè¿›è¡Œå…³è” - ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId); - model.setDeploymentId(definition.getDeploymentId()); - repositoryService.saveModel(model); - } - - private void validateBpmnXml(byte[] bpmnBytes, Integer type) { - BpmnModel bpmnModel = BpmnModelUtils.getBpmnModel(bpmnBytes); - if (bpmnModel == null) { - throw exception(MODEL_NOT_EXISTS); - } - // 1. 没有 StartEvent - StartEvent startEvent = BpmnModelUtils.getStartEvent(bpmnModel); - if (startEvent == null) { - throw exception(MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS); - } - // 2. 校验 UserTask çš„ name 都é…置了 - List userTasks = BpmnModelUtils.getBpmnModelElements(bpmnModel, UserTask.class); - userTasks.forEach(userTask -> { - if (StrUtil.isEmpty(userTask.getName())) { - throw exception(MODEL_DEPLOY_FAIL_BPMN_USER_TASK_NAME_NOT_EXISTS, userTask.getId()); - } - }); - // 3. 校验第一个用户任务节点的规则类型是å¦ä¸ºâ€œå®¡æ‰¹äººè‡ªé€‰â€ï¼ŒBPMN 设计器,校验第一个用户任务节点,SIMPLE 设计器,第一个节点固定为å‘起人所以校验第二个用户任务节点 - UserTask firUserTask = CollUtil.get(userTasks, BpmModelTypeEnum.BPMN.getType().equals(type) ? 0 : 1); - if (firUserTask == null) { - return; - } - Integer candidateStrategy = parseCandidateStrategy(firUserTask); - if (Objects.equals(candidateStrategy, BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT.getStrategy())) { - throw exception(MODEL_DEPLOY_FAIL_FIRST_USER_TASK_CANDIDATE_STRATEGY_ERROR, firUserTask.getName()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteModel(Long userId, String id) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(id, userId); - - // 执行删除 - repositoryService.deleteModel(id); - // ç¦ç”¨æµç¨‹å®šä¹‰ - updateProcessDefinitionSuspended(model.getDeploymentId()); - } - - @Override - public void cleanModel(Long userId, String id) { - // 1. 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(id, userId); - - // 2. æ¸…ç†æ‰€æœ‰æµç¨‹æ•°æ® - // 2.1 å…ˆå–æ¶ˆæ‰€æœ‰æ­£åœ¨è¿è¡Œçš„æµç¨‹ - List processInstances = runtimeService.createProcessInstanceQuery() - .processDefinitionKey(model.getKey()).list(); - processInstances.forEach(processInstance -> { - runtimeService.deleteProcessInstance(processInstance.getId(), - BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); - historyService.deleteHistoricProcessInstance(processInstance.getId()); - processInstanceCopyService.deleteProcessInstanceCopy(processInstance.getId()); - }); - // 2.2 å†ä»Žåކå²ä¸­åˆ é™¤æ‰€æœ‰ç›¸å…³çš„æµç¨‹æ•°æ® - List historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .processDefinitionKey(model.getKey()).list(); - historicProcessInstances.forEach(historicProcessInstance -> { - historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); - processInstanceCopyService.deleteProcessInstanceCopy(historicProcessInstance.getId()); - }); - // 2.3 æ¸…ç†æ‰€æœ‰ Task - List tasks = taskService.createTaskQuery() - .processDefinitionKey(model.getKey()).list(); - tasks.forEach(task -> taskService.deleteTask(task.getId(),BpmReasonEnum.CANCEL_BY_PROCESS_CLEAN.getReason())); - } - - @Override - public void updateModelState(Long userId, String id, Integer state) { - // 1.1 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(id, userId); - // 1.2 校验æµç¨‹å®šä¹‰å­˜åœ¨ - ProcessDefinition definition = processDefinitionService - .getProcessDefinitionByDeploymentId(model.getDeploymentId()); - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - - // 2. æ›´æ–°çŠ¶æ€ - processDefinitionService.updateProcessDefinitionState(definition.getId(), state); - } - - @Override - public BpmnModel getBpmnModelByDefinitionId(String processDefinitionId) { - return repositoryService.getBpmnModel(processDefinitionId); - } - - @Override - public BpmSimpleModelNodeVO getSimpleModel(String modelId) { - Model model = validateModelExists(modelId); - // 通过 ACT_RE_MODEL 表 EDITOR_SOURCE_EXTRA_VALUE_ID_ ,获å–ä»¿é’‰é’‰å¿«æ­æ¨¡åž‹çš„ JSON æ•°æ® - String json = getModelSimpleJson(model.getId()); - return JsonUtils.parseObject(json, BpmSimpleModelNodeVO.class); - } - - @Override - public void updateSimpleModel(Long userId, BpmSimpleModelUpdateReqVO reqVO) { - // 1. 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = validateModelManager(reqVO.getId(), userId); - - // 2.1 JSON è½¬æ¢æˆ bpmnModel - BpmnModel bpmnModel = SimpleModelUtils.buildBpmnModel(model.getKey(), model.getName(), reqVO.getSimpleModel()); - // 2.2 ä¿å­˜ Bpmn XML - updateModelBpmnXml(model.getId(), BpmnModelUtils.getBpmnXml(bpmnModel)); - // 2.3 ä¿å­˜ JSON æ•°æ® - updateModelSimpleJson(model.getId(), reqVO.getSimpleModel()); - } - - /** - * 校验æµç¨‹è¡¨å•å·²é…ç½® - * - * @param metaInfo æµç¨‹æ¨¡åž‹å…ƒæ•°æ® - * @return 表å•é…ç½® - */ - private BpmFormDO validateFormConfig(BpmModelMetaInfoVO metaInfo) { - if (metaInfo == null || metaInfo.getFormType() == null) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - // 校验表å•存在 - if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - if (metaInfo.getFormId() == null) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - BpmFormDO form = bpmFormService.getForm(metaInfo.getFormId()); - if (form == null) { - throw exception(FORM_NOT_EXISTS); - } - return form; - } else { - if (StrUtil.isEmpty(metaInfo.getFormCustomCreatePath()) - || StrUtil.isEmpty(metaInfo.getFormCustomViewPath())) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - return null; - } - } - - @Override - public void updateModelBpmnXml(String id, String bpmnXml) { - if (StrUtil.isEmpty(bpmnXml)) { - return; - } - repositoryService.addModelEditorSource(id, StrUtil.utf8Bytes(bpmnXml)); - } - - @SuppressWarnings("JavaExistingMethodCanBeUsed") - private String getModelSimpleJson(String id) { - byte[] bytes = repositoryService.getModelEditorSourceExtra(id); - if (ArrayUtil.isEmpty(bytes)) { - return null; - } - return StrUtil.utf8Str(bytes); - } - - private void updateModelSimpleJson(String id, BpmSimpleModelNodeVO node) { - if (node == null) { - return; - } - byte[] bytes = JsonUtils.toJsonByte(node); - repositoryService.addModelEditorSourceExtra(id, bytes); - } - - /** - * 挂起 deploymentId 对应的æµç¨‹å®šä¹‰ - *

- * 注æ„:这里一个 deploymentId åªå…³è”一个æµç¨‹å®šä¹‰ - * - * @param deploymentId æµç¨‹å‘布Id - */ - private void updateProcessDefinitionSuspended(String deploymentId) { - if (StrUtil.isEmpty(deploymentId)) { - return; - } - ProcessDefinition oldDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(deploymentId); - if (oldDefinition == null) { - return; - } - processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), - SuspensionState.SUSPENDED.getStateCode()); - } - - private Model getModelByKey(String key) { - return repositoryService.createModelQuery() - .modelTenantId(FlowableUtils.getTenantId()) - .modelKey(key).singleResult(); - } - - @Override - public Model getModel(String id) { - return repositoryService.getModel(id); - } - - @Override - public byte[] getModelBpmnXML(String id) { - return repositoryService.getModelEditorSource(id); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionService.java deleted file mode 100644 index f819b48..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionService.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * æµç¨‹å®šä¹‰æŽ¥å£ - * - * @author yunlong.li - * @author ZJQ - * @author ZT - */ -public interface BpmProcessDefinitionService { - - /** - * 获得æµç¨‹å®šä¹‰åˆ†é¡µ - * - * @param pageReqVO åˆ†é¡µå…¥å‚ - * @return æµç¨‹å®šä¹‰ Page - */ - PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO); - - /** - * 获得æµç¨‹å®šä¹‰åˆ—表 - * - * @param suspensionState ä¸­æ–­çŠ¶æ€ - * @return æµç¨‹å®šä¹‰åˆ—表 - */ - List getProcessDefinitionListBySuspensionState(Integer suspensionState); - - /** - * 基于æµç¨‹æ¨¡åž‹ï¼Œåˆ›å»ºæµç¨‹å®šä¹‰ - * - * @param model æµç¨‹æ¨¡åž‹ - * @param modelMetaInfo æµç¨‹æ¨¡åž‹å…ƒä¿¡æ¯ - * @param bpmnBytes BPMN XML 字节数组 - * @param simpleJson SIMPLE Model JSON - * @param form è¡¨å• - * @return æµç¨‹ç¼–å· - */ - String createProcessDefinition(Model model, BpmModelMetaInfoVO modelMetaInfo, - byte[] bpmnBytes, String simpleJson, BpmFormDO form); - - /** - * æ›´æ–°æµç¨‹å®šä¹‰çŠ¶æ€ - * - * @param id æµç¨‹å®šä¹‰çš„ç¼–å· - * @param state çŠ¶æ€ - */ - void updateProcessDefinitionState(String id, Integer state); - - /** - * æ›´æ–°æ¨¡åž‹ç¼–å· - * - * @param modelId æµç¨‹å®šä¹‰ç¼–å· - * @param sort æŽ’åº - */ - void updateProcessDefinitionSortByModelId(String modelId, Long sort); - - /** - * 获得æµç¨‹å®šä¹‰å¯¹åº”çš„ BPMN - * - * @param id æµç¨‹å®šä¹‰ç¼–å· - * @return BPMN - */ - BpmnModel getProcessDefinitionBpmnModel(String id); - - /** - * 获得æµç¨‹å®šä¹‰çš„ä¿¡æ¯ - * - * @param id æµç¨‹å®šä¹‰ç¼–å· - * @return æµç¨‹å®šä¹‰ä¿¡æ¯ - */ - BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id); - - /** - * 获得æµç¨‹å®šä¹‰çš„ä¿¡æ¯ List - * - * @param ids æµç¨‹å®šä¹‰ç¼–å·æ•°ç»„ - * @return æµç¨‹é¢å®šä¹‰ä¿¡æ¯æ•°ç»„ - */ - List getProcessDefinitionInfoList(Collection ids); - - default Map getProcessDefinitionInfoMap(Set ids) { - return convertMap(getProcessDefinitionInfoList(ids), BpmProcessDefinitionInfoDO::getProcessDefinitionId); - } - - /** - * 获得æµç¨‹å®šä¹‰ç¼–å·å¯¹åº”çš„ ProcessDefinition - * - * @param id æµç¨‹å®šä¹‰ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinition(String id); - - /** - * 获得 ids 对应的 ProcessDefinition 数组 - * - * @param ids ç¼–å·çš„æ•°ç»„ - * @return æµç¨‹å®šä¹‰çš„æ•°ç»„ - */ - List getProcessDefinitionList(Set ids); - - default Map getProcessDefinitionMap(Set ids) { - return convertMap(getProcessDefinitionList(ids), ProcessDefinition::getId); - } - - /** - * 获得 deploymentId 对应的 ProcessDefinition - * - * @param deploymentId éƒ¨ç½²ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId); - - /** - * 获得 deploymentIds 对应的 ProcessDefinition 数组 - * - * @param deploymentIds 部署编å·çš„æ•°ç»„ - * @return æµç¨‹å®šä¹‰çš„æ•°ç»„ - */ - List getProcessDefinitionListByDeploymentIds(Set deploymentIds); - - /** - * 获得æµç¨‹å®šä¹‰æ ‡è¯†å¯¹åº”的激活的æµç¨‹å®šä¹‰ - * - * @param key æµç¨‹å®šä¹‰çš„æ ‡è¯† - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getActiveProcessDefinition(String key); - - /** - * 判断用户是å¦å¯ä»¥ä½¿ç”¨è¯¥æµç¨‹å®šä¹‰ï¼Œè¿›è¡Œæµç¨‹çš„å‘èµ· - * - * @param processDefinition æµç¨‹å®šä¹‰ - * @param userId ç”¨æˆ·ç¼–å· - * @return 是å¦å¯ä»¥å‘èµ·æµç¨‹ - */ - boolean canUserStartProcessDefinition(BpmProcessDefinitionInfoDO processDefinition, Long userId); - - /** - * 获得 ids 对应的 Deployment Map - * - * @param ids 部署编å·çš„æ•°ç»„ - * @return æµç¨‹éƒ¨ç½² Map - */ - default Map getDeploymentMap(Set ids) { - return convertMap(getDeploymentList(ids), Deployment::getId); - } - - /** - * 获得 ids 对应的 Deployment 数组 - * - * @param ids 部署编å·çš„æ•°ç»„ - * @return æµç¨‹éƒ¨ç½²çš„æ•°ç»„ - */ - List getDeploymentList(Set ids); - - /** - * 获得 id 对应的 Deployment - * - * @param id éƒ¨ç½²ç¼–å· - * @return æµç¨‹éƒ¨ç½² - */ - Deployment getDeployment(String id); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java deleted file mode 100644 index f2f1d6e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.framework.common.util.object.PageUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.dal.mysql.definition.BpmProcessDefinitionInfoMapper; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.repository.ProcessDefinitionQuery; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.*; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.addIfNotNull; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; -import static java.util.Collections.emptyList; - -/** - * æµç¨‹å®šä¹‰å®žçް - * 主è¦è¿›è¡Œ Flowable {@link ProcessDefinition} å’Œ {@link Deployment} 的维护 - * - * @author yunlongn - * @author ZJQ - * @author ZT - */ -@Service -@Validated -@Slf4j -public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { - - @Resource - private RepositoryService repositoryService; - - @Resource - private BpmProcessDefinitionInfoMapper processDefinitionMapper; - - @Resource - private AdminUserApi adminUserApi; - - @Override - public ProcessDefinition getProcessDefinition(String id) { - return repositoryService.getProcessDefinition(id); - } - - @Override - public List getProcessDefinitionList(Set ids) { - return repositoryService.createProcessDefinitionQuery().processDefinitionIds(ids).list(); - } - - @Override - public ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId) { - if (StrUtil.isEmpty(deploymentId)) { - return null; - } - return repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); - } - - @Override - public List getProcessDefinitionListByDeploymentIds(Set deploymentIds) { - if (CollUtil.isEmpty(deploymentIds)) { - return emptyList(); - } - return repositoryService.createProcessDefinitionQuery().deploymentIds(deploymentIds).list(); - } - - @Override - public ProcessDefinition getActiveProcessDefinition(String key) { - return repositoryService.createProcessDefinitionQuery() - .processDefinitionTenantId(FlowableUtils.getTenantId()) - .processDefinitionKey(key).active().singleResult(); - } - - @Override - public boolean canUserStartProcessDefinition(BpmProcessDefinitionInfoDO processDefinition, Long userId) { - if (processDefinition == null) { - return false; - } - - // 校验用户是å¦åœ¨å…许å‘起的用户列表中 - if (CollUtil.isNotEmpty(processDefinition.getStartUserIds())) { - return processDefinition.getStartUserIds().contains(userId); - } - - // 校验用户是å¦åœ¨å…许å‘起的部门列表中 - if (CollUtil.isNotEmpty(processDefinition.getStartDeptIds())) { - AdminUserRespDTO user = adminUserApi.getUser(userId).getCheckedData(); - return user != null - && DeptUtil.getDeptId(user) > 0L - && processDefinition.getStartDeptIds().contains(DeptUtil.getDeptId(user)); - } - - // 都为空,则所有人都å¯ä»¥å‘èµ· - return true; - } - - @Override - public List getDeploymentList(Set ids) { - if (CollUtil.isEmpty(ids)) { - return emptyList(); - } - List list = new ArrayList<>(ids.size()); - for (String id : ids) { - addIfNotNull(list, getDeployment(id)); - } - return list; - } - - @Override - public Deployment getDeployment(String id) { - if (StrUtil.isEmpty(id)) { - return null; - } - return repositoryService.createDeploymentQuery().deploymentId(id).singleResult(); - } - - @Override - public String createProcessDefinition(Model model, BpmModelMetaInfoVO modelMetaInfo, - byte[] bpmnBytes, String simpleJson, BpmFormDO form) { - // 创建 Deployment 部署 - Deployment deploy = repositoryService.createDeployment() - .key(model.getKey()).name(model.getName()).category(model.getCategory()) - .addBytes(model.getKey() + BpmnModelConstants.BPMN_FILE_SUFFIX, bpmnBytes) - .tenantId(FlowableUtils.getTenantId()) - .disableSchemaValidation() // ç¦ç”¨ XML Schema 验è¯ï¼Œå› ä¸ºæœ‰è‡ªå®šä¹‰çš„属性 - .deploy(); - - // 设置 ProcessDefinition çš„ category 分类 - ProcessDefinition definition = repositoryService.createProcessDefinitionQuery() - .deploymentId(deploy.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); - // æ³¨æ„ 1,ProcessDefinition çš„ key å’Œ name 是通过 BPMN 中的 çš„ id å’Œ name 决定 - // æ³¨æ„ 2,目å‰è¯¥é¡¹ç›®çš„设计上,需è¦ä¿è¯ Modelã€Deploymentã€ProcessDefinition 使用相åŒçš„ key,ä¿è¯å…³è”性。 - // å¦åˆ™ï¼Œä¼šå¯¼è‡´ ProcessDefinition 的分页无法查询到。 - if (!Objects.equals(definition.getKey(), model.getKey())) { - throw exception(PROCESS_DEFINITION_KEY_NOT_MATCH, model.getKey(), definition.getKey()); - } - if (!Objects.equals(definition.getName(), model.getName())) { - throw exception(PROCESS_DEFINITION_NAME_NOT_MATCH, model.getName(), definition.getName()); - } - - // æ’入拓展表 - BpmProcessDefinitionInfoDO definitionDO = BeanUtils.toBean(modelMetaInfo, BpmProcessDefinitionInfoDO.class) - .setModelId(model.getId()).setCategory(model.getCategory()).setProcessDefinitionId(definition.getId()) - .setModelType(modelMetaInfo.getType()).setSimpleModel(simpleJson); - if (form != null) { - definitionDO.setFormFields(form.getFields()).setFormConf(form.getConf()); - } - processDefinitionMapper.insert(definitionDO); - return definition.getId(); - } - - @Override - public void updateProcessDefinitionState(String id, Integer state) { - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(id); - if (processDefinition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - - // 激活 - if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { - if (processDefinition.isSuspended()) { - repositoryService.activateProcessDefinitionById(id, false, null); - } - return; - } - // 挂起 - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { - // suspendProcessInstances = false,进行中的任务,ä¸è¿›è¡ŒæŒ‚起。 - // 原因:åªè¦æ–°çš„æµç¨‹ä¸å…许å‘èµ·å³å¯ï¼Œè€æµç¨‹ç»§ç»­å¯ä»¥æ‰§è¡Œã€‚ - if (!processDefinition.isSuspended()) { - repositoryService.suspendProcessDefinitionById(id, false, null); - } - return; - } - log.error("[updateProcessDefinitionState][æµç¨‹å®šä¹‰({}) 修改未知状æ€({})]", id, state); - } - - @Override - public void updateProcessDefinitionSortByModelId(String modelId, Long sort) { - processDefinitionMapper.updateByModelId(modelId, new BpmProcessDefinitionInfoDO().setSort(sort)); - } - - @Override - public BpmnModel getProcessDefinitionBpmnModel(String id) { - return repositoryService.getBpmnModel(id); - } - - @Override - public BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id) { - return processDefinitionMapper.selectByProcessDefinitionId(id); - } - - @Override - public List getProcessDefinitionInfoList(Collection ids) { - return processDefinitionMapper.selectListByProcessDefinitionIds(ids); - } - - @Override - public PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { - ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); - query.processDefinitionTenantId(FlowableUtils.getTenantId()); - if (StrUtil.isNotBlank(pageVO.getKey())) { - query.processDefinitionKey(pageVO.getKey()); - } - // 执行查询 - long count = query.count(); - if (count == 0) { - return PageResult.empty(count); - } - List list = query.orderByProcessDefinitionVersion().desc() - .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - return new PageResult<>(list, count); - } - - @Override - public List getProcessDefinitionListBySuspensionState(Integer suspensionState) { - // 拼接查询æ¡ä»¶ - ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), suspensionState)) { - query.suspended(); - } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), suspensionState)) { - query.active(); - } - // 执行查询 - query.processDefinitionTenantId(FlowableUtils.getTenantId()); - return query.list(); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionService.java deleted file mode 100644 index 448300c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO; -import jakarta.validation.Valid; - -/** - * BPM æµç¨‹è¡¨è¾¾å¼ Service æŽ¥å£ - * - * @author ZT - */ -public interface BpmProcessExpressionService { - - /** - * 创建æµç¨‹è¡¨è¾¾å¼ - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createProcessExpression(@Valid BpmProcessExpressionSaveReqVO createReqVO); - - /** - * æ›´æ–°æµç¨‹è¡¨è¾¾å¼ - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateProcessExpression(@Valid BpmProcessExpressionSaveReqVO updateReqVO); - - /** - * 删除æµç¨‹è¡¨è¾¾å¼ - * - * @param id ç¼–å· - */ - void deleteProcessExpression(Long id); - - /** - * 获得æµç¨‹è¡¨è¾¾å¼ - * - * @param id ç¼–å· - * @return æµç¨‹è¡¨è¾¾å¼ - */ - BpmProcessExpressionDO getProcessExpression(Long id); - - /** - * 获得æµç¨‹è¡¨è¾¾å¼åˆ†é¡µ - * - * @param pageReqVO 分页查询 - * @return æµç¨‹è¡¨è¾¾å¼åˆ†é¡µ - */ - PageResult getProcessExpressionPage(BpmProcessExpressionPageReqVO pageReqVO); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionServiceImpl.java deleted file mode 100644 index e367aff..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessExpressionServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO; -import com.zt.plat.module.bpm.dal.mysql.definition.BpmProcessExpressionMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.PROCESS_EXPRESSION_NOT_EXISTS; - -/** - * BPM æµç¨‹è¡¨è¾¾å¼ Service 实现类 - * - * @author ZT - */ -@Service -@Validated -public class BpmProcessExpressionServiceImpl implements BpmProcessExpressionService { - - @Resource - private BpmProcessExpressionMapper processExpressionMapper; - - @Override - public Long createProcessExpression(BpmProcessExpressionSaveReqVO createReqVO) { - // æ’å…¥ - BpmProcessExpressionDO processExpression = BeanUtils.toBean(createReqVO, BpmProcessExpressionDO.class); - processExpressionMapper.insert(processExpression); - // 返回 - return processExpression.getId(); - } - - @Override - public void updateProcessExpression(BpmProcessExpressionSaveReqVO updateReqVO) { - // 校验存在 - validateProcessExpressionExists(updateReqVO.getId()); - // æ›´æ–° - BpmProcessExpressionDO updateObj = BeanUtils.toBean(updateReqVO, BpmProcessExpressionDO.class); - processExpressionMapper.updateById(updateObj); - } - - @Override - public void deleteProcessExpression(Long id) { - // 校验存在 - validateProcessExpressionExists(id); - // 删除 - processExpressionMapper.deleteById(id); - } - - private void validateProcessExpressionExists(Long id) { - if (processExpressionMapper.selectById(id) == null) { - throw exception(PROCESS_EXPRESSION_NOT_EXISTS); - } - } - - @Override - public BpmProcessExpressionDO getProcessExpression(Long id) { - return processExpressionMapper.selectById(id); - } - - @Override - public PageResult getProcessExpressionPage(BpmProcessExpressionPageReqVO pageReqVO) { - return processExpressionMapper.selectPage(pageReqVO); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerService.java deleted file mode 100644 index 9f111a7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; -import jakarta.validation.Valid; - -/** - * BPM æµç¨‹ç›‘å¬å™¨ Service æŽ¥å£ - * - * @author ZT - */ -public interface BpmProcessListenerService { - - /** - * 创建æµç¨‹ç›‘å¬å™¨ - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createProcessListener(@Valid BpmProcessListenerSaveReqVO createReqVO); - - /** - * æ›´æ–°æµç¨‹ç›‘å¬å™¨ - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateProcessListener(@Valid BpmProcessListenerSaveReqVO updateReqVO); - - /** - * 删除æµç¨‹ç›‘å¬å™¨ - * - * @param id ç¼–å· - */ - void deleteProcessListener(Long id); - - /** - * 获得æµç¨‹ç›‘å¬å™¨ - * - * @param id ç¼–å· - * @return æµç¨‹ç›‘å¬å™¨ - */ - BpmProcessListenerDO getProcessListener(Long id); - - /** - * 获得æµç¨‹ç›‘å¬å™¨åˆ†é¡µ - * - * @param pageReqVO 分页查询 - * @return æµç¨‹ç›‘å¬å™¨åˆ†é¡µ - */ - PageResult getProcessListenerPage(BpmProcessListenerPageReqVO pageReqVO); - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerServiceImpl.java deleted file mode 100644 index 916949b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmProcessListenerServiceImpl.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; -import com.zt.plat.module.bpm.dal.mysql.definition.BpmProcessListenerMapper; -import com.zt.plat.module.bpm.enums.definition.BpmProcessListenerTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmProcessListenerValueTypeEnum; -import jakarta.annotation.Resource; -import org.flowable.engine.delegate.JavaDelegate; -import org.flowable.engine.delegate.TaskListener; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; - -/** - * BPM æµç¨‹ç›‘å¬å™¨ Service 实现类 - * - * @author ZT - */ -@Service -@Validated -public class BpmProcessListenerServiceImpl implements BpmProcessListenerService { - - @Resource - private BpmProcessListenerMapper processListenerMapper; - - @Override - public Long createProcessListener(BpmProcessListenerSaveReqVO createReqVO) { - // 校验 - validateCreateProcessListenerValue(createReqVO); - // æ’å…¥ - BpmProcessListenerDO processListener = BeanUtils.toBean(createReqVO, BpmProcessListenerDO.class); - processListenerMapper.insert(processListener); - return processListener.getId(); - } - - @Override - public void updateProcessListener(BpmProcessListenerSaveReqVO updateReqVO) { - // 校验存在 - validateProcessListenerExists(updateReqVO.getId()); - validateCreateProcessListenerValue(updateReqVO); - // æ›´æ–° - BpmProcessListenerDO updateObj = BeanUtils.toBean(updateReqVO, BpmProcessListenerDO.class); - processListenerMapper.updateById(updateObj); - } - - private void validateCreateProcessListenerValue(BpmProcessListenerSaveReqVO createReqVO) { - // class 类型 - if (createReqVO.getValueType().equals(BpmProcessListenerValueTypeEnum.CLASS.getType())) { - try { - Class clazz = Class.forName(createReqVO.getValue()); - if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.EXECUTION.getType()) - && !JavaDelegate.class.isAssignableFrom(clazz)) { - throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), - JavaDelegate.class.getName()); - } else if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.TASK.getType()) - && !TaskListener.class.isAssignableFrom(clazz)) { - throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), - TaskListener.class.getName()); - } - } catch (ClassNotFoundException e) { - throw exception(PROCESS_LISTENER_CLASS_NOT_FOUND, createReqVO.getValue()); - } - return; - } - // è¡¨è¾¾å¼ - if (!StrUtil.startWith(createReqVO.getValue(), "${") || !StrUtil.endWith(createReqVO.getValue(), "}")) { - throw exception(PROCESS_LISTENER_EXPRESSION_INVALID, createReqVO.getValue()); - } - } - - @Override - public void deleteProcessListener(Long id) { - // 校验存在 - validateProcessListenerExists(id); - // 删除 - processListenerMapper.deleteById(id); - } - - private void validateProcessListenerExists(Long id) { - if (processListenerMapper.selectById(id) == null) { - throw exception(PROCESS_LISTENER_NOT_EXISTS); - } - } - - @Override - public BpmProcessListenerDO getProcessListener(Long id) { - return processListenerMapper.selectById(id); - } - - @Override - public PageResult getProcessListenerPage(BpmProcessListenerPageReqVO pageReqVO) { - return processListenerMapper.selectPage(pageReqVO); - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupService.java deleted file mode 100644 index 40bfea3..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import jakarta.validation.Valid; - -import java.util.Collection; -import java.util.List; - -/** - * 用户组 Service æŽ¥å£ - * - * @author ZT - */ -public interface BpmUserGroupService { - - /** - * 创建用户组 - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createUserGroup(@Valid BpmUserGroupSaveReqVO createReqVO); - - /** - * 更新用户组 - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateUserGroup(@Valid BpmUserGroupSaveReqVO updateReqVO); - - /** - * 删除用户组 - * - * @param id ç¼–å· - */ - void deleteUserGroup(Long id); - - /** - * 获得用户组 - * - * @param id ç¼–å· - * @return 用户组 - */ - BpmUserGroupDO getUserGroup(Long id); - - /** - * 获得用户组列表 - * - * @param ids ç¼–å· - * @return 用户组列表 - */ - List getUserGroupList(Collection ids); - - /** - * 获得指定状æ€çš„用户组列表 - * - * @param status çŠ¶æ€ - * @return 用户组列表 - */ - List getUserGroupListByStatus(Integer status); - - /** - * 获得用户组分页 - * - * @param pageReqVO 分页查询 - * @return 用户组分页 - */ - PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO); - - /** - * æ ¡éªŒç”¨æˆ·ç»„ä»¬æ˜¯å¦æœ‰æ•ˆã€‚如下情况,视为无效: - * 1. 用户组编å·ä¸å­˜åœ¨ - * 2. 用户组被ç¦ç”¨ - * - * @param ids ç”¨æˆ·ç»„ç¼–å·æ•°ç»„ - */ - void validUserGroups(Collection ids); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupServiceImpl.java deleted file mode 100644 index f0e6ddb..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/BpmUserGroupServiceImpl.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.zt.plat.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.enums.CommonStatusEnum; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import com.zt.plat.module.bpm.dal.mysql.definition.BpmUserGroupMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertMap; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.USER_GROUP_IS_DISABLE; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; - -/** - * 用户组 Service 实现类 - * - * @author ZT - */ -@Service -@Validated -public class BpmUserGroupServiceImpl implements BpmUserGroupService { - - @Resource - private BpmUserGroupMapper userGroupMapper; - - @Override - public Long createUserGroup(BpmUserGroupSaveReqVO createReqVO) { - BpmUserGroupDO userGroup = BeanUtils.toBean(createReqVO, BpmUserGroupDO.class); - userGroupMapper.insert(userGroup); - return userGroup.getId(); - } - - @Override - public void updateUserGroup(BpmUserGroupSaveReqVO updateReqVO) { - // 校验存在 - validateUserGroupExists(updateReqVO.getId()); - // æ›´æ–° - BpmUserGroupDO updateObj = BeanUtils.toBean(updateReqVO, BpmUserGroupDO.class); - userGroupMapper.updateById(updateObj); - } - - @Override - public void deleteUserGroup(Long id) { - // 校验存在 - this.validateUserGroupExists(id); - // 删除 - userGroupMapper.deleteById(id); - } - - private void validateUserGroupExists(Long id) { - if (userGroupMapper.selectById(id) == null) { - throw exception(USER_GROUP_NOT_EXISTS); - } - } - - @Override - public BpmUserGroupDO getUserGroup(Long id) { - return userGroupMapper.selectById(id); - } - - @Override - public List getUserGroupList(Collection ids) { - return userGroupMapper.selectBatchIds(ids); - } - - - @Override - public List getUserGroupListByStatus(Integer status) { - return userGroupMapper.selectListByStatus(status); - } - - @Override - public PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO) { - return userGroupMapper.selectPage(pageReqVO); - } - - @Override - public void validUserGroups(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // èŽ·å¾—ç”¨æˆ·ç»„ä¿¡æ¯ - List userGroups = userGroupMapper.selectBatchIds(ids); - Map userGroupMap = convertMap(userGroups, BpmUserGroupDO::getId); - // 校验 - ids.forEach(id -> { - BpmUserGroupDO userGroup = userGroupMap.get(id); - if (userGroup == null) { - throw exception(USER_GROUP_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { - throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); - } - }); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java deleted file mode 100644 index f99ab3a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.zt.plat.module.bpm.service.definition.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * Bpm 表å•çš„ Field 表å•项 Response DTO - * 字段的定义,å¯è§ https://github.com/JakHuang/form-generator/issues/46 文档 - * - * @author ZT - */ -@Data -public class BpmFormFieldRespDTO { - - /** - * è¡¨å•æ ‡é¢˜ - */ - private String label; - /** - * 表å•字段的属性å,å¯è‡ªå®šä¹‰ - */ - @JsonProperty(value = "vModel") - private String vModel; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java deleted file mode 100644 index 69767d9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.service.definition.dto; - -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import lombok.Data; - -/** - * BPM æµç¨‹ MetaInfo Response DTO - * 主è¦ç”¨äºŽ { Model#setMetaInfo(String)} 的存储 - * - * 最终,它的字段和 {@link com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO} 是一致的 - * - * @author ZT - */ -@Data -public class BpmModelMetaInfoRespDTO { - - /** - * æµç¨‹å›¾æ ‡ - */ - private String icon; - /** - * æµç¨‹æè¿° - */ - private String description; - - /** - * 表å•类型 - */ - private Integer formType; - /** - * 表å•ç¼–å· - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - */ - private Long formId; - /** - * 自定义表å•çš„æäº¤è·¯å¾„,使用 Vue çš„è·¯ç”±åœ°å€ - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomCreatePath; - /** - * 自定义表å•的查看路径,使用 Vue çš„è·¯ç”±åœ°å€ - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomViewPath; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java deleted file mode 100644 index 2132a21..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.zt.plat.module.bpm.service.definition.dto; - -import com.zt.plat.module.bpm.enums.definition.BpmModelFormTypeEnum; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -/** - * æµç¨‹å®šä¹‰åˆ›å»º Request DTO - */ -@Data -public class BpmProcessDefinitionCreateReqDTO { - - // ========== 模型相关 ========== - - /** - * æµç¨‹æ¨¡åž‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹æ¨¡åž‹ç¼–å·ä¸èƒ½ä¸ºç©º") - private String modelId; - /** - * æµç¨‹æ ‡è¯† - */ - @NotEmpty(message = "æµç¨‹æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String key; - /** - * æµç¨‹åç§° - */ - @NotEmpty(message = "æµç¨‹åç§°ä¸èƒ½ä¸ºç©º") - private String name; - /** - * æµç¨‹æè¿° - */ - private String description; - /** - * æµç¨‹åˆ†ç±» - */ - @NotEmpty(message = "æµç¨‹åˆ†ç±»ä¸èƒ½ä¸ºç©º") - private String category; - /** - * BPMN XML - */ - @NotEmpty(message = "BPMN XML ä¸èƒ½ä¸ºç©º") - private byte[] bpmnBytes; - - // ========== 表å•相关 ========== - - /** - * 表å•类型 - */ - @NotNull(message = "表å•类型ä¸èƒ½ä¸ºç©º") - private Integer formType; - /** - * 动æ€è¡¨å•ç¼–å· - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - */ - private Long formId; - /** - * 表å•çš„é…ç½® - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - */ - private String formConf; - /** - * 表å•项的数组 - * 在表å•类型为 {@link BpmModelFormTypeEnum#NORMAL} æ—¶ - */ - private List formFields; - /** - * 自定义表å•çš„æäº¤è·¯å¾„,使用 Vue çš„è·¯ç”±åœ°å€ - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomCreatePath; - /** - * 自定义表å•的查看路径,使用 Vue çš„è·¯ç”±åœ°å€ - * 在表å•类型为 {@link BpmModelFormTypeEnum#CUSTOM} æ—¶ - */ - private String formCustomViewPath; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageService.java deleted file mode 100644 index ccbd904..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.service.message; - -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO; -import jakarta.validation.Valid; - -/** - * BPM æ¶ˆæ¯ Service æŽ¥å£ - * - * TODO ZTï¼šæœªæ¥æ”¯æŒæ¶ˆæ¯çš„å¯é…置;ä¸åŒçš„æµç¨‹ï¼Œåœ¨ä»€ä¹ˆåœºæ™¯ä¸‹ï¼Œéœ€è¦å‘é€ä»€ä¹ˆæ¶ˆæ¯ï¼Œæ¶ˆæ¯çš„内容是什么; - * - * @author ZT - */ -public interface BpmMessageService { - - /** - * å‘逿µç¨‹å®žä¾‹è¢«é€šè¿‡çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenProcessInstanceApprove(@Valid BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO); - - /** - * å‘逿µç¨‹å®žä¾‹è¢«ä¸é€šè¿‡çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenProcessInstanceReject(@Valid BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO); - - /** - * å‘é€ä»»åŠ¡è¢«åˆ†é…çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenTaskAssigned(@Valid BpmMessageSendWhenTaskCreatedReqDTO reqDTO); - - /** - * å‘é€ä»»åŠ¡å®¡æ‰¹è¶…æ—¶çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenTaskTimeout(@Valid BpmMessageSendWhenTaskTimeoutReqDTO reqDTO); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageServiceImpl.java deleted file mode 100644 index 9650cb7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/BpmMessageServiceImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.zt.plat.module.bpm.service.message; - -import com.zt.plat.framework.web.config.WebProperties; -import com.zt.plat.module.bpm.convert.message.BpmMessageConvert; -import com.zt.plat.module.bpm.enums.message.BpmMessageEnum; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO; -import com.zt.plat.module.system.api.sms.SmsSendApi; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.HashMap; -import java.util.Map; - -/** - * BPM æ¶ˆæ¯ Service 实现类 - * - * @author ZT - */ -@Service -@Validated -@Slf4j -public class BpmMessageServiceImpl implements BpmMessageService { - - @Resource - private SmsSendApi smsSendApi; - - @Resource - private WebProperties webProperties; - - @Override - public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) { - Map templateParams = new HashMap<>(); - templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); - templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), - BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsTemplateCode(), templateParams)).checkError(); - } - - @Override - public void sendMessageWhenProcessInstanceReject(BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO) { - Map templateParams = new HashMap<>(); - templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); - templateParams.put("reason", reqDTO.getReason()); - templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), - BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsTemplateCode(), templateParams)).checkError(); - } - - @Override - public void sendMessageWhenTaskAssigned(BpmMessageSendWhenTaskCreatedReqDTO reqDTO) { - Map templateParams = new HashMap<>(); - templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); - templateParams.put("taskName", reqDTO.getTaskName()); - templateParams.put("startUserNickname", reqDTO.getStartUserNickname()); - templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(), - BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams)).checkError(); - } - - @Override - public void sendMessageWhenTaskTimeout(BpmMessageSendWhenTaskTimeoutReqDTO reqDTO) { - Map templateParams = new HashMap<>(); - templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); - templateParams.put("taskName", reqDTO.getTaskName()); - templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); - smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(), - BpmMessageEnum.TASK_TIMEOUT.getSmsTemplateCode(), templateParams)).checkError(); - } - - private String getProcessInstanceDetailUrl(String taskId) { - return webProperties.getAdminUi().getUrl() + "/bpm/process-instance/detail?id=" + taskId; - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java deleted file mode 100644 index d06cbf4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.zt.plat.module.bpm.service.message.dto; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * BPM å‘逿µç¨‹å®žä¾‹è¢«é€šè¿‡ Request DTO - */ -@Data -public class BpmMessageSendWhenProcessInstanceApproveReqDTO { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„åå­— - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„åå­—ä¸èƒ½ä¸ºç©º") - private String processInstanceName; - @NotNull(message = "å‘起人的用户编å·") - private Long startUserId; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java deleted file mode 100644 index cf4bd29..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.zt.plat.module.bpm.service.message.dto; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * BPM å‘逿µç¨‹å®žä¾‹è¢«ä¸é€šè¿‡ Request DTO - */ -@Data -public class BpmMessageSendWhenProcessInstanceRejectReqDTO { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„åå­— - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„åå­—ä¸èƒ½ä¸ºç©º") - private String processInstanceName; - @NotNull(message = "å‘起人的用户编å·") - private Long startUserId; - - /** - * ä¸é€šè¿‡ç†ç”± - */ - @NotEmpty(message = "ä¸é€šè¿‡ç†ç”±ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java deleted file mode 100644 index 03adf51..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.zt.plat.module.bpm.service.message.dto; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * BPM å‘é€ä»»åŠ¡è¢«åˆ†é… Request DTO - */ -@Data -public class BpmMessageSendWhenTaskCreatedReqDTO { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„åå­— - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„åå­—ä¸èƒ½ä¸ºç©º") - private String processInstanceName; - @NotNull(message = "å‘起人的用户编å·") - private Long startUserId; - @NotEmpty(message = "å‘起人的昵称") - private String startUserNickname; - - /** - * æµç¨‹ä»»åŠ¡çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹ä»»åŠ¡çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String taskId; - /** - * æµç¨‹ä»»åŠ¡çš„åå­— - */ - @NotEmpty(message = "æµç¨‹ä»»åŠ¡çš„åå­—ä¸èƒ½ä¸ºç©º") - private String taskName; - - /** - * å®¡æ‰¹äººçš„ç”¨æˆ·ç¼–å· - */ - @NotNull(message = "审批人的用户编å·ä¸èƒ½ä¸ºç©º") - private Long assigneeUserId; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskTimeoutReqDTO.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskTimeoutReqDTO.java deleted file mode 100644 index f9a9067..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/message/dto/BpmMessageSendWhenTaskTimeoutReqDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zt.plat.module.bpm.service.message.dto; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * BPM å‘é€ä»»åŠ¡å®¡æ‰¹è¶…æ—¶ Request DTO - */ -@Data -public class BpmMessageSendWhenTaskTimeoutReqDTO { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processInstanceId; - /** - * æµç¨‹å®žä¾‹çš„åå­— - */ - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„åå­—ä¸èƒ½ä¸ºç©º") - private String processInstanceName; - - /** - * æµç¨‹ä»»åŠ¡çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹ä»»åŠ¡çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String taskId; - /** - * æµç¨‹ä»»åŠ¡çš„åå­— - */ - @NotEmpty(message = "æµç¨‹ä»»åŠ¡çš„åå­—ä¸èƒ½ä¸ºç©º") - private String taskName; - - /** - * å®¡æ‰¹äººçš„ç”¨æˆ·ç¼–å· - */ - @NotNull(message = "审批人的用户编å·ä¸èƒ½ä¸ºç©º") - private Long assigneeUserId; - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveService.java deleted file mode 100644 index bf19ddb..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveService.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.zt.plat.module.bpm.service.oa; - - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import jakarta.validation.Valid; - -/** - * 请å‡ç”³è¯· Service æŽ¥å£ - * - * @author jason - * @author ZT - */ -public interface BpmOALeaveService { - - /** - * 创建请å‡ç”³è¯· - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); - - /** - * 更新请å‡ç”³è¯·çš„çŠ¶æ€ - * - * @param id ç¼–å· - * @param status 结果 - */ - void updateLeaveStatus(Long id, Integer status); - - /** - * 获得请å‡ç”³è¯· - * - * @param id ç¼–å· - * @return 请å‡ç”³è¯· - */ - BpmOALeaveDO getLeave(Long id); - - /** - * 获得请å‡ç”³è¯·åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页查询 - * @return 请å‡ç”³è¯·åˆ†é¡µ - */ - PageResult getLeavePage(Long userId, BpmOALeavePageReqVO pageReqVO); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveServiceImpl.java deleted file mode 100644 index fec6e27..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/BpmOALeaveServiceImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.zt.plat.module.bpm.service.oa; - -import cn.hutool.core.date.LocalDateTimeUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; -import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi; -import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import com.zt.plat.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import com.zt.plat.module.bpm.dal.mysql.oa.BpmOALeaveMapper; -import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.util.HashMap; -import java.util.Map; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS; - -/** - * OA 请å‡ç”³è¯· Service 实现类 - * - * @author jason - * @author ZT - */ -@Service -@Validated -public class BpmOALeaveServiceImpl implements BpmOALeaveService { - - /** - * OA 请å‡å¯¹åº”çš„æµç¨‹å®šä¹‰ KEY - */ - public static final String PROCESS_KEY = "oa_leave"; - - @Resource - private BpmOALeaveMapper leaveMapper; - - @Resource - private BpmProcessInstanceApi processInstanceApi; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { - // æ’å…¥ OA 请å‡å• - long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); - BpmOALeaveDO leave = BeanUtils.toBean(createReqVO, BpmOALeaveDO.class) - .setUserId(userId).setDay(day).setStatus(BpmTaskStatusEnum.RUNNING.getStatus()); - leaveMapper.insert(leave); - - // å‘èµ· BPM æµç¨‹ - Map processInstanceVariables = new HashMap<>(); - processInstanceVariables.put("day", day); - String processInstanceId = processInstanceApi.createProcessInstance(userId, - new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) - .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(leave.getId())) - .setStartUserSelectAssignees(createReqVO.getStartUserSelectAssignees())).getCheckedData(); - - // 将工作æµçš„ç¼–å·ï¼Œæ›´æ–°åˆ° OA 请å‡å•中 - leaveMapper.updateById(new BpmOALeaveDO().setId(leave.getId()).setProcessInstanceId(processInstanceId)); - return leave.getId(); - } - - @Override - public void updateLeaveStatus(Long id, Integer status) { - validateLeaveExists(id); - leaveMapper.updateById(new BpmOALeaveDO().setId(id).setStatus(status)); - } - - private void validateLeaveExists(Long id) { - if (leaveMapper.selectById(id) == null) { - throw exception(OA_LEAVE_NOT_EXISTS); - } - } - - @Override - public BpmOALeaveDO getLeave(Long id) { - return leaveMapper.selectById(id); - } - - @Override - public PageResult getLeavePage(Long userId, BpmOALeavePageReqVO pageReqVO) { - return leaveMapper.selectPage(userId, pageReqVO); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java deleted file mode 100644 index 122a6ff..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zt.plat.module.bpm.service.oa.listener; - -import com.zt.plat.module.bpm.api.event.BpmProcessInstanceStatusEvent; -import com.zt.plat.module.bpm.api.event.BpmProcessInstanceStatusEventListener; -import com.zt.plat.module.bpm.service.oa.BpmOALeaveService; -import com.zt.plat.module.bpm.service.oa.BpmOALeaveServiceImpl; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * OA 请å‡å•的结果的监å¬å™¨å®žçŽ°ç±» - * - * @author ZT - */ -@Component -public class BpmOALeaveStatusListener extends BpmProcessInstanceStatusEventListener { - - @Resource - private BpmOALeaveService leaveService; - - @Override - protected List getProcessDefinitionKey() { - return List.of(BpmOALeaveServiceImpl.PROCESS_KEY); - } - - @Override - protected void onEvent(BpmProcessInstanceStatusEvent event) { - leaveService.updateLeaveStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyService.java deleted file mode 100644 index 76350bc..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; -import jakarta.validation.constraints.NotEmpty; -import org.flowable.bpmn.model.FlowNode; - -import java.util.Collection; -import java.util.List; - -/** - * æµç¨‹æŠ„é€ Service æŽ¥å£ - * - * 现在是在审批的时候进行æµç¨‹æŠ„é€ - */ -public interface BpmProcessInstanceCopyService { - - /** - * ã€ç®¡ç†å‘˜ã€‘æµç¨‹å®žä¾‹çš„æŠ„é€ - * - * @param userIds 抄é€çš„ç”¨æˆ·ç¼–å· - * @param reason æŠ„é€æ„è§ - * @param taskId æµç¨‹ä»»åŠ¡ç¼–å· - */ - void createProcessInstanceCopy(Collection userIds, String reason, String taskId); - - /** - * ã€è‡ªåŠ¨æŠ„é€ã€‘æµç¨‹å®žä¾‹çš„æŠ„é€ - * - * @param userIds 抄é€çš„ç”¨æˆ·ç¼–å· - * @param reason æŠ„é€æ„è§ - * @param processInstanceId æµç¨‹ç¼–å· - * @param activityId æµç¨‹æ´»åŠ¨ç¼–å·ï¼ˆå¯¹åº” {@link FlowNode#getId()}) - * @param activityName 任务编å·ï¼ˆå¯¹åº” {@link FlowNode#getName()}) - * @param taskId 任务编å·ï¼Œå…许空 - */ - void createProcessInstanceCopy(Collection userIds, String reason, - @NotEmpty(message = "æµç¨‹å®žä¾‹ç¼–å·ä¸èƒ½ä¸ºç©º") String processInstanceId, - @NotEmpty(message = "æµç¨‹æ´»åŠ¨ç¼–å·ä¸èƒ½ä¸ºç©º") String activityId, - @NotEmpty(message = "æµç¨‹æ´»åЍåå­—ä¸èƒ½ä¸ºç©º") String activityName, - String taskId); - - /** - * 获得抄é€çš„æµç¨‹çš„åˆ†é¡µ - * - * @param userId 当å‰ç™»å½•用户 - * @param pageReqVO 分页请求 - * @return 抄é€çš„分页结果 - */ - PageResult getProcessInstanceCopyPage(Long userId, - BpmProcessInstanceCopyPageReqVO pageReqVO); - - /** - * åˆ é™¤æŠ„é€æµç¨‹ - * - * @param processInstanceId æµç¨‹å®žä¾‹ ID - */ - void deleteProcessInstanceCopy(String processInstanceId); - - /** - * 获得æµç¨‹çš„æŠ„é€åˆ—表 - * - * @param processInstanceId æµç¨‹å®žä¾‹ ID - * @return æŠ„é€æµç¨‹åˆ—表 - */ - List getByProcessInstanceId(String processInstanceId); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java deleted file mode 100644 index 5fec394..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import cn.hutool.core.util.ObjectUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; -import com.zt.plat.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; -import com.zt.plat.module.bpm.dal.mysql.task.BpmProcessInstanceCopyMapper; -import com.zt.plat.module.bpm.enums.ErrorCodeConstants; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.Collection; -import java.util.List; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; - -/** - * æµç¨‹æŠ„é€ Service 实现类 - * - * @author kyle - */ -@Service -@Validated -@Slf4j -public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService { - - @Resource - private BpmProcessInstanceCopyMapper processInstanceCopyMapper; - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmTaskService taskService; - - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - @Resource - @Lazy // 延迟加载,é¿å…循环ä¾èµ– - private BpmProcessDefinitionService processDefinitionService; - - @Override - public void createProcessInstanceCopy(Collection userIds, String reason, String taskId) { - Task task = taskService.getTask(taskId); - if (ObjectUtil.isNull(task)) { - throw exception(ErrorCodeConstants.TASK_NOT_EXISTS); - } - // æ‰§è¡ŒæŠ„é€ - createProcessInstanceCopy(userIds, reason, - task.getProcessInstanceId(), task.getTaskDefinitionKey(), task.getId(), task.getName()); - } - - @Override - public void createProcessInstanceCopy(Collection userIds, String reason, String processInstanceId, - String activityId, String activityName, String taskId) { - // 1.1 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); - if (processInstance == null) { - throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); - } - // 1.2 校验æµç¨‹å®šä¹‰å­˜åœ¨ - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - processInstance.getProcessDefinitionId()); - if (processDefinition == null) { - throw exception(ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS); - } - - // 2. åˆ›å»ºæŠ„é€æµç¨‹ - List copyList = convertList(userIds, userId -> new BpmProcessInstanceCopyDO() - .setUserId(userId).setReason(reason).setStartUserId(Long.valueOf(processInstance.getStartUserId())) - .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName()) - .setCategory(processDefinition.getCategory()).setTaskId(taskId) - .setActivityId(activityId).setActivityName(activityName) - .setProcessDefinitionId(processInstance.getProcessDefinitionId())); - processInstanceCopyMapper.insertBatch(copyList); - } - - @Override - public PageResult getProcessInstanceCopyPage(Long userId, - BpmProcessInstanceCopyPageReqVO pageReqVO) { - return processInstanceCopyMapper.selectPage(userId, pageReqVO); - } - - @Override - public void deleteProcessInstanceCopy(String processInstanceId) { - processInstanceCopyMapper.deleteByProcessInstanceId(processInstanceId); - } - - @Override - public List getByProcessInstanceId(String processInstanceId) { - return processInstanceCopyMapper.getByProcessInstanceId(processInstanceId); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceService.java deleted file mode 100644 index 98af5ee..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceService.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.*; -import jakarta.validation.Valid; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * æµç¨‹å®žä¾‹ Service æŽ¥å£ - * - * @author ZT - */ -public interface BpmProcessInstanceService { - - // ========== Query 查询相关方法 ========== - - /** - * 获得æµç¨‹å®žä¾‹ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹å®žä¾‹ - */ - ProcessInstance getProcessInstance(String id); - - /** - * 获得æµç¨‹å®žä¾‹åˆ—表 - * - * @param ids æµç¨‹å®žä¾‹çš„ç¼–å·é›†åˆ - * @return æµç¨‹å®žä¾‹åˆ—表 - */ - List getProcessInstances(Set ids); - - /** - * 获得æµç¨‹å®žä¾‹ Map - * - * @param ids æµç¨‹å®žä¾‹çš„ç¼–å·é›†åˆ - * @return æµç¨‹å®žä¾‹åˆ—表 Map - */ - default Map getProcessInstanceMap(Set ids) { - return convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); - } - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 历å²çš„æµç¨‹å®žä¾‹ - */ - HistoricProcessInstance getHistoricProcessInstance(String id); - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹åˆ—è¡¨ - * - * @param ids æµç¨‹å®žä¾‹çš„ç¼–å·é›†åˆ - * @return 历å²çš„æµç¨‹å®žä¾‹åˆ—è¡¨ - */ - List getHistoricProcessInstances(Set ids); - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹ Map - * - * @param ids æµç¨‹å®žä¾‹çš„ç¼–å·é›†åˆ - * @return 历å²çš„æµç¨‹å®žä¾‹åˆ—è¡¨ Map - */ - default Map getHistoricProcessInstanceMap(Set ids) { - return convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„分页 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹å®žä¾‹çš„分页 - */ - PageResult getProcessInstancePage(Long userId, - @Valid BpmProcessInstancePageReqVO pageReqVO); - - /** - * 获å–审批详情。 - *

- * å¯ä»¥æ˜¯å‡†å¤‡å‘èµ·çš„æµç¨‹ã€è¿›è¡Œä¸­çš„æµç¨‹ã€å·²ç»ç»“æŸçš„æµç¨‹ - * - * @param loginUserId ç™»å½•äººçš„ç”¨æˆ·ç¼–å· - * @param reqVO è¯·æ±‚ä¿¡æ¯ - * @return æµç¨‹å®žä¾‹çš„进度 - */ - BpmApprovalDetailRespVO getApprovalDetail(Long loginUserId, @Valid BpmApprovalDetailReqVO reqVO); - - /** - * 获å–ä¸‹ä¸€ä¸ªæ‰§è¡ŒèŠ‚ç‚¹ä¿¡æ¯ - * - * @param loginUserId ç™»å½•äººçš„ç”¨æˆ·ç¼–å· - * @param reqVO è¯·æ±‚ä¿¡æ¯ - * @return ä¸‹ä¸€ä¸ªæ‰§è¡ŒèŠ‚ç‚¹ä¿¡æ¯ - */ - List getNextApprovalNodes(Long loginUserId, @Valid BpmApprovalDetailReqVO reqVO); - - /** - * èŽ·å–æµç¨‹å®žä¾‹çš„ BPMN 模型视图 - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return BPMN 模型视图 - */ - BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id); - - // ========== Update 写入相关方法 ========== - - /** - * 创建æµç¨‹å®žä¾‹ï¼ˆæä¾›ç»™å‰ç«¯ï¼‰ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return å®žä¾‹çš„ç¼–å· - */ - String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO); - - /** - * 创建æµç¨‹å®žä¾‹ï¼ˆæä¾›ç»™å†…部) - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return å®žä¾‹çš„ç¼–å· - */ - String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO); - - /** - * å‘èµ·äººå–æ¶ˆæµç¨‹å®žä¾‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param cancelReqVO å–æ¶ˆä¿¡æ¯ - */ - void cancelProcessInstanceByStartUser(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO); - - /** - * 管ç†å‘˜å–消æµç¨‹å®žä¾‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param cancelReqVO å–æ¶ˆä¿¡æ¯ - */ - void cancelProcessInstanceByAdmin(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO); - - /** - * æ›´æ–° ProcessInstance 为ä¸é€šè¿‡ - * - * @param processInstance æµç¨‹å®žä¾‹ - * @param reason ç†ç”±ã€‚例如说,审批ä¸é€šè¿‡æ—¶ï¼Œéœ€è¦ä¼ é€’该值 - */ - void updateProcessInstanceReject(ProcessInstance processInstance, String reason); - - /** - * æ›´æ–° ProcessInstance çš„å˜é‡ - * - * @param id æµç¨‹ç¼–å· - * @param variables æµç¨‹å˜é‡ - */ - void updateProcessInstanceVariables(String id, Map variables); - - /** - * 删除 ProcessInstance çš„å˜é‡ - * - * @param id æµç¨‹ç¼–å· - * @param variableNames æµç¨‹å˜é‡å - */ - void removeProcessInstanceVariables(String id, Collection variableNames); - - // ========== Event 事件相关方法 ========== - - /** - * å¤„ç† ProcessInstance 完æˆäº‹ä»¶ï¼Œä¾‹å¦‚说:审批通过ã€ä¸é€šè¿‡ã€å–消 - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void processProcessInstanceCompleted(ProcessInstance instance); - - /** - * å¤„ç† ProcessInstance 开始事件,例如说:æµç¨‹å‰ç½®é€šçŸ¥ - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void processProcessInstanceCreated(ProcessInstance instance); -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java deleted file mode 100644 index d675a7e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ /dev/null @@ -1,964 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.business.core.util.DeptUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.date.DateUtils; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.framework.common.util.object.ObjectUtils; -import com.zt.plat.framework.common.util.object.PageUtils; -import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.*; -import com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNodeTask; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import com.zt.plat.module.bpm.convert.task.BpmProcessInstanceConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.dal.redis.BpmProcessIdRedisDAO; -import com.zt.plat.module.bpm.enums.ErrorCodeConstants; -import com.zt.plat.module.bpm.enums.definition.BpmModelTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmSimpleModelNodeTypeEnum; -import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import com.zt.plat.module.bpm.enums.task.BpmReasonEnum; -import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; -import com.zt.plat.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; -import com.zt.plat.module.bpm.framework.flowable.core.event.BpmProcessInstanceEventPublisher; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.SimpleModelUtils; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.message.BpmMessageService; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.constants.BpmnXMLConstants; -import org.flowable.bpmn.model.*; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.runtime.ProcessInstanceBuilder; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.util.*; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; -import static com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.flowable.bpmn.constants.BpmnXMLConstants.*; - -/** - * æµç¨‹å®žä¾‹ Service 实现类 - *

- * ProcessDefinition & ProcessInstance & Execution & Task 的关系: - * 1. - *

- * HistoricProcessInstance & ProcessInstance 的关系: - * 1. - *

- * ç®€å•æ¥è¯´ï¼Œå‰è€… = åŽ†å² + è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ï¼ŒåŽè€…仅是è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ - * - * @author ZT - */ -@Service -@Validated -@Slf4j -public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { - - @Resource - private RuntimeService runtimeService; - @Resource - private HistoryService historyService; - - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - @Lazy // é¿å…循环ä¾èµ– - private BpmTaskService taskService; - @Resource - private BpmMessageService messageService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - @Resource - private BpmProcessInstanceEventPublisher processInstanceEventPublisher; - - @Resource - private BpmTaskCandidateInvoker taskCandidateInvoker; - - @Resource - private BpmProcessIdRedisDAO processIdRedisDAO; - - // ========== Query 查询相关方法 ========== - - @Override - public ProcessInstance getProcessInstance(String id) { - return runtimeService.createProcessInstanceQuery() - .includeProcessVariables() - .processInstanceId(id) - .singleResult(); - } - - @Override - public List getProcessInstances(Set ids) { - return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list(); - } - - @Override - public HistoricProcessInstance getHistoricProcessInstance(String id) { - return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables() - .singleResult(); - } - - @Override - public List getHistoricProcessInstances(Set ids) { - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables() - .list(); - } - - private Map getFormFieldsPermission(BpmnModel bpmnModel, - String activityId, String taskId) { - // 1. èŽ·å–æµç¨‹æ´»åŠ¨ç¼–å·ã€‚æµç¨‹æ´»åЍ Id 为空事,从æµç¨‹ä»»åŠ¡ä¸­èŽ·å–æµç¨‹æ´»åЍ Id - if (StrUtil.isEmpty(activityId) && StrUtil.isNotEmpty(taskId)) { - activityId = Optional.ofNullable(taskService.getHistoricTask(taskId)) - .map(HistoricTaskInstance::getTaskDefinitionKey).orElse(null); - } - if (StrUtil.isEmpty(activityId)) { - return null; - } - - // 2. 从 BpmnModel 中解æžè¡¨å•字段æƒé™ - return BpmnModelUtils.parseFormFieldsPermission(bpmnModel, activityId); - } - - @Override - public BpmApprovalDetailRespVO getApprovalDetail(Long loginUserId, BpmApprovalDetailReqVO reqVO) { - // 1.1 从 reqVO 中,读å–公共å˜é‡ - Long startUserId = loginUserId; // æµç¨‹å‘起人 - HistoricProcessInstance historicProcessInstance = null; // æµç¨‹å®žä¾‹ - Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // æµç¨‹çŠ¶æ€ - Map processVariables = new HashMap<>(); // æµç¨‹å˜é‡ - // 1.2 如果是æµç¨‹å·²å‘起的场景,则使用æµç¨‹å®žä¾‹çš„æ•°æ® - if (reqVO.getProcessInstanceId() != null) { - historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId()); - if (historicProcessInstance == null) { - throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); - } - startUserId = Long.valueOf(historicProcessInstance.getStartUserId()); - processInstanceStatus = FlowableUtils.getProcessInstanceStatus(historicProcessInstance); - // åˆå¹¶ DB å’Œå‰ç«¯ä¼ é€’çš„æµé‡å˜é‡ï¼Œä»¥å‰ç«¯çš„为主 - if (CollUtil.isNotEmpty(historicProcessInstance.getProcessVariables())) { - processVariables.putAll(historicProcessInstance.getProcessVariables()); - } - } - if (CollUtil.isNotEmpty(reqVO.getProcessVariables())) { - processVariables.putAll(reqVO.getProcessVariables()); - } - // 1.3 读å–å…¶å®ƒç›¸å…³æ•°æ® - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - historicProcessInstance != null ? historicProcessInstance.getProcessDefinitionId() - : reqVO.getProcessDefinitionId()); - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService - .getProcessDefinitionInfo(processDefinition.getId()); - BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); - - // 2.1 å·²ç»“æŸ + 进行中的活动节点 - List endActivityNodes = null; // 已结æŸçš„å®¡æ‰¹ä¿¡æ¯ - List runActivityNodes = null; // è¿›è¡Œä¸­çš„å®¡æ‰¹ä¿¡æ¯ - List activities = null; // æµç¨‹å®žä¾‹åˆ—表 - if (reqVO.getProcessInstanceId() != null) { - activities = taskService.getActivityListByProcessInstanceId(reqVO.getProcessInstanceId()); - List tasks = taskService.getTaskListByProcessInstanceId(reqVO.getProcessInstanceId(), - true); - endActivityNodes = getEndActivityNodeList(startUserId, bpmnModel, processDefinitionInfo, - historicProcessInstance, processInstanceStatus, activities, tasks); - runActivityNodes = getRunApproveNodeList(startUserId, bpmnModel, processDefinition, processVariables, - activities, tasks); - } - - // 2.2 æµç¨‹å·²ç»ç»“æŸï¼Œç›´æŽ¥ return,无需预测 - if (BpmProcessInstanceStatusEnum.isProcessEndStatus(processInstanceStatus)) { - return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, - historicProcessInstance, - processInstanceStatus, endActivityNodes, runActivityNodes, null, null); - } - - // 3.1 计算当å‰ç™»å½•用户的待办任务 - BpmTaskRespVO todoTask = taskService.getTodoTask(loginUserId, reqVO.getTaskId(), reqVO.getProcessInstanceId()); - // 3.2 预测未è¿è¡ŒèŠ‚ç‚¹çš„å®¡æ‰¹ä¿¡æ¯ - List simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, - processDefinitionInfo, - processVariables, activities); - // 3.3 如果是å‘起动作,activityId ä¸ºå¼€å§‹èŠ‚ç‚¹ï¼Œä¸æ ¡éªŒå®¡æ‰¹äººè‡ªé€‰èŠ‚ç‚¹ - if (ObjUtil.equals(reqVO.getActivityId(), BpmnModelConstants.START_USER_NODE_ID)) { - simulateActivityNodes.removeIf(node -> - BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT.getStrategy().equals(node.getCandidateStrategy())); - } - - // 4. æ‹¼æŽ¥æœ€ç»ˆæ•°æ® - return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, historicProcessInstance, - processInstanceStatus, endActivityNodes, runActivityNodes, simulateActivityNodes, todoTask); - } - - @Override - public List getNextApprovalNodes(Long loginUserId, BpmApprovalDetailReqVO reqVO) { - // 1.1 校验任务存在,且是当å‰ç”¨æˆ·çš„ - Task task = taskService.validateTask(loginUserId, reqVO.getTaskId()); - // 1.2 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(task.getProcessInstanceId()); - if (historicProcessInstance == null) { - throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); - } - // 1.3 校验BpmnModel - BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(task.getProcessDefinitionId()); - if (bpmnModel == null) { - return null; - } - - // 2. 设置æµç¨‹å˜é‡ - Map processVariables = new HashMap<>(); - // 2.1 获å–历å²ä¸­æµç¨‹å˜é‡ - if (CollUtil.isNotEmpty(historicProcessInstance.getProcessVariables())) { - processVariables.putAll(historicProcessInstance.getProcessVariables()); - } - // 2.2 åˆå¹¶å‰ç«¯ä¼ é€’çš„æµç¨‹å˜é‡ï¼Œä»¥å‰ç«¯ä¸ºå‡† - if (CollUtil.isNotEmpty(reqVO.getProcessVariables())) { - processVariables.putAll(reqVO.getProcessVariables()); - } - - // 3. 获å–ä¸‹ä¸€ä¸ªå°†è¦æ‰§è¡Œçš„èŠ‚ç‚¹é›†åˆ - FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey()); - List nextFlowNodes = BpmnModelUtils.getNextFlowNodes(flowElement, bpmnModel, processVariables); - List nextActivityNodes = convertList(nextFlowNodes, node -> new ActivityNode().setId(node.getId()) - .setName(node.getName()).setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) - .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) - .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(node)) - .setCandidateUserIds(getTaskCandidateUserList(bpmnModel, node.getId(), - loginUserId, historicProcessInstance.getProcessDefinitionId(), processVariables))); - if (CollUtil.isNotEmpty(nextActivityNodes)) { - return nextActivityNodes; - } - - // 4. æ‹¼æŽ¥åŸºç¡€ä¿¡æ¯ - Map userMap = adminUserApi.getUserMap( - convertSetByFlatMap(nextActivityNodes, ActivityNode::getCandidateUserIds, Collection::stream)); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - nextActivityNodes.forEach(node -> node.setCandidateUsers(convertList(node.getCandidateUserIds(), userId -> { - AdminUserRespDTO user = userMap.get(userId); - if (user != null) { - return BpmProcessInstanceConvert.INSTANCE.buildUser(userId, userMap, deptMap); - } - return null; - }))); - return nextActivityNodes; - } - - @Override - @SuppressWarnings("unchecked") - public PageResult getProcessInstancePage(Long userId, - BpmProcessInstancePageReqVO pageReqVO) { - // 1. 构建查询æ¡ä»¶ - HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() - .includeProcessVariables() - .processInstanceTenantId(FlowableUtils.getTenantId()) - .orderByProcessInstanceStartTime().desc(); - if (userId != null) { // ã€æˆ‘çš„æµç¨‹ã€‘èœå•时,需è¦ä¼ é€’该字段 - processInstanceQuery.startedBy(String.valueOf(userId)); - } else if (pageReqVO.getStartUserId() != null) { // ã€ç®¡ç†æµç¨‹ã€‘èœå•时,æ‰ä¼šä¼ é€’该字段 - processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); - } - if (StrUtil.isNotEmpty(pageReqVO.getName())) { - processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); - } - if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { - processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); - } - if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { - processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); - } - if (pageReqVO.getStatus() != null) { - processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, - pageReqVO.getStatus()); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { - processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); - processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { - processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); - processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); - } - // 表å•字段查询 - Map formFieldsParams = JsonUtils.parseObject(pageReqVO.getFormFieldsParams(), Map.class); - if (CollUtil.isNotEmpty(formFieldsParams)) { - formFieldsParams.forEach((key, value) -> { - if (StrUtil.isEmpty(String.valueOf(value))) { - return; - } - // TODO @lesan:应支æŒå¤šç§ç±»åž‹çš„æŸ¥è¯¢æ–¹å¼ï¼Œç›®å‰åªæœ‰å­—符串全等 - processInstanceQuery.variableValueEquals(key, value); - }); - } - - // 2.1 æŸ¥è¯¢æ•°é‡ - long processInstanceCount = processInstanceQuery.count(); - if (processInstanceCount == 0) { - return PageResult.empty(processInstanceCount); - } - // 2.2 查询列表 - List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), - pageReqVO.getPageSize()); - return new PageResult<>(processInstanceList, processInstanceCount); - } - - /** - * æ‹¼æŽ¥å®¡æ‰¹è¯¦æƒ…çš„æœ€ç»ˆæ•°æ® - *

- * ä¸»è¦æ˜¯ï¼Œæ‹¼æŽ¥å®¡æ‰¹äººçš„用户信æ¯ã€éƒ¨é—¨ä¿¡æ¯ - */ - private BpmApprovalDetailRespVO buildApprovalDetail(BpmApprovalDetailReqVO reqVO, - BpmnModel bpmnModel, - ProcessDefinition processDefinition, - BpmProcessDefinitionInfoDO processDefinitionInfo, - HistoricProcessInstance processInstance, - Integer processInstanceStatus, - List endApprovalNodeInfos, - List runningApprovalNodeInfos, - List simulateApprovalNodeInfos, - BpmTaskRespVO todoTask) { - // 1. èŽ·å–æ‰€æœ‰éœ€è¦è¯»å–用户信æ¯çš„ userIds - List approveNodes = newArrayList( - asList(endApprovalNodeInfos, runningApprovalNodeInfos, simulateApprovalNodeInfos)); - Set userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds(processInstance, approveNodes, todoTask); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - - // 2. è¡¨å•æƒé™ - String taskId = reqVO.getTaskId() == null && todoTask != null ? todoTask.getId() : reqVO.getTaskId(); - Map formFieldsPermission = getFormFieldsPermission(bpmnModel, reqVO.getActivityId(), taskId); - - // 3. æ‹¼æŽ¥æ•°æ® - return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition, - processDefinitionInfo, processInstance, - processInstanceStatus, approveNodes, todoTask, formFieldsPermission, userMap, deptMap); - } - - /** - * 获得ã€å·²ç»“æŸã€‘的活动节点们 - */ - private List getEndActivityNodeList(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, - HistoricProcessInstance historicProcessInstance, Integer processInstanceStatus, - List activities, List tasks) { - // é历 tasks 列表,åªå¤„ç†å·²ç»“æŸçš„ UserTask - // 为什么ä¸é€šè¿‡ activities 呢?因为,加签场景下,它åªå­˜åœ¨äºŽ tasks,没有 activities,导致如果é历 activities çš„è¯ï¼Œå®ƒæ— æ³•æˆä¸ºä¸€ä¸ªèŠ‚ç‚¹ - List endTasks = filterList(tasks, task -> task.getEndTime() != null); - List approvalNodes = convertList(endTasks, task -> { - FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) - .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) - ? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() - : ObjUtil.defaultIfNull(parseNodeType(flowNode), // 目的:解决“办ç†èŠ‚ç‚¹â€çš„识别 - BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) - .setStatus(FlowableUtils.getTaskStatus(task)) - .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) - .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) - .setTasks(singletonList(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task))); - // å¦‚æžœæ˜¯å–æ¶ˆçжæ€ï¼Œåˆ™è·³è¿‡ - if (BpmTaskStatusEnum.isCancelStatus(activityNode.getStatus())) { - return null; - } - return activityNode; - }); - - // é历 activities,åªå¤„ç†å·²ç»“æŸçš„ StartEventã€EndEvent - List endActivities = filterList(activities, activity -> activity.getEndTime() != null - && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_EVENT_START, ELEMENT_CALL_ACTIVITY, ELEMENT_EVENT_END))); - endActivities.forEach(activity -> { - // StartEvent:åªå¤„ç† BPMN 的场景。因为,SIMPLE æƒ…å†µä¸‹ï¼Œå·²ç»æœ‰ START_USER_NODE 节点 - if (ELEMENT_EVENT_START.equals(activity.getActivityType()) - && BpmModelTypeEnum.BPMN.getType().equals(processDefinitionInfo.getModelType())) { - ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID) - .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus()); - ActivityNode startNode = new ActivityNode().setId(startTask.getId()) - .setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()) - .setStatus(startTask.getStatus()).setTasks(ListUtil.of(startTask)) - .setStartTime(DateUtils.of(activity.getStartTime())) - .setEndTime(DateUtils.of(activity.getEndTime())); - approvalNodes.add(0, startNode); - return; - } - // EndEvent - if (ELEMENT_EVENT_END.equals(activity.getActivityType())) { - if (BpmProcessInstanceStatusEnum.isRejectStatus(processInstanceStatus)) { - // æ‹’ç»æƒ…况下,ä¸éœ€è¦å±•示 EndEvent 结æŸèŠ‚ç‚¹ã€‚åŽŸå› æ˜¯ï¼šå‰ç«¯å·²ç»å±•示 x 效果,无需é‡å¤å±•示 - return; - } - ActivityNode endNode = new ActivityNode().setId(activity.getId()) - .setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()).setStatus(processInstanceStatus) - .setStartTime(DateUtils.of(activity.getStartTime())) - .setEndTime(DateUtils.of(activity.getEndTime())); - String reason = FlowableUtils.getProcessInstanceReason(historicProcessInstance); - if (StrUtil.isNotEmpty(reason)) { - endNode.setTasks(singletonList(new ActivityNodeTask().setId(endNode.getId()) - .setStatus(endNode.getStatus()).setReason(reason))); - } - approvalNodes.add(endNode); - } - // CallActivity - if (ELEMENT_CALL_ACTIVITY.equals(activity.getActivityType())) { - ActivityNode callActivity = new ActivityNode().setId(activity.getId()) - .setName(BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType()).setStatus(processInstanceStatus) - .setStartTime(DateUtils.of(activity.getStartTime())) - .setEndTime(DateUtils.of(activity.getEndTime())) - .setProcessInstanceId(activity.getProcessInstanceId()); - approvalNodes.add(callActivity); - } - }); - - // æŒ‰ç…§æ—¶é—´æŽ’åº - approvalNodes.sort(Comparator.comparing(ActivityNode::getStartTime)); - return approvalNodes; - } - - /** - * 获得ã€è¿›è¡Œä¸­ã€‘的活动节点们 - */ - private List getRunApproveNodeList(Long startUserId, - BpmnModel bpmnModel, - ProcessDefinition processDefinition, - Map processVariables, - List activities, - List tasks) { - // 构建è¿è¡Œä¸­çš„任务ã€å­æµç¨‹ï¼ŒåŸºäºŽ activityId 分组 - List runActivities = filterList(activities, activity -> activity.getEndTime() == null - && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_TASK_USER, ELEMENT_CALL_ACTIVITY))); - Map> runningTaskMap = convertMultiMap(runActivities, - HistoricActivityInstance::getActivityId); - - // 按照 activityId 分组,构建 ApprovalNodeInfo 节点 - Map taskMap = convertMap(tasks, HistoricTaskInstance::getId); - return convertList(runningTaskMap.entrySet(), entry -> { - String activityId = entry.getKey(); - List taskActivities = entry.getValue(); - // 构建活动节点 - FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); - HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // å–第一个任务,会签/æˆ–ç­¾çš„ä»»åŠ¡ï¼Œå¼€å§‹æ—¶é—´ç›¸åŒ - ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()) - .setName(firstActivity.getActivityName()) - .setNodeType(ObjUtil.defaultIfNull(parseNodeType(flowNode), // 目的:解决“办ç†èŠ‚ç‚¹â€å’Œ"å­æµç¨‹"的识别 - BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) - .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) - .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) - .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) - .setTasks(new ArrayList<>()); - // å¤„ç†æ¯ä¸ªä»»åŠ¡çš„ tasks 属性 - for (HistoricActivityInstance activity : taskActivities) { - HistoricTaskInstance task = taskMap.get(activity.getTaskId()); - // ç‰¹æ®Šæƒ…å†µï¼šå­æµç¨‹èŠ‚ç‚¹ ChildProcess 仅存在于 activity 中,并且没有自身的 task,需è¦è·³è¿‡æ‰§è¡Œ - // TODO @ZT:åŽç»­çœ‹çœ‹æ€Žä¹ˆä¼˜åŒ–ï¼ - if (task == null) { - continue; - } - activityNode.getTasks().add(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task)); - // 加签å­ä»»åŠ¡ï¼Œéœ€è¦è¿‡æ»¤æŽ‰å·²ç»å®Œæˆçš„加签å­ä»»åŠ¡ - List childrenTasks = filterList( - taskService.getAllChildrenTaskListByParentTaskId(activity.getTaskId(), tasks), - childTask -> childTask.getEndTime() == null); - if (CollUtil.isNotEmpty(childrenTasks)) { - activityNode.getTasks().addAll( - convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo)); - } - } - // å¤„ç†æ¯ä¸ªä»»åŠ¡çš„ candidateUsers å±žæ€§ï¼šå¦‚æžœæ˜¯ä¾æ¬¡å®¡æ‰¹ï¼Œéœ€è¦é¢„测它的åŽç»­å®¡æ‰¹äººã€‚因为 Task 是审批完一个,创建一个新的 Task - if (BpmnModelUtils.isSequentialUserTask(flowNode)) { - List candidateUserIds = getTaskCandidateUserList(bpmnModel, flowNode.getId(), - startUserId, processDefinition.getId(), processVariables); - // 截å–当å‰å®¡æ‰¹äººä½ç½®åŽé¢çš„候选人,ä¸åŒ…å«å½“å‰å®¡æ‰¹äºº - ActivityNodeTask approvalTaskInfo = CollUtil.getFirst(activityNode.getTasks()); - Assert.notNull(approvalTaskInfo, "任务ä¸èƒ½ä¸ºç©º"); - int index = CollUtil.indexOf(candidateUserIds, - userId -> ObjectUtils.equalsAny(userId, approvalTaskInfo.getOwner(), - approvalTaskInfo.getAssignee())); // 委派或者å‘å‰åŠ ç­¾æƒ…å†µï¼Œéœ€è¦å…ˆæ¯”较 owner - activityNode.setCandidateUserIds(CollUtil.sub(candidateUserIds, index + 1, candidateUserIds.size())); - } - if (BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType().equals(activityNode.getNodeType())) { - activityNode.setProcessInstanceId(firstActivity.getProcessInstanceId()); - } - return activityNode; - }); - } - - /** - * 获得ã€é¢„测(未æ¥ï¼‰ã€‘的活动节点们 - */ - private List getSimulateApproveNodeList(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, - Map processVariables, - List activities) { - // TODO @ZT:ã€å¯ä¼˜åŒ–】在驳回场景下,未æ¥çš„预测准确性ä¸é«˜ã€‚原因是,驳回åŽï¼ŒHistoricActivityInstance - // 包括了历å²çš„æ“ä½œï¼Œä¸æ˜¯åªæœ‰ startEvent 到当å‰èŠ‚ç‚¹çš„è®°å½• - Set runActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId); - // 情况一:BPMN 设计器 - if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) { - List flowElements = BpmnModelUtils.simulateProcess(bpmnModel, processVariables); - return convertList(flowElements, flowElement -> buildNotRunApproveNodeForBpmn(startUserId, bpmnModel, - processDefinitionInfo, processVariables, flowElement, runActivityIds)); - } - // 情况二:SIMPLE 设计器 - if (Objects.equals(BpmModelTypeEnum.SIMPLE.getType(), processDefinitionInfo.getModelType())) { - BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), - BpmSimpleModelNodeVO.class); - List simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables); - return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel, - processDefinitionInfo, processVariables, simpleNode, runActivityIds)); - } - throw new IllegalArgumentException("未知设计器类型:" + processDefinitionInfo.getModelType()); - } - - private ActivityNode buildNotRunApproveNodeForSimple(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, - BpmSimpleModelNodeVO node, Set runActivityIds) { - // TODO @ZT:ã€å¯ä¼˜åŒ–】在驳回场景下,未æ¥çš„预测准确性ä¸é«˜ã€‚原因是,驳回åŽï¼ŒHistoricActivityInstance - // 包括了历å²çš„æ“ä½œï¼Œä¸æ˜¯åªæœ‰ startEvent 到当å‰èŠ‚ç‚¹çš„è®°å½• - if (runActivityIds.contains(node.getId())) { - return null; - } - - ActivityNode activityNode = new ActivityNode().setId(node.getId()).setName(node.getName()) - .setNodeType(node.getType()).setCandidateStrategy(node.getCandidateStrategy()) - .setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); - - // 1. 开始节点/审批节点 - if (ObjectUtils.equalsAny(node.getType(), - BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType(), - BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType(), - BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE.getType())) { - List candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), - startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); - activityNode.setCandidateUserIds(candidateUserIds); - return activityNode; - } - - // 2. 结æŸèŠ‚ç‚¹ - if (BpmSimpleModelNodeTypeEnum.END_NODE.getType().equals(node.getType())) { - return activityNode; - } - - // 3. 抄é€èŠ‚ç‚¹ - if (CollUtil.isEmpty(runActivityIds) && // æµç¨‹å‘起时:需è¦å±•示抄é€èŠ‚ç‚¹ï¼Œç”¨äºŽé€‰æ‹©æŠ„é€äºº - BpmSimpleModelNodeTypeEnum.COPY_NODE.getType().equals(node.getType())) { - List candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), - startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); - activityNode.setCandidateUserIds(candidateUserIds); - return activityNode; - } - - // 4. å­æµç¨‹èŠ‚ç‚¹ - if (BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType().equals(node.getType())) { - return activityNode; - } - return null; - } - - private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, - FlowElement node, Set runActivityIds) { - if (runActivityIds.contains(node.getId())) { - return null; - } - ActivityNode activityNode = new ActivityNode().setId(node.getId()) - .setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); - - // 1. 开始节点 - if (node instanceof StartEvent) { - return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()); - } - - // 2. 审批节点 - if (node instanceof UserTask) { - List candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), - startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); - return activityNode.setName(node.getName()).setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) - .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(node)) - .setCandidateUserIds(candidateUserIds); - } - - // 3. 结æŸèŠ‚ç‚¹ - if (node instanceof EndEvent) { - return activityNode.setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()); - } - return null; - } - - private List getTaskCandidateUserList(BpmnModel bpmnModel, String activityId, - Long startUserId, String processDefinitionId, Map processVariables) { - Set userIds = taskCandidateInvoker.calculateUsersByActivity(bpmnModel, activityId, - startUserId, processDefinitionId, processVariables); - return new ArrayList<>(userIds); - } - - @Override - public BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id) { - // 1.1 获得æµç¨‹å®žä¾‹ - HistoricProcessInstance processInstance = getHistoricProcessInstance(id); - if (processInstance == null) { - return null; - } - // 1.2 获得æµç¨‹å®šä¹‰ - BpmnModel bpmnModel = processDefinitionService - .getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); - if (bpmnModel == null) { - return null; - } - BpmSimpleModelNodeVO simpleModel = null; - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( - processInstance.getProcessDefinitionId()); - if (processDefinitionInfo != null - && BpmModelTypeEnum.SIMPLE.getType().equals(processDefinitionInfo.getModelType())) { - simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); - } - // 1.3 获得æµç¨‹å®žä¾‹å¯¹åº”的活动实例列表 + 任务列表 - List activities = taskService.getActivityListByProcessInstanceId(id); - List tasks = taskService.getTaskListByProcessInstanceId(id, true); - - // 2.1 æ‹¼æŽ¥è¿›åº¦ä¿¡æ¯ - Set unfinishedTaskActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, - activityInstance -> activityInstance.getEndTime() == null); - Set finishedTaskActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, - activityInstance -> activityInstance.getEndTime() != null - && ObjectUtil.notEqual(activityInstance.getActivityType(), - BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); - Set finishedSequenceFlowActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, - activityInstance -> activityInstance.getEndTime() != null - && ObjectUtil.equals(activityInstance.getActivityType(), - BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); - // 特殊:会签情况下,会有部分已完æˆï¼ˆå®¡æ‰¹ï¼‰ã€éƒ¨åˆ†æœªå®Œæˆï¼ˆå¾…å®¡æ‰¹ï¼‰ï¼Œæ­¤æ—¶éœ€è¦ finishedTaskActivityIds 移除掉 - finishedTaskActivityIds.removeAll(unfinishedTaskActivityIds); - // 特殊:如果æµç¨‹å®žä¾‹è¢«æ‹’ç»ï¼Œåˆ™éœ€è¦è®¡ç®—是哪个活动节点。 - // 注æ„,åªå–最åŽä¸€ä¸ªã€‚因为会存在多次拒ç»çš„æƒ…况,拒ç»é©³å›žåˆ°æŒ‡å®šèŠ‚ç‚¹ - Set rejectTaskActivityIds = CollUtil.newHashSet(); - if (BpmProcessInstanceStatusEnum.isRejectStatus(FlowableUtils.getProcessInstanceStatus(processInstance))) { - tasks.stream() - .filter(task -> BpmTaskStatusEnum.isRejectStatus(FlowableUtils.getTaskStatus(task))) - .max(Comparator.comparing(HistoricTaskInstance::getEndTime)) - .ifPresent(reject -> rejectTaskActivityIds.add(reject.getTaskDefinitionKey())); - finishedTaskActivityIds.removeAll(rejectTaskActivityIds); - } - - // 2.2 æ‹¼æŽ¥åŸºç¡€ä¿¡æ¯ - Set userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds02(processInstance, tasks); - Map userMap = adminUserApi.getUserMap(userIds); - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - return BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceBpmnModelView(processInstance, tasks, bpmnModel, - simpleModel, - unfinishedTaskActivityIds, finishedTaskActivityIds, finishedSequenceFlowActivityIds, - rejectTaskActivityIds, - userMap, deptMap); - } - - // ========== Update 写入相关方法 ========== - - @Override - @Transactional(rollbackFor = Exception.class) - public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService - .getProcessDefinition(createReqVO.getProcessDefinitionId()); - // å‘èµ·æµç¨‹ - return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, - createReqVO.getStartUserSelectAssignees()); - } - - @Override - public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { - return FlowableUtils.executeAuthenticatedUserId(userId, () -> { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService - .getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); - // å‘èµ·æµç¨‹ - return createProcessInstance0(userId, definition, createReqDTO.getVariables(), - createReqDTO.getBusinessKey(), - createReqDTO.getStartUserSelectAssignees()); - }); - } - - private String createProcessInstance0(Long userId, ProcessDefinition definition, - Map variables, String businessKey, - Map> startUserSelectAssignees) { - // 1.1 校验æµç¨‹å®šä¹‰ - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - if (definition.isSuspended()) { - throw exception(PROCESS_DEFINITION_IS_SUSPENDED); - } - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService - .getProcessDefinitionInfo(definition.getId()); - if (processDefinitionInfo == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - // 1.2 校验是å¦èƒ½å¤Ÿå‘èµ· - if (!processDefinitionService.canUserStartProcessDefinition(processDefinitionInfo, userId)) { - throw exception(PROCESS_INSTANCE_START_USER_CAN_START); - } - // 1.3 校验å‘起人自选审批人 - validateStartUserSelectAssignees(userId, definition, startUserSelectAssignees, variables); - - // 2. 创建æµç¨‹å®žä¾‹ - if (variables == null) { - variables = new HashMap<>(); - } - FlowableUtils.filterProcessInstanceFormVariable(variables); // 过滤一下,é¿å… ProcessInstance 系统级的å˜é‡è¢«å ç”¨ - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置æµç¨‹å˜é‡ï¼Œå‘起人 ID - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // æµç¨‹å®žä¾‹çжæ€ï¼šå®¡æ‰¹ä¸­ - BpmProcessInstanceStatusEnum.RUNNING.getStatus()); - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达å¼éœ€è¦æ·»åŠ æ­¤å˜é‡ä¸º true,ä¸å½±å“没é…ç½® skipExpression 的节点 - if (CollUtil.isNotEmpty(startUserSelectAssignees)) { - // 设置æµç¨‹å˜é‡ï¼Œå‘起人自选审批人 - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, - startUserSelectAssignees); - } - - // 3. 创建æµç¨‹ - ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() - .processDefinitionId(definition.getId()) - .businessKey(businessKey) - .variables(variables); - // 3.1 创建æµç¨‹ ID - BpmModelMetaInfoVO.ProcessIdRule processIdRule = processDefinitionInfo.getProcessIdRule(); - if (processIdRule != null && Boolean.TRUE.equals(processIdRule.getEnable())) { - processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule)); - } - // 3.2 æµç¨‹åç§° - BpmModelMetaInfoVO.TitleSetting titleSetting = processDefinitionInfo.getTitleSetting(); - if (titleSetting != null && Boolean.TRUE.equals(titleSetting.getEnable())) { - AdminUserRespDTO user = adminUserApi.getUser(userId).getCheckedData(); - Map cloneVariables = new HashMap<>(variables); - cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); - cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); - cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim()); - processInstanceBuilder.name(StrUtil.format(titleSetting.getTitle(), cloneVariables)); - } else { - processInstanceBuilder.name(definition.getName().trim()); - } - // 3.3 å‘èµ·æµç¨‹å®žä¾‹ - ProcessInstance instance = processInstanceBuilder.start(); - return instance.getId(); - } - - private void validateStartUserSelectAssignees(Long userId, ProcessDefinition definition, - Map> startUserSelectAssignees, - Map variables) { - // 1. 获å–é¢„æµ‹çš„èŠ‚ç‚¹ä¿¡æ¯ - BpmApprovalDetailRespVO detailRespVO = getApprovalDetail(userId, new BpmApprovalDetailReqVO() - .setProcessDefinitionId(definition.getId()) - .setProcessVariables(variables)); - List activityNodes = detailRespVO.getActivityNodes(); - if (CollUtil.isEmpty(activityNodes)) { - return; - } - - // 2.1 ç§»é™¤æŽ‰ä¸æ˜¯å‘起人自选审批人节点 - activityNodes.removeIf(task -> - ObjectUtil.notEqual(BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy(), task.getCandidateStrategy())); - // 2.2 æµç¨‹å‘èµ·æ—¶è¦å…ˆèŽ·å–当剿µç¨‹çš„预测走å‘节点,å‘èµ·æ—¶åªæ ¡éªŒé¢„测的节点å‘起人自选审批人的审批人和抄é€äººæ˜¯å¦éƒ½é…置了 - activityNodes.forEach(task -> { - List assignees = startUserSelectAssignees != null ? startUserSelectAssignees.get(task.getId()) : null; - if (CollUtil.isEmpty(assignees)) { - throw exception(PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG, task.getName()); - } - Map userMap = adminUserApi.getUserMap(assignees); - assignees.forEach(assignee -> { - if (userMap.get(assignee) == null) { - throw exception(PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS, task.getName(), assignee); - } - }); - }); - } - - @Override - public void cancelProcessInstanceByStartUser(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { - // 1.1 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); - } - // 1.2 åªèƒ½å–消自己的 - if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); - } - // 1.3 校验å…许撤销审批中的申请 - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService - .getProcessDefinitionInfo(instance.getProcessDefinitionId()); - Assert.notNull(processDefinitionInfo, "æµç¨‹å®šä¹‰({})ä¸å­˜åœ¨", processDefinitionInfo); - if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未é…ç½® AllowCancelRunningProcess , 默认为å¯å–消 - && Boolean.FALSE.equals(processDefinitionInfo.getAllowCancelRunningProcess())) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW); - } - // 1.4 å­æµç¨‹ä¸å…è®¸å–æ¶ˆ - if (StrUtil.isNotBlank(instance.getSuperExecutionId())) { - throw exception(PROCESS_INSTANCE_CANCEL_CHILD_FAIL_NOT_ALLOW); - } - - // 2. å–æ¶ˆæµç¨‹ - updateProcessInstanceCancel(cancelReqVO.getId(), - BpmReasonEnum.CANCEL_PROCESS_INSTANCE_BY_START_USER.format(cancelReqVO.getReason())); - } - - @Override - public void cancelProcessInstanceByAdmin(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) { - // 1.1 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); - } - - // 2. å–æ¶ˆæµç¨‹ - AdminUserRespDTO user = adminUserApi.getUser(userId).getCheckedData(); - updateProcessInstanceCancel(cancelReqVO.getId(), - BpmReasonEnum.CANCEL_PROCESS_INSTANCE_BY_ADMIN.format(user.getNickname(), cancelReqVO.getReason())); - } - - private void updateProcessInstanceCancel(String id, String reason) { - // 1. æ›´æ–°æµç¨‹å®žä¾‹ status - runtimeService.setVariable(id, BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, - BpmProcessInstanceStatusEnum.CANCEL.getStatus()); - runtimeService.setVariable(id, BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, reason); - - // 2. å–æ¶ˆæ‰€æœ‰å­æµç¨‹ - List childProcessInstances = runtimeService.createProcessInstanceQuery() - .superProcessInstanceId(id).list(); - childProcessInstances.forEach(processInstance -> updateProcessInstanceCancel( - processInstance.getProcessInstanceId(), BpmReasonEnum.CANCEL_CHILD_PROCESS_INSTANCE_BY_MAIN_PROCESS.getReason())); - - // 3. ç»“æŸæµç¨‹ - taskService.moveTaskToEnd(id, reason); - } - - @Override - public void updateProcessInstanceReject(ProcessInstance processInstance, String reason) { - runtimeService.setVariable(processInstance.getProcessInstanceId(), - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, - BpmProcessInstanceStatusEnum.REJECT.getStatus()); - runtimeService.setVariable(processInstance.getProcessInstanceId(), - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, - BpmReasonEnum.REJECT_TASK.format(reason)); - } - - @Override - public void updateProcessInstanceVariables(String id, Map variables) { - runtimeService.setVariables(id, variables); - } - - @Override - public void removeProcessInstanceVariables(String id, Collection variableNames) { - runtimeService.removeVariables(id, variableNames); - } - - // ========== Event 事件相关方法 ========== - - @Override - public void processProcessInstanceCompleted(ProcessInstance instance) { - // 注æ„:需è¦åŸºäºŽ instance 设置租户编å·ï¼Œé¿å… Flowable å†…éƒ¨å¼‚æ­¥æ—¶ï¼Œä¸¢å¤±ç§Ÿæˆ·ç¼–å· - FlowableUtils.execute(instance.getTenantId(), () -> { - // 1.1 获å–当å‰çŠ¶æ€ - Integer status = (Integer) instance.getProcessVariables() - .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - String reason = (String) instance.getProcessVariables() - .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); - // 1.2 当æµç¨‹çжæ€è¿˜æ˜¯å®¡æ‰¹çжæ€ä¸­ï¼Œè¯´æ˜Žå®¡æ‰¹é€šè¿‡äº†ï¼Œåˆ™å˜æ›´ä¸‹å®ƒçš„çŠ¶æ€ - // 为什么这么处ç†ï¼Ÿå› ä¸ºæµç¨‹å®Œæˆï¼Œå¹¶ä¸”完æˆäº†ï¼Œè¯´æ˜Žå®¡æ‰¹é€šè¿‡äº† - if (Objects.equals(status, BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { - status = BpmProcessInstanceStatusEnum.APPROVE.getStatus(); - runtimeService.setVariable(instance.getId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, - status); - } - - // 2. å‘é€å¯¹åº”的消æ¯é€šçŸ¥ - if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) { - messageService.sendMessageWhenProcessInstanceApprove( - BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); - } else if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus())) { - messageService.sendMessageWhenProcessInstanceReject( - BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceRejectMessage(instance, reason)); - } - - // 3. å‘逿µç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status)); - - // 4. æµç¨‹åŽç½®é€šçŸ¥ - if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) { - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService. - getProcessDefinitionInfo(instance.getProcessDefinitionId()); - if (ObjUtil.isNotNull(processDefinitionInfo) && - ObjUtil.isNotNull(processDefinitionInfo.getProcessAfterTriggerSetting())) { - BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getProcessAfterTriggerSetting(); - - BpmHttpRequestUtils.executeBpmHttpRequest(instance, - setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); - } - } - }); - } - - @Override - public void processProcessInstanceCreated(ProcessInstance instance) { - // 注æ„:需è¦åŸºäºŽ instance 设置租户编å·ï¼Œé¿å… Flowable å†…éƒ¨å¼‚æ­¥æ—¶ï¼Œä¸¢å¤±ç§Ÿæˆ·ç¼–å· - FlowableUtils.execute(instance.getTenantId(), () -> { - // æµç¨‹å‰ç½®é€šçŸ¥ - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService. - getProcessDefinitionInfo(instance.getProcessDefinitionId()); - if (ObjUtil.isNull(processDefinitionInfo) || - ObjUtil.isNull(processDefinitionInfo.getProcessBeforeTriggerSetting())) { - return; - } - BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getProcessBeforeTriggerSetting(); - BpmHttpRequestUtils.executeBpmHttpRequest(instance, - setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); - }); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java deleted file mode 100644 index 8211bfe..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.collection.CollectionUtils; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.*; -import com.zt.plat.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum; -import jakarta.validation.Valid; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskInfo; -import org.flowable.task.api.history.HistoricTaskInstance; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service æŽ¥å£ - * - * @author jason - * @author ZT - */ -public interface BpmTaskService { - - // ========== Query 查询相关方法 ========== - - /** - * 获得待办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO); - - /** - * 获得用户(待办)的任务: - * 1. æ ¹æ® taskId 查询待办任务 - * 2. 如果任务ä¸å­˜åœ¨ï¼ˆæˆ–è€…å·²å®¡æ ¸ï¼‰ï¼ŒèŽ·å–æŒ‡å®šæµç¨‹ä¸‹ï¼Œé¦–个需è¦å¤„ç†ä»»åŠ¡ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param taskId ä»»åŠ¡ç¼–å· - * @param processInstanceId æµç¨‹å®žä¾‹ç¼–å· - * @return 待办任务 - */ - BpmTaskRespVO getTodoTask(Long userId, String taskId, String processInstanceId); - - /** - * 获得已办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getTaskDonePage(Long userId, BpmTaskPageReqVO pageReqVO); - - /** - * 获得全部的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getTaskPage(Long userId, BpmTaskPageReqVO pageReqVO); - - /** - * 获得æµç¨‹ä»»åŠ¡ Map - * - * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ - * @return æµç¨‹ä»»åŠ¡ Map - */ - default Map> getTaskMapByProcessInstanceIds(List processInstanceIds) { - return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds), - Task::getProcessInstanceId); - } - - /** - * 获得æµç¨‹ä»»åŠ¡åˆ—è¡¨ - * - * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ - * @return æµç¨‹ä»»åŠ¡åˆ—è¡¨ - */ - List getTasksByProcessInstanceIds(List processInstanceIds); - - /** - * 获得指定æµç¨‹å®žä¾‹çš„æµç¨‹ä»»åŠ¡åˆ—è¡¨ï¼ŒåŒ…æ‹¬æ‰€æœ‰çŠ¶æ€çš„ - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @param asc 是å¦å‡åº - * @return æµç¨‹ä»»åŠ¡åˆ—è¡¨ - */ - List getTaskListByProcessInstanceId(String processInstanceId, Boolean asc); - - /** - * 校验任务是å¦å­˜åœ¨ï¼Œå¹¶ä¸”æ˜¯å¦æ˜¯åˆ†é…给自己的任务 - * - * @param userId 用户 id - * @param taskId task id - */ - Task validateTask(Long userId, String taskId); - - /** - * 获å–任务 - * - * @param id ä»»åŠ¡ç¼–å· - * @return 任务 - */ - Task getTask(String id); - - /** - * 获å–历å²ä»»åŠ¡ - * - * @param id ä»»åŠ¡ç¼–å· - * @return 历å²ä»»åŠ¡ - */ - HistoricTaskInstance getHistoricTask(String id); - - /** - * 获å–历å²ä»»åŠ¡åˆ—è¡¨ - * - * @param taskIds 任务编å·é›†åˆ - * @return 历å²ä»»åŠ¡åˆ—è¡¨ - */ - List getHistoricTasks(Collection taskIds); - - /** - * æ ¹æ®æ¡ä»¶æŸ¥è¯¢æ­£åœ¨è¿›è¡Œä¸­çš„任务 - * - * @param processInstanceId æµç¨‹å®žä¾‹ç¼–å·ï¼Œä¸å…许为空 - * @param assigned 是å¦åˆ†é…了审批人,å…许空 - * @param taskDefineKey 任务定义 Key,å…许空 - */ - List getRunningTaskListByProcessInstanceId(String processInstanceId, - Boolean assigned, - String taskDefineKey); - - /** - * 获å–当å‰ä»»åŠ¡çš„å¯é€€å›žçš„ UserTask é›†åˆ - * - * @param id 当å‰çš„任务 ID - * @return å¯ä»¥é€€å›žçš„节点列表 - */ - List getUserTaskListByReturn(String id); - - /** - * èŽ·å–æŒ‡å®šä»»åŠ¡çš„å­ä»»åŠ¡åˆ—è¡¨ï¼ˆå¤šå±‚ï¼‰ - * - * @param parentTaskId 父任务 ID - * @param tasks 任务列表 - * @return å­ä»»åŠ¡åˆ—è¡¨ - */ - List getAllChildrenTaskListByParentTaskId(String parentTaskId, List tasks); - - /** - * èŽ·å–æŒ‡å®šä»»åŠ¡çš„å­ä»»åŠ¡åˆ—è¡¨ - * - * @param parentTaskId 父任务ID - * @return å­ä»»åŠ¡åˆ—è¡¨ - */ - List getTaskListByParentTaskId(String parentTaskId); - - /** - * 获得指定æµç¨‹å®žä¾‹çš„æ´»åŠ¨å®žä¾‹åˆ—è¡¨ - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 活动实例列表 - */ - List getActivityListByProcessInstanceId(String processInstanceId); - - /** - * 获得执行编å·å¯¹åº”的活动实例 - * - * @param executionId æ‰§è¡Œç¼–å· - * @return 活动实例 - */ - List getHistoricActivityListByExecutionId(String executionId); - - // ========== Update 写入相关方法 ========== - - /** - * 通过任务 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 通过请求 - */ - void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); - - /** - * ä¸é€šè¿‡ä»»åŠ¡ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO ä¸é€šè¿‡è¯·æ±‚ - */ - void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); - - /** - * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 分é…请求 - */ - void transferTask(Long userId, BpmTaskTransferReqVO reqVO); - - /** - * 将指定æµç¨‹å®žä¾‹çš„ã€è¿›è¡Œä¸­çš„æµç¨‹ä»»åŠ¡ï¼Œç§»åŠ¨åˆ°ç»“æŸèŠ‚ç‚¹ - * - * @param processInstanceId æµç¨‹ç¼–å· - * @param reason 原因 - */ - void moveTaskToEnd(String processInstanceId, String reason); - - /** - * 将任务退回到指定的 targetDefinitionKey ä½ç½® - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 退回的任务keyå’Œå½“å‰æ‰€åœ¨çš„任务ID - */ - void returnTask(Long userId, BpmTaskReturnReqVO reqVO); - - /** - * 将指定任务委派给其他人处ç†ï¼Œç­‰æŽ¥æ”¶äººå¤„ç†åŽå†å›žåˆ°åŽŸå®¡æ‰¹äººæ‰‹ä¸­å®¡æ‰¹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 被委派人和被委派的任务编å·ç†ç”±å‚æ•° - */ - void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO); - - /** - * 任务加签 - * - * @param userId 被加签的用户和任务 ID,加签类型 - * @param reqVO 当å‰ç”¨æˆ· ID - */ - void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO); - - /** - * 任务å‡ç­¾ - * - * @param userId 当å‰ç”¨æˆ·ID - * @param reqVO 被å‡ç­¾çš„任务 ID,ç†ç”± - */ - void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO); - - /** - * 抄é€ä»»åŠ¡ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 通过请求 - */ - void copyTask(Long userId, @Valid BpmTaskCopyReqVO reqVO); - - // ========== Event 事件相关方法 ========== - - /** - * å¤„ç† Task åˆ›å»ºäº‹ä»¶ï¼Œç›®å‰æ˜¯ - *

- * 1. 更新它的状æ€ä¸ºå®¡æ‰¹ä¸­ - * 2. 处ç†è‡ªåŠ¨é€šè¿‡çš„æƒ…å†µï¼Œä¾‹å¦‚è¯´ï¼š1)无审批人时,是å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ï¼›2)éžã€äººå·¥å®¡æ ¸ã€‘时,是å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ - *

- * 注æ„ï¼šå®ƒçš„è§¦å‘æ—¶æœºï¼Œæ™šäºŽ {@link #processTaskAssigned(Task)} ä¹‹åŽ - * - * @param task 任务实体 - */ - void processTaskCreated(Task task); - - /** - * å¤„ç† Task å–æ¶ˆäº‹ä»¶ï¼Œç›®å‰æ˜¯æ›´æ–°å®ƒçš„状æ€ä¸ºå·²å–消 - * - * @param taskId ä»»åŠ¡çš„ç¼–å· - */ - void processTaskCanceled(String taskId); - - /** - * å¤„ç† Task è®¾ç½®å®¡æ‰¹äººäº‹ä»¶ï¼Œç›®å‰æ˜¯å‘é€å®¡æ‰¹æ¶ˆæ¯ - * - * @param task 任务实体 - */ - void processTaskAssigned(Task task); - - /** - * å¤„ç† Task 完æˆäº‹ä»¶ï¼Œç›®å‰æ˜¯å‘é€ä»»åŠ¡åŽç½®é€šçŸ¥ - * - * @param task 任务实体 - */ - void processTaskCompleted(Task task); - - /** - * å¤„ç† Task 审批超时事件,å¯èƒ½ä¼šå¤„ç†å¤šä¸ªå½“å‰å®¡æ‰¹ä¸­çš„任务 - * - * @param processInstanceId æµç¨‹ç¤ºä¾‹ç¼–å· - * @param taskDefineKey 任务 Key - * @param handlerType 处ç†ç±»åž‹ï¼Œå‚è§ {@link BpmUserTaskTimeoutHandlerTypeEnum} - */ - void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType); - - /** - * å¤„ç† ChildProcess å­æµç¨‹çš„审批超时事件 - * - * @param processInstanceId æµç¨‹ç¤ºä¾‹ç¼–å· - * @param taskDefineKey 任务 Key - */ - void processChildProcessTimeout(String processInstanceId, String taskDefineKey); - - /** - * è§¦å‘æµç¨‹ä»»åŠ¡ (ReceiveTask) 的执行 - *

- * 1. Simple 模型 HTTP 回调请求触å‘å™¨èŠ‚ç‚¹çš„å›žè°ƒï¼Œè§¦å‘æµç¨‹ç»§ç»­æ‰§è¡Œ - * 2. Simple æ¨¡åž‹å»¶è¿Ÿå™¨èŠ‚ç‚¹ï¼Œåˆ°æ—¶è§¦å‘æµç¨‹ç»§ç»­æ‰§è¡Œ - * - * @param processInstanceId æµç¨‹ç¤ºä¾‹ç¼–å· - * @param taskDefineKey 任务 Key - */ - void triggerTask(String processInstanceId, String taskDefineKey); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java deleted file mode 100644 index 416444b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java +++ /dev/null @@ -1,1535 +0,0 @@ -package com.zt.plat.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.*; -import cn.hutool.extra.spring.SpringUtil; -import cn.hutool.json.JSONUtil; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.date.DateUtils; -import com.zt.plat.framework.common.util.number.NumberUtils; -import com.zt.plat.framework.common.util.object.ObjectUtils; -import com.zt.plat.framework.common.util.object.PageUtils; -import com.zt.plat.framework.datapermission.core.annotation.DataPermission; -import com.zt.plat.framework.web.core.util.WebFrameworkUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import com.zt.plat.module.bpm.controller.admin.task.vo.task.*; -import com.zt.plat.module.bpm.convert.task.BpmTaskConvert; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.enums.definition.*; -import com.zt.plat.module.bpm.enums.task.BpmCommentTypeEnum; -import com.zt.plat.module.bpm.enums.task.BpmReasonEnum; -import com.zt.plat.module.bpm.enums.task.BpmTaskSignTypeEnum; -import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; -import com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.definition.BpmFormService; -import com.zt.plat.module.bpm.service.definition.BpmModelService; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.message.BpmMessageService; -import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO; -import com.zt.plat.module.system.api.dept.DeptApi; -import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; -import com.zt.plat.module.system.api.user.AdminUserApi; -import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.*; -import org.flowable.engine.HistoryService; -import org.flowable.engine.ManagementService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.engine.runtime.ActivityInstance; -import org.flowable.engine.runtime.Execution; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.DelegationState; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskInfo; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import java.util.*; -import java.util.stream.Stream; - -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; -import static com.zt.plat.module.bpm.enums.ErrorCodeConstants.*; -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; -import static com.zt.plat.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE; -import static com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service 实现类 - * - * @author ZT - * @author jason - */ -@Slf4j -@Service -public class BpmTaskServiceImpl implements BpmTaskService { - - @Resource - private TaskService taskService; - @Resource - private HistoryService historyService; - @Resource - private RuntimeService runtimeService; - @Resource - private ManagementService managementService; - - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmProcessDefinitionService bpmProcessDefinitionService; - @Resource - private BpmProcessInstanceCopyService processInstanceCopyService; - @Resource - private BpmModelService modelService; - @Resource - private BpmMessageService messageService; - @Resource - private BpmFormService formService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - // ========== Query 查询相关方法 ========== - - @Override - public PageResult getTaskTodoPage(Long userId, BpmTaskPageReqVO pageVO) { - TaskQuery taskQuery = taskService.createTaskQuery() - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .active() - .includeProcessVariables() - .orderByTaskCreateTime().desc(); // åˆ›å»ºæ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (StrUtil.isNotEmpty(pageVO.getCategory())) { - taskQuery.taskCategory(pageVO.getCategory()); - } - if (StrUtil.isNotEmpty(pageVO.getProcessDefinitionKey())) { - taskQuery.processDefinitionKey(pageVO.getProcessDefinitionKey()); - } - if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); - taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); - } - long count = taskQuery.count(); - if (count == 0) { - return PageResult.empty(); - } - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - return new PageResult<>(tasks, count); - } - - @Override - public BpmTaskRespVO getTodoTask(Long userId, String taskId, String processInstanceId) { - // 1.1 èŽ·å–æŒ‡å®šçš„用户待办任务 - Task todoTask = getMyTodoTask(userId, taskId); - // 1.2 获å–ä¸åˆ°ï¼Œåˆ™èŽ·å–该æµç¨‹å®žä¾‹ä¸‹ï¼Œç¬¬ä¸€ä¸ªç”¨æˆ·çš„待办任务 - if (todoTask == null) { - todoTask = getMyFirstTodoTask(userId, processInstanceId); - } - if (todoTask == null) { - return null; - } - - // 2. 查询该任务的å­ä»»åŠ¡ - List childrenTasks = getAllChildrenTaskListByParentTaskId(todoTask.getId(), CollUtil.newArrayList(todoTask)); - - // 3. 转æ¢è¿”回 - BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId()); - Map buttonsSetting = BpmnModelUtils.parseButtonsSetting( - bpmnModel, todoTask.getTaskDefinitionKey()); - Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); - Boolean reasonRequire = parseReasonRequire(bpmnModel, todoTask.getTaskDefinitionKey()); - Integer nodeType = parseNodeType(BpmnModelUtils.getFlowElementById(bpmnModel, todoTask.getTaskDefinitionKey())); - - // 4. ä»»åŠ¡è¡¨å• - BpmFormDO taskForm = null; - if (StrUtil.isNotBlank(todoTask.getFormKey())) { - try { - Long formId = Long.parseLong(todoTask.getFormKey()); - taskForm = formService.getForm(formId); - } catch (NumberFormatException e) { - // 如果 formKey 䏿˜¯æ•°å­—(比如是URL),则ä¸å¤„ç†è¡¨å• - taskForm = null; - } - } - - return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) - .setNodeType(nodeType).setSignEnable(signEnable).setReasonRequire(reasonRequire); - } - - /** - * 获得用户指定 taskId 任务编å·çš„“待办â€ï¼ˆæœªå®¡æ‰¹ã€ä¸”å¯å®¡æ ¸ï¼‰çš„任务 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param taskId ä»»åŠ¡ç¼–å· - * @return 任务 - */ - private Task getMyTodoTask(Long userId, String taskId) { - if (StrUtil.isEmpty(taskId)) { - return null; - } - Task task = getTask(taskId); - if (task == null) { - return null; - } - if (!isAssignUserTask(userId, task) && !isAddSignUserTask(userId, task)) { - return null; - } - return task; - } - - /** - * 获得用户指定 processInstanceId æµç¨‹ç¼–å·ä¸‹çš„首个“待办â€ï¼ˆæœªå®¡æ‰¹ã€ä¸”å¯å®¡æ ¸ï¼‰çš„任务 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param processInstanceId æµç¨‹ç¼–å· - * @return 任务 - */ - private Task getMyFirstTodoTask(Long userId, String processInstanceId) { - if (processInstanceId == null) { - return null; - } - // 1. 查询所有任务 - List tasks = taskService.createTaskQuery() - .active() - .processInstanceId(processInstanceId) - .includeTaskLocalVariables() - .includeProcessVariables() - .orderByTaskCreateTime().asc() // 按创建时间å‡åº - .list(); - - // 2. 查询我的首个任务 - return CollUtil.findOne(tasks, task -> { - return isAssignUserTask(userId, task) // 当å‰ç”¨æˆ·ä¸ºå®¡æ‰¹äºº - || isAddSignUserTask(userId, task); // 当å‰ç”¨æˆ·ä¸ºåŠ ç­¾äººï¼ˆä¸ºäº†å‡ç­¾ï¼‰ - }); - } - - @Override - public PageResult getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) { - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() - .finished() // å·²å®Œæˆ - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .includeTaskLocalVariables() - .orderByHistoricTaskInstanceEndTime().desc(); // å®¡æ‰¹æ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); - taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); - } - // 执行查询 - long count = taskQuery.count(); - if (count == 0) { - return PageResult.empty(); - } - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - - // 特殊:强制移除自动完æˆçš„“å‘起人â€èŠ‚ç‚¹ - // 补充说明:由于 taskQuery 无法方é¢çš„过滤,所以暂时通过内存过滤 - tasks.removeIf(task -> task.getTaskDefinitionKey().equals(START_USER_NODE_ID)); - return new PageResult<>(tasks, count); - } - - @Override - public PageResult getTaskPage(Long userId, BpmTaskPageReqVO pageVO) { - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() - .includeTaskLocalVariables() - .taskTenantId(FlowableUtils.getTenantId()) - .orderByHistoricTaskInstanceEndTime().desc(); // å®¡æ‰¹æ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (StrUtil.isNotEmpty(pageVO.getCategory())) { - taskQuery.taskCategory(pageVO.getCategory()); - } - if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); - taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); - } - // 执行查询 - long count = taskQuery.count(); - if (count == 0) { - return PageResult.empty(); - } - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - return new PageResult<>(tasks, count); - } - - @Override - public List getTasksByProcessInstanceIds(List processInstanceIds) { - if (CollUtil.isEmpty(processInstanceIds)) { - return Collections.emptyList(); - } - return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list(); - } - - @Override - public List getTaskListByProcessInstanceId(String processInstanceId, Boolean asc) { - HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() - .includeTaskLocalVariables() - .processInstanceId(processInstanceId); - if (Boolean.TRUE.equals(asc)) { - query.orderByHistoricTaskInstanceStartTime().asc(); - } else { - query.orderByHistoricTaskInstanceStartTime().desc(); - } - return query.list(); - } - - @Override - public Task validateTask(Long userId, String taskId) { - Task task = validateTaskExist(taskId); - // 为什么判断 assignee éžç©ºçš„æƒ…况下? - // 例如说:在审批人为空时,我们会有“自动审批通过â€çš„策略,此时 userId 为 null,å…许通过 - if (StrUtil.isNotBlank(task.getAssignee()) - && ObjectUtil.notEqual(userId, NumberUtils.parseLong(task.getAssignee()))) { - throw exception(TASK_OPERATE_FAIL_ASSIGN_NOT_SELF); - } - return task; - } - - private Task validateTaskExist(String id) { - Task task = getTask(id); - if (task == null) { - throw exception(TASK_NOT_EXISTS); - } - return task; - } - - @Override - public Task getTask(String id) { - return taskService.createTaskQuery().taskId(id).includeTaskLocalVariables().singleResult(); - } - - @Override - public HistoricTaskInstance getHistoricTask(String id) { - return historyService.createHistoricTaskInstanceQuery().taskId(id).includeTaskLocalVariables().singleResult(); - } - - @Override - public List getHistoricTasks(Collection taskIds) { - return historyService.createHistoricTaskInstanceQuery().taskIds(taskIds).includeTaskLocalVariables().list(); - } - - @Override - public List getRunningTaskListByProcessInstanceId(String processInstanceId, Boolean assigned, String defineKey) { - Assert.notNull(processInstanceId, "processInstanceId ä¸èƒ½ä¸ºç©º"); - TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(processInstanceId).active() - .includeTaskLocalVariables(); - if (BooleanUtil.isTrue(assigned)) { - taskQuery.taskAssigned(); - } else if (BooleanUtil.isFalse(assigned)) { - taskQuery.taskUnassigned(); - } - if (StrUtil.isNotEmpty(defineKey)) { - taskQuery.taskDefinitionKey(defineKey); - } - return taskQuery.list(); - } - - @Override - public List getUserTaskListByReturn(String id) { - // 1.1 校验当å‰ä»»åŠ¡ task 存在 - Task task = validateTaskExist(id); - // 1.2 æ ¹æ®æµç¨‹å®šä¹‰èŽ·å–æµç¨‹æ¨¡åž‹ä¿¡æ¯ - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); - FlowElement source = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - if (source == null) { - throw exception(TASK_NOT_EXISTS); - } - - // 2.1 查询该任务的å‰ç½®ä»»åŠ¡èŠ‚ç‚¹çš„ key é›†åˆ - List previousUserList = BpmnModelUtils.getPreviousUserTaskList(source, null, null); - if (CollUtil.isEmpty(previousUserList)) { - return Collections.emptyList(); - } - // 2.2 è¿‡æ»¤ï¼šåªæœ‰ä¸²è¡Œå¯åˆ°è¾¾çš„节点,æ‰å¯ä»¥é€€å›žã€‚类似éžä¸²è¡Œã€å­æµç¨‹æ— æ³•退回 - previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null)); - return previousUserList; - } - - @Override - public List getAllChildrenTaskListByParentTaskId(String parentTaskId, List tasks) { - if (CollUtil.isEmpty(tasks)) { - return Collections.emptyList(); - } - Map> parentTaskMap = convertMultiMap( - filterList(tasks, task -> StrUtil.isNotEmpty(task.getParentTaskId())), TaskInfo::getParentTaskId); - if (CollUtil.isEmpty(parentTaskMap)) { - return Collections.emptyList(); - } - - List result = new ArrayList<>(); - // 1. 递归获å–å­çº§ - Stack stack = new Stack<>(); - stack.push(parentTaskId); - // 2. 递归é历 - for (int i = 0; i < Short.MAX_VALUE; i++) { - if (stack.isEmpty()) { - break; - } - // 2.1 获å–å­ä»»åС们 - String taskId = stack.pop(); - List childTaskList = filterList(tasks, task -> StrUtil.equals(task.getParentTaskId(), taskId)); - // 2.2 如果éžç©ºï¼Œåˆ™æ·»åŠ åˆ° stack 进一步递归 - if (CollUtil.isNotEmpty(childTaskList)) { - stack.addAll(convertList(childTaskList, TaskInfo::getId)); - result.addAll(childTaskList); - } - } - return result; - } - - /** - * 获得所有å­ä»»åŠ¡åˆ—è¡¨ - * - * @param parentTask 父任务 - * @return 所有å­ä»»åŠ¡åˆ—è¡¨ - */ - private List getAllChildTaskList(Task parentTask) { - List result = new ArrayList<>(); - // 1. 递归获å–å­çº§ - Stack stack = new Stack<>(); - stack.push(parentTask); - // 2. 递归é历 - for (int i = 0; i < Short.MAX_VALUE; i++) { - if (stack.isEmpty()) { - break; - } - // 2.1 获å–å­ä»»åС们 - Task task = stack.pop(); - List childTaskList = getTaskListByParentTaskId(task.getId()); - // 2.2 如果éžç©ºï¼Œåˆ™æ·»åŠ åˆ° stack 进一步递归 - if (CollUtil.isNotEmpty(childTaskList)) { - stack.addAll(childTaskList); - result.addAll(childTaskList); - } - } - return result; - } - - @Override - public List getTaskListByParentTaskId(String parentTaskId) { - String tableName = managementService.getTableName(TaskEntity.class); - // taskService.createTaskQuery() 没有 parentId 傿•°ï¼Œæ‰€ä»¥å†™ sql 查询 - String sql = "select ID_,NAME_,OWNER_,ASSIGNEE_ from " + tableName + " where PARENT_TASK_ID_=#{parentTaskId}"; - return taskService.createNativeTaskQuery().sql(sql).parameter("parentTaskId", parentTaskId).list(); - } - - /** - * 获å–å­ä»»åŠ¡ä¸ªæ•° - * - * @param parentTaskId 父任务 ID - * @return 剩余å­ä»»åŠ¡ä¸ªæ•° - */ - private Long getTaskCountByParentTaskId(String parentTaskId) { - String tableName = managementService.getTableName(TaskEntity.class); - String sql = "SELECT COUNT(1) from " + tableName + " WHERE PARENT_TASK_ID_=#{parentTaskId}"; - return taskService.createNativeTaskQuery().sql(sql).parameter("parentTaskId", parentTaskId).count(); - } - - /** - * èŽ·å¾—ä»»åŠ¡æ ¹ä»»åŠ¡çš„çˆ¶ä»»åŠ¡ç¼–å· - * - * @param task 任务 - * @return æ ¹ä»»åŠ¡çš„çˆ¶ä»»åŠ¡ç¼–å· - */ - private String getTaskRootParentId(Task task) { - if (task == null || task.getParentTaskId() == null) { - return null; - } - for (int i = 0; i < Short.MAX_VALUE; i++) { - Task parentTask = getTask(task.getParentTaskId()); - if (parentTask == null) { - return null; - } - if (parentTask.getParentTaskId() == null) { - return parentTask.getId(); - } - task = parentTask; - } - throw new IllegalArgumentException(String.format("Task(%s) 层级过深,无法获å–父节点编å·", task.getId())); - } - - @Override - public List getActivityListByProcessInstanceId(String processInstanceId) { - return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceStartTime().asc().list(); - } - - @Override - public List getHistoricActivityListByExecutionId(String executionId) { - return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list(); - } - - /** - * åˆ¤æ–­æŒ‡å®šç”¨æˆ·ï¼Œæ˜¯å¦æ˜¯å½“å‰ä»»åŠ¡çš„å®¡æ‰¹äºº - * - * @param userId ç”¨æˆ·ç¼–å· - * @param task 任务 - * @return æ˜¯å¦ - */ - private boolean isAssignUserTask(Long userId, Task task) { - Long assignee = NumberUtil.parseLong(task.getAssignee(), null); - return ObjectUtil.equals(userId, assignee); - } - - /** - * åˆ¤æ–­æŒ‡å®šç”¨æˆ·ï¼Œæ˜¯å¦æ˜¯å½“å‰ä»»åŠ¡çš„æ‹¥æœ‰äºº - * - * @param userId ç”¨æˆ·ç¼–å· - * @param task 任务 - * @return æ˜¯å¦ - */ - private boolean isOwnerUserTask(Long userId, Task task) { - Long assignee = NumberUtil.parseLong(task.getOwner(), null); - return ObjectUtil.equal(userId, assignee); - } - - /** - * åˆ¤æ–­æŒ‡å®šç”¨æˆ·ï¼Œæ˜¯å¦æ˜¯å½“å‰ä»»åŠ¡çš„åŠ ç­¾äºº - * - * @param userId 用户 Id - * @param task 任务 - * @return æ˜¯å¦ - */ - private boolean isAddSignUserTask(Long userId, Task task) { - return (isAssignUserTask(userId, task) || isOwnerUserTask(userId, task)) - && BpmTaskSignTypeEnum.of(task.getScopeType()) != null; - } - - // ========== Update 写入相关方法 ========== - - @Override - @Transactional(rollbackFor = Exception.class) - public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { - // 1.1 校验任务存在 - Task task = validateTask(userId, reqVO.getId()); - // 1.2 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - // 1.3 校验签å - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); - Boolean signEnable = parseSignEnable(bpmnModel, task.getTaskDefinitionKey()); - if (signEnable && StrUtil.isEmpty(reqVO.getSignPicUrl())) { - throw exception(TASK_SIGNATURE_NOT_EXISTS); - } - // 1.4 校验审批æ„è§ - Boolean reasonRequire = parseReasonRequire(bpmnModel, task.getTaskDefinitionKey()); - if (reasonRequire && StrUtil.isEmpty(reqVO.getReason())) { - throw exception(TASK_REASON_REQUIRE); - } - - // 情况一:被委派的任务,ä¸è°ƒç”¨ complete 去完æˆä»»åŠ¡ - if (DelegationState.PENDING.equals(task.getDelegationState())) { - approveDelegateTask(reqVO, task); - return; - } - - // 情况二:审批有ã€åŽã€‘加签的任务 - if (BpmTaskSignTypeEnum.AFTER.getType().equals(task.getScopeType())) { - approveAfterSignTask(task, reqVO); - return; - } - - // 情况三:审批普通的任务。大多数情况下,都是这样 - // 2.1 æ›´æ–° task 状æ€ã€åŽŸå› ã€ç­¾å­— - updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.APPROVE.getStatus(), reqVO.getReason()); - if (signEnable) { - taskService.setVariableLocal(task.getId(), BpmnVariableConstants.TASK_SIGN_PIC_URL, reqVO.getSignPicUrl()); - } - // 2.2 添加评论 - taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType(), - BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason())); - - // 3. 设置æµç¨‹å˜é‡ã€‚如果æµç¨‹å˜é‡å‰ç«¯ä¼ ç©ºï¼Œéœ€è¦ä»Žåކå²å®žä¾‹ä¸­èŽ·å–,原因:å‰ç«¯è¡¨å•如果在当å‰èŠ‚ç‚¹æ— å¯ç¼–辑的字段时 variables 一定会为空 - // 场景一:A 节点å‘起,B èŠ‚ç‚¹è¡¨å•æ— å¯ç¼–辑字段,审批通过时,C èŠ‚ç‚¹éœ€è¦æµç¨‹å˜é‡èŽ·å–下一个执行节点,但因为 B 节点无å¯ç¼–辑的字段,variables 为空,æµç¨‹å¯èƒ½å‡ºçŽ°é—®é¢˜ã€‚ - // 场景二:A 节点å‘起,B èŠ‚ç‚¹åªæœ‰æŸä¸€ä¸ªå­—段å¯ç¼–辑(比如 day),但 C 节点需è¦å¤šä¸ªèŠ‚ç‚¹ã€‚ - // (比如 work + day å˜é‡ï¼Œåœ¨å‘起时填写,因为 B èŠ‚ç‚¹åªæœ‰ day 的编辑æƒé™ï¼Œåœ¨å®¡æ‰¹åŽï¼Œvariables 会缺少 work 的值) - Map processVariables = new HashMap<>(); - if (CollUtil.isNotEmpty(instance.getProcessVariables())) { // 获å–历å²ä¸­æµç¨‹å˜é‡ - processVariables.putAll(instance.getProcessVariables()); - } - if (CollUtil.isNotEmpty(reqVO.getVariables())) { // åˆå¹¶å‰ç«¯ä¼ é€’çš„æµç¨‹å˜é‡ï¼Œä»¥å‰ç«¯ä¸ºå‡† - processVariables.putAll(reqVO.getVariables()); - } - - // 如果任务å˜é‡ä¸ä¸ºç©ºï¼Œè®¾ç½®ä»»åŠ¡çº§åˆ«çš„å˜é‡å®žä¾‹ä¿¡æ¯ - if (CollUtil.isNotEmpty(reqVO.getTaskVariables())) { - Map taskVariables = new HashMap<>(); - taskVariables.put("taskVariables", JSONUtil.toJsonStr(reqVO.getTaskVariables())); - taskService.setVariablesLocal(task.getId(), taskVariables); - } - - // 4. æ ¡éªŒå¹¶å¤„ç† APPROVE_USER_SELECT 当å‰å®¡æ‰¹äººï¼Œé€‰æ‹©ä¸‹ä¸€èŠ‚ç‚¹å®¡æ‰¹äººçš„é€»è¾‘ - Map variables = validateAndSetNextAssignees(task.getTaskDefinitionKey(), processVariables, - bpmnModel, reqVO.getNextAssignees(), instance); - runtimeService.setVariables(task.getProcessInstanceId(), variables); - - // 5. 调用 BPM complete 去完æˆä»»åŠ¡ - taskService.complete(task.getId(), variables, true); - - // ã€åŠ ç­¾ä¸“å±žã€‘å¤„ç†åŠ ç­¾ä»»åŠ¡ - handleParentTaskIfSign(task.getParentTaskId()); - } - - /** - * 校验选择的下一个节点的审批人,是å¦åˆæ³• - * - * 1. æ˜¯å¦æœ‰æ¼é€‰ï¼šæ²¡æœ‰é€‰æ‹©å®¡æ‰¹äºº - * 2. æ˜¯å¦æœ‰å¤šé€‰ï¼šéžä¸‹ä¸€ä¸ªèŠ‚ç‚¹ - * - * @param taskDefinitionKey 当å‰ä»»åŠ¡èŠ‚ç‚¹æ ‡è¯† - * @param variables æµç¨‹å˜é‡ - * @param bpmnModel æµç¨‹æ¨¡åž‹ - * @param nextAssignees 下一个节点审批人集åˆï¼ˆå‚数) - * @param processInstance æµç¨‹å®žä¾‹ - */ - @SuppressWarnings("unchecked") - private Map validateAndSetNextAssignees(String taskDefinitionKey, Map variables, BpmnModel bpmnModel, - Map> nextAssignees, ProcessInstance processInstance) { - // simple 设计器第一个节点默认为å‘èµ·äººèŠ‚ç‚¹ï¼Œä¸æ ¡éªŒæ˜¯å¦å­˜åœ¨å®¡æ‰¹äºº - if (Objects.equals(taskDefinitionKey, START_USER_NODE_ID)) { - return variables; - } - // 1. 获å–ä¸‹ä¸€ä¸ªå°†è¦æ‰§è¡Œçš„èŠ‚ç‚¹é›†åˆ - FlowElement flowElement = bpmnModel.getFlowElement(taskDefinitionKey); - List nextFlowNodes = getNextFlowNodes(flowElement, bpmnModel, variables); - - // 2. 校验选择的下一个节点的审批人,是å¦åˆæ³• - for (FlowNode nextFlowNode : nextFlowNodes) { - Integer candidateStrategy = parseCandidateStrategy(nextFlowNode); - // 2.1 情况一:如果节点中的审批人策略为 å‘起人自选 - if (ObjUtil.equals(candidateStrategy, BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy())) { - // 特殊:如果当å‰èŠ‚ç‚¹å·²ç»å­˜åœ¨å®¡æ‰¹äººï¼Œåˆ™ä¸å…许覆盖 - Map> startUserSelectAssignees = FlowableUtils.getStartUserSelectAssignees(processInstance.getProcessVariables()); - if (startUserSelectAssignees != null && CollUtil.isNotEmpty(startUserSelectAssignees.get(nextFlowNode.getId()))) { - continue; - } - // 如果节点存在,但未é…置审批人 - List assignees = nextAssignees != null ? nextAssignees.get(nextFlowNode.getId()) : null; - if (CollUtil.isEmpty(assignees)) { - throw exception(PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG, nextFlowNode.getName()); - } - - // 设置 PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES - if (startUserSelectAssignees == null) { - startUserSelectAssignees = new HashMap<>(); - } - startUserSelectAssignees.put(nextFlowNode.getId(), assignees); - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); - continue; - } - - // 2.2 情况二:如果节点中的审批人策略为 审批人,在审批时选择下一个节点的审批人,并且该节点的审批人为空 - if (ObjUtil.equals(candidateStrategy, BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT.getStrategy())) { - // 如果节点存在,但未é…置审批人 - Map> approveUserSelectAssignees = FlowableUtils.getApproveUserSelectAssignees(processInstance.getProcessVariables()); - List assignees = nextAssignees != null ? nextAssignees.get(nextFlowNode.getId()) : null; - if (CollUtil.isEmpty(assignees)) { - throw exception(PROCESS_INSTANCE_APPROVE_USER_SELECT_ASSIGNEES_NOT_CONFIG, nextFlowNode.getName()); - } - - // 设置 PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES - if (approveUserSelectAssignees == null) { - approveUserSelectAssignees = new HashMap<>(); - } - approveUserSelectAssignees.put(nextFlowNode.getId(), assignees); - Map> existingApproveUserSelectAssignees = (Map>) variables.get( - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES); - if (CollUtil.isNotEmpty(existingApproveUserSelectAssignees)) { - approveUserSelectAssignees.putAll(existingApproveUserSelectAssignees); - } - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES, approveUserSelectAssignees); - } - } - return variables; - } - - /** - * 审批通过存在“åŽåŠ ç­¾â€çš„任务。 - *

- * 注æ„:该任务ä¸èƒ½é©¬ä¸Šå®Œæˆï¼Œéœ€è¦ä¸€ä¸ªä¸­é—´çжæ€ï¼ˆAPPROVING),并激活剩余所有å­ä»»åŠ¡ï¼ˆPROCESS)为å¯å®¡æ‰¹å¤„ç† - * 如果马上完æˆï¼Œåˆ™ä¼šè§¦å‘下一个任务,甚至如果没有下一个任务则æµç¨‹å®žä¾‹å°±ç›´æŽ¥ç»“æŸäº†ï¼ - * - * @param task 当å‰ä»»åŠ¡ - * @param reqVO å‰ç«¯è¯·æ±‚傿•° - */ - private void approveAfterSignTask(Task task, BpmTaskApproveReqVO reqVO) { - // 更新父 task çŠ¶æ€ + 原因 - updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.APPROVING.getStatus(), reqVO.getReason()); - - // 2. 激活å­ä»»åŠ¡ - List childrenTaskList = getTaskListByParentTaskId(task.getId()); - for (Task childrenTask : childrenTaskList) { - taskService.resolveTask(childrenTask.getId()); - // æ›´æ–°å­ task çŠ¶æ€ - updateTaskStatus(childrenTask.getId(), BpmTaskStatusEnum.RUNNING.getStatus()); - } - } - - /** - * 如果父任务是有å‰åŽã€åŠ ç­¾ã€‘çš„ä»»åŠ¡ï¼Œå¦‚æžœå®ƒã€åŠ ç­¾ã€‘å‡ºæ¥çš„å­ä»»åŠ¡éƒ½è¢«å¤„ç†ï¼Œéœ€è¦å¤„ç†çˆ¶ä»»åŠ¡ï¼š - *

- * 1. 如果是ã€å‘å‰ã€‘加签,则需è¦é‡æ–°æ¿€æ´»çˆ¶ä»»åŠ¡ï¼Œè®©å®ƒå¯ä»¥è¢«å®¡æ‰¹ - * 2. 如果是ã€å‘åŽã€‘加签,则需è¦å®Œæˆçˆ¶ä»»åŠ¡ï¼Œè®©å®ƒå®Œæˆå®¡æ‰¹ - * - * @param parentTaskId çˆ¶ä»»åŠ¡ç¼–å· - */ - private void handleParentTaskIfSign(String parentTaskId) { - if (StrUtil.isBlank(parentTaskId)) { - return; - } - // 1.1 判断是å¦è¿˜æœ‰å­ä»»åŠ¡ã€‚å¦‚æžœæ²¡æœ‰ï¼Œå°±ä¸å¤„ç† - Long childrenTaskCount = getTaskCountByParentTaskId(parentTaskId); - if (childrenTaskCount > 0) { - return; - } - // 1.2 åªå¤„ç†åŠ ç­¾çš„çˆ¶ä»»åŠ¡ - Task parentTask = validateTaskExist(parentTaskId); - String scopeType = parentTask.getScopeType(); - if (BpmTaskSignTypeEnum.of(scopeType) == null) { - return; - } - - // 2. å­ä»»åС已处ç†å®Œæˆï¼Œæ¸…空 scopeType 字段,修改 parentTask ä¿¡æ¯ï¼Œæ–¹ä¾¿åŽç»­å¯ä»¥ç»§ç»­å‘å‰åŽå‘åŽåŠ ç­¾ - TaskEntityImpl parentTaskImpl = (TaskEntityImpl) parentTask; - parentTaskImpl.setScopeType(null); - taskService.saveTask(parentTaskImpl); - - // 3.1 情况一:处ç†å‘ã€å‘å‰ã€‘加签 - if (BpmTaskSignTypeEnum.BEFORE.getType().equals(scopeType)) { - // 3.1.1 owner 釿–°èµ‹å€¼ç»™çˆ¶ä»»åŠ¡çš„ assignee,这样它就å¯ä»¥è¢«å®¡æ‰¹ - taskService.resolveTask(parentTaskId); - // 3.1.2 æ›´æ–°æµç¨‹ä»»åŠ¡ status - updateTaskStatus(parentTaskId, BpmTaskStatusEnum.RUNNING.getStatus()); - // 3.2 情况二:处ç†å‘ã€å‘åŽã€‘加签 - } else if (BpmTaskSignTypeEnum.AFTER.getType().equals(scopeType)) { - // åªæœ‰ parentTask 处于 APPROVING 的情况下,æ‰å¯ä»¥ç»§ç»­ complete å®Œæˆ - // å¦åˆ™ï¼Œä¸€ä¸ªæœªå®¡æ‰¹çš„ parentTask 任务,在加签出æ¥çš„任务都被å‡ç­¾çš„æƒ…况下,就直接完æˆå®¡æ‰¹ï¼Œè¿™æ ·ä¼šå­˜åœ¨é—®é¢˜ - Integer status = (Integer) parentTask.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_STATUS); - if (ObjectUtil.notEqual(status, BpmTaskStatusEnum.APPROVING.getStatus())) { - return; - } - // 3.2.2 完æˆè‡ªå·±ï¼ˆå› ä¸ºå®ƒå·²ç»æ²¡æœ‰å­ä»»åŠ¡ï¼Œæ‰€ä»¥ä¹Ÿå¯ä»¥å®Œæˆï¼‰ - updateTaskStatus(parentTaskId, BpmTaskStatusEnum.APPROVE.getStatus()); - taskService.complete(parentTaskId); - } - - // 4. 递归处ç†çˆ¶ä»»åŠ¡ - handleParentTaskIfSign(parentTask.getParentTaskId()); - } - - /** - * 审批被委派的任务 - * - * @param reqVO å‰ç«¯è¯·æ±‚傿•°ï¼ŒåŒ…å«å½“å‰ä»»åŠ¡ID,审批æ„è§ç­‰ - * @param task 当å‰è¢«å®¡æ‰¹çš„任务 - */ - private void approveDelegateTask(BpmTaskApproveReqVO reqVO, Task task) { - // 1. 添加审批æ„è§ - AdminUserRespDTO currentUser = adminUserApi.getUser(WebFrameworkUtils.getLoginUserId()).getCheckedData(); - AdminUserRespDTO ownerUser = adminUserApi.getUser(NumberUtils.parseLong(task.getOwner())).getCheckedData(); // å‘起委托的用户 - Assert.notNull(ownerUser, "委派任务找ä¸åˆ°åŽŸå®¡æ‰¹äººï¼Œéœ€è¦æ£€æŸ¥æ•°æ®"); - taskService.addComment(reqVO.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.DELEGATE_END.getType(), - BpmCommentTypeEnum.DELEGATE_END.formatComment(currentUser.getNickname(), ownerUser.getNickname(), reqVO.getReason())); - - // 2.1 调用 resolveTask 完æˆä»»åŠ¡ã€‚ - // 底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()):将 owner 设置为 assignee - taskService.resolveTask(task.getId()); - // 2.2 æ›´æ–° task çŠ¶æ€ + 原因 - updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.RUNNING.getStatus(), reqVO.getReason()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { - // 1.1 校验任务存在 - Task task = validateTask(userId, reqVO.getId()); - // 1.2 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - - // 2.1 æ›´æ–°æµç¨‹ä»»åŠ¡ä¸ºä¸é€šè¿‡ - updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.REJECT.getStatus(), reqVO.getReason()); - // 2.2 添加æµç¨‹è¯„论 - taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.getType(), - BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason())); - // 2.3 如果当å‰ä»»åŠ¡æ—¶è¢«åŠ ç­¾çš„ï¼Œåˆ™åŠ å®ƒçš„æ ¹ä»»åŠ¡ä¹Ÿæ ‡è®°æˆæœªé€šè¿‡ - // ç–‘é—®ï¼šä¸ºä»€ä¹ˆè¦æ ‡è®°æœªé€šè¿‡å‘¢ï¼Ÿ - // 回答:例如说 A 任务被å‘å‰åŠ ç­¾é™¤ B 任务时,B 任务被审批ä¸é€šè¿‡ï¼Œæ­¤æ—¶ A ä¼šè¢«å–æ¶ˆã€‚而 zt-ui-admin-vue3 ä¸å±•ç¤ºâ€œå·²å–æ¶ˆâ€çš„任务,导致展示ä¸å‡ºå®¡æ‰¹ä¸é€šè¿‡çš„细节。 - if (task.getParentTaskId() != null) { - String rootParentId = getTaskRootParentId(task); - updateTaskStatusAndReason(rootParentId, BpmTaskStatusEnum.REJECT.getStatus(), - BpmCommentTypeEnum.REJECT.formatComment("加签任务ä¸é€šè¿‡")); - taskService.addComment(rootParentId, task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.getType(), - BpmCommentTypeEnum.REJECT.formatComment("加签任务ä¸é€šè¿‡")); - } - - // 3. æ ¹æ®ä¸åŒçš„ RejectHandler 处ç†ç­–ç•¥ - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); - FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - // 3.1 情况一:驳回到指定的任务节点 - BpmUserTaskRejectHandlerTypeEnum userTaskRejectHandlerType = BpmnModelUtils.parseRejectHandlerType(userTaskElement); - if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerTypeEnum.RETURN_USER_TASK) { - String returnTaskId = BpmnModelUtils.parseReturnTaskId(userTaskElement); - Assert.notNull(returnTaskId, "退回的节点ä¸èƒ½ä¸ºç©º"); - returnTask(userId, new BpmTaskReturnReqVO().setId(task.getId()) - .setTargetTaskDefinitionKey(returnTaskId).setReason(reqVO.getReason())); - return; - } - // 3.2 情况二:直接结æŸï¼Œå®¡æ‰¹ä¸é€šè¿‡ - processInstanceService.updateProcessInstanceReject(instance, reqVO.getReason()); // 标记ä¸é€šè¿‡ - moveTaskToEnd(task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason())); // ç»“æŸæµç¨‹ - } - - /** - * æ›´æ–°æµç¨‹ä»»åŠ¡çš„ status çŠ¶æ€ - * - * @param id ä»»åŠ¡ç¼–å· - * @param status çŠ¶æ€ - */ - private void updateTaskStatus(String id, Integer status) { - taskService.setVariableLocal(id, BpmnVariableConstants.TASK_VARIABLE_STATUS, status); - } - - /** - * æ›´æ–°æµç¨‹ä»»åŠ¡çš„ status 状æ€ã€reason ç†ç”± - * - * @param id ä»»åŠ¡ç¼–å· - * @param status çŠ¶æ€ - * @param reason ç†ç”±ï¼ˆå®¡æ‰¹é€šè¿‡ã€å®¡æ‰¹ä¸é€šè¿‡çš„ç†ç”±ï¼‰ - */ - private void updateTaskStatusAndReason(String id, Integer status, String reason) { - updateTaskStatus(id, status); - taskService.setVariableLocal(id, BpmnVariableConstants.TASK_VARIABLE_REASON, reason); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) { - // 1.1 当å‰ä»»åŠ¡ task - Task task = validateTask(userId, reqVO.getId()); - if (task.isSuspended()) { - throw exception(TASK_IS_PENDING); - } - // 1.2 校验æºå¤´å’Œç›®æ ‡èŠ‚ç‚¹çš„å…³ç³»ï¼Œå¹¶è¿”å›žç›®æ ‡å…ƒç´  - FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), - reqVO.getTargetTaskDefinitionKey(), task.getProcessDefinitionId()); - - // 2. 调用 Flowable 框架的退回逻辑 - returnTask(userId, task, targetElement, reqVO); - } - - /** - * 退回æµç¨‹èŠ‚ç‚¹æ—¶ï¼Œæ ¡éªŒç›®æ ‡ä»»åŠ¡èŠ‚ç‚¹æ˜¯å¦å¯é€€å›ž - * - * @param sourceKey 当å‰ä»»åŠ¡èŠ‚ç‚¹ Key - * @param targetKey 目标任务节点 key - * @param processDefinitionId 当剿µç¨‹å®šä¹‰ ID - * @return 目标任务节点元素 - */ - private FlowElement validateTargetTaskCanReturn(String sourceKey, String targetKey, String processDefinitionId) { - // 1.1 èŽ·å–æµç¨‹æ¨¡åž‹ä¿¡æ¯ - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processDefinitionId); - // 1.3 获å–当å‰ä»»åŠ¡èŠ‚ç‚¹å…ƒç´  - FlowElement source = BpmnModelUtils.getFlowElementById(bpmnModel, sourceKey); - // 1.3 获å–跳转的节点元素 - FlowElement target = BpmnModelUtils.getFlowElementById(bpmnModel, targetKey); - if (target == null) { - throw exception(TASK_TARGET_NODE_NOT_EXISTS); - } - - // 2.2 åªæœ‰ä¸²è¡Œå¯åˆ°è¾¾çš„节点,æ‰å¯ä»¥é€€å›žã€‚类似éžä¸²è¡Œã€å­æµç¨‹æ— æ³•退回 - if (!BpmnModelUtils.isSequentialReachable(source, target, null)) { - throw exception(TASK_RETURN_FAIL_SOURCE_TARGET_ERROR); - } - return target; - } - - /** - * 执行退回逻辑 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param currentTask 当å‰é€€å›žçš„任务 - * @param targetElement 需è¦é€€å›žåˆ°çš„目标任务 - * @param reqVO å‰ç«¯å‚æ•°å°è£… - */ - public void returnTask(Long userId, Task currentTask, FlowElement targetElement, BpmTaskReturnReqVO reqVO) { - // 1. 获得所有需è¦å›žæ’¤çš„任务 taskDefinitionKey,用于ç¨åŽçš„ moveActivityIdsToSingleActivityId 回撤 - // 1.1 èŽ·å–æ‰€æœ‰æ­£å¸¸è¿›è¡Œçš„任务节点 Key - List taskList = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).list(); - List runTaskKeyList = convertList(taskList, Task::getTaskDefinitionKey); - // 1.2 通过 targetElement 的出å£è¿žçº¿ï¼Œè®¡ç®—在 runTaskKeyList 有哪些 key 需è¦è¢«æ’¤å›ž - // 为什么ä¸ç›´æŽ¥ä½¿ç”¨ runTaskKeyList 呢?因为å¯èƒ½å­˜åœ¨å¤šä¸ªå®¡æ‰¹åˆ†æ”¯ï¼Œä¾‹å¦‚说:A -> B -> C å’Œ D -> F,而åªè¦ C 撤回到 Aï¼Œéœ€è¦æŽ’é™¤æŽ‰ F - List returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList, null, null); - List returnTaskKeyList = convertList(returnUserTaskList, UserTask::getId); - - List runExecutionIds = new ArrayList<>(); - // 2. 给当å‰è¦è¢«é€€å›žçš„ task 数组,设置退回æ„è§ - taskList.forEach(task -> { - // éœ€è¦æŽ’é™¤æŽ‰ï¼Œä¸éœ€è¦è®¾ç½®é€€å›žæ„è§çš„任务 - if (!returnTaskKeyList.contains(task.getTaskDefinitionKey())) { - return; - } - runExecutionIds.add(task.getExecutionId()); - - // 判断是å¦åˆ†é…给自己任务,因为会签任务,一个节点会有多个任务 - if (isAssignUserTask(userId, task)) { // 情况一:自己的任务,进行 RETURN 标记 - // 2.1.1 添加评论 - taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), BpmCommentTypeEnum.RETURN.getType(), - BpmCommentTypeEnum.RETURN.formatComment(reqVO.getReason())); - // 2.1.2 æ›´æ–° task çŠ¶æ€ + 原因 - updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.RETURN.getStatus(), reqVO.getReason()); - } else { // 情况二:别人的任务,进行 CANCEL 标记 - processTaskCanceled(task.getId()); - } - }); - - // 3. 设置æµç¨‹å˜é‡èŠ‚ç‚¹é©³å›žæ ‡è®°ï¼šç”¨äºŽé©³å›žåˆ°èŠ‚ç‚¹ï¼Œä¸æ‰§è¡Œ BpmUserTaskAssignStartUserHandlerTypeEnum 策略。导致自动通过 - runtimeService.setVariable(currentTask.getProcessInstanceId(), - String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE); - // 4. 执行驳回 - // 使用 moveExecutionsToSingleActivityId æ›¿æ¢ moveActivityIdsToSingleActivityId 原因: - // 当多实例任务回退的时候有问题。相关 issue: https://github.com/flowable/flowable-engine/issues/3944 - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(currentTask.getProcessInstanceId()) - .moveExecutionsToSingleActivityId(runExecutionIds, reqVO.getTargetTaskDefinitionKey()) - .changeState(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { - String taskId = reqVO.getId(); - // 1.1 校验任务 - Task task = validateTask(userId, reqVO.getId()); - if (task.getAssignee().equals(reqVO.getDelegateUserId().toString())) { // 校验当å‰å®¡æ‰¹äººå’Œè¢«å§”æ´¾äººä¸æ˜¯åŒä¸€äºº - throw exception(TASK_DELEGATE_FAIL_USER_REPEAT); - } - // 1.2 校验目标用户存在 - AdminUserRespDTO delegateUser = adminUserApi.getUser(reqVO.getDelegateUserId()).getCheckedData(); - if (delegateUser == null) { - throw exception(TASK_DELEGATE_FAIL_USER_NOT_EXISTS); - } - - // 2. 添加委托æ„è§ - AdminUserRespDTO currentUser = adminUserApi.getUser(userId).getCheckedData(); - taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.DELEGATE_START.getType(), - BpmCommentTypeEnum.DELEGATE_START.formatComment(currentUser.getNickname(), delegateUser.getNickname(), reqVO.getReason())); - - // 3.1 设置任务所有人 (owner) 为原任务的处ç†äºº (assignee) - taskService.setOwner(taskId, task.getAssignee()); - // 3.2 执行委派,将任务委派给 delegateUser - taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); - // 补充说明:委托ä¸å•独设置状æ€ã€‚如果需è¦ï¼Œå¯é€šè¿‡ Task çš„ DelegationState 字段,判断是å¦ä¸º DelegationState.PENDING 委托中 - } - - @Override - public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) { - String taskId = reqVO.getId(); - // 1.1 校验任务 - Task task = validateTask(userId, reqVO.getId()); - if (task.getAssignee().equals(reqVO.getAssigneeUserId().toString())) { // 校验当å‰å®¡æ‰¹äººå’Œè¢«è½¬æ´¾äººä¸æ˜¯åŒä¸€äºº - throw exception(TASK_TRANSFER_FAIL_USER_REPEAT); - } - // 1.2 校验目标用户存在 - AdminUserRespDTO assigneeUser = adminUserApi.getUser(reqVO.getAssigneeUserId()).getCheckedData(); - if (assigneeUser == null) { - throw exception(TASK_TRANSFER_FAIL_USER_NOT_EXISTS); - } - - // 2. 添加委托æ„è§ - AdminUserRespDTO currentUser = adminUserApi.getUser(userId).getCheckedData(); - taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.TRANSFER.getType(), - BpmCommentTypeEnum.TRANSFER.formatComment(currentUser.getNickname(), assigneeUser.getNickname(), reqVO.getReason())); - - // 3.1 设置任务所有人 (owner) 为原任务的处ç†äºº (assignee) - taskService.setOwner(taskId, task.getAssignee()); - // 3.2 执行转派(审批人),将任务转派给 assigneeUser - // 委托( delegate)和转派(transfer)的差别,就在这å—的调用ï¼ï¼ï¼ï¼ - taskService.setAssignee(taskId, reqVO.getAssigneeUserId().toString()); - } - - @Override - public void moveTaskToEnd(String processInstanceId, String reason) { - List taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null); - if (CollUtil.isEmpty(taskList)) { - return; - } - - // 1. 其它未结æŸçš„ä»»åŠ¡ï¼Œç›´æŽ¥å–æ¶ˆ - // 疑问:为什么ä¸é€šè¿‡ updateTaskStatusWhenCanceled 监å¬å–消,而是直接æå‰è°ƒç”¨å‘¢ï¼Ÿ - // å›žç­”ï¼šè¯¦ç»†è§ updateTaskStatusWhenCanceled 的方法,加签的场景 - taskList.forEach(task -> { - Integer otherTaskStatus = (Integer) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_STATUS); - if (BpmTaskStatusEnum.isEndStatus(otherTaskStatus)) { - return; - } - processTaskCanceled(task.getId()); - }); - - // 2. 终止æµç¨‹ - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(taskList.get(0).getProcessDefinitionId()); - List activityIds = CollUtil.newArrayList(convertSet(taskList, Task::getTaskDefinitionKey)); - EndEvent endEvent = BpmnModelUtils.getEndEvent(bpmnModel); - Assert.notNull(endEvent, "结æŸèŠ‚ç‚¹ä¸èƒ½ä¸ºç©º"); - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(processInstanceId) - .moveActivityIdsToSingleActivityId(activityIds, endEvent.getId()) - .changeState(); - - // 3. 特殊:如果跳转到 EndEvent æµç¨‹è¿˜æœªç»“æŸï¼Œ 执行 deleteProcessInstance 方法 - // TODO ZT:目å‰å‘现并行分支情况下,会存在这个情况,åŽç»­çœ‹çœ‹æœ‰æ²¡æ›´å¥½çš„æ–¹æ¡ˆï¼› - List executions = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list(); - if (CollUtil.isNotEmpty(executions)) { - log.warn("[moveTaskToEnd][执行跳转到 EndEvent åŽ, æµç¨‹å®žä¾‹æœªç»“æŸï¼Œå¼ºåˆ¶æ‰§è¡Œ deleteProcessInstance 方法]"); - runtimeService.deleteProcessInstance(processInstanceId, reason); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO) { - // 1. 获å–和校验任务 - TaskEntityImpl taskEntity = validateTaskCanCreateSign(userId, reqVO); - List userList = adminUserApi.getUserList(reqVO.getUserIds()).getCheckedData(); - if (CollUtil.isEmpty(userList)) { - throw exception(TASK_SIGN_CREATE_USER_NOT_EXIST); - } - - // 2. 处ç†å½“å‰ä»»åŠ¡ - // 2.1 å¼€å¯è®¡æ•°åŠŸèƒ½ï¼Œä¸»è¦ç”¨äºŽä¸ºäº†è®©è¡¨ ACT_RU_TASK 中的 SUB_TASK_COUNT_ 字段记录下总共有多少å­ä»»åŠ¡ï¼ŒåŽç»­å¯èƒ½æœ‰ç”¨ - taskEntity.setCountEnabled(true); - // 2.2 å‘å‰åŠ ç­¾ï¼Œè®¾ç½® owner,置空 assign。等å­ä»»åŠ¡éƒ½å®ŒæˆåŽï¼Œå†è°ƒç”¨ resolveTask 釿–°å°† owner 设置为 assign - // 原因是:ä¸èƒ½å’Œå‘å‰åŠ ç­¾çš„å­ä»»åŠ¡ä¸€èµ·å®¡æ‰¹ï¼Œéœ€è¦ç­‰å‰é¢çš„å­ä»»åŠ¡éƒ½å®Œæˆæ‰èƒ½å®¡æ‰¹ - if (reqVO.getType().equals(BpmTaskSignTypeEnum.BEFORE.getType())) { - taskEntity.setOwner(taskEntity.getAssignee()); - taskEntity.setAssignee(null); - } - // 2.4 记录加签方å¼ï¼Œå®Œæˆä»»åŠ¡æ—¶éœ€è¦ç”¨åˆ°åˆ¤æ–­ - taskEntity.setScopeType(reqVO.getType()); - // 2.5 ä¿å­˜å½“å‰ä»»åŠ¡ä¿®æ”¹åŽçš„值 - taskService.saveTask(taskEntity); - // 2.6 æ›´æ–° task 状æ€ä¸º WAITï¼Œåªæœ‰åœ¨å‘å‰åŠ ç­¾çš„æ—¶å€™ - if (reqVO.getType().equals(BpmTaskSignTypeEnum.BEFORE.getType())) { - updateTaskStatus(taskEntity.getId(), BpmTaskStatusEnum.WAIT.getStatus()); - } - - // 3. 创建加签任务 - createSignTaskList(convertList(reqVO.getUserIds(), String::valueOf), taskEntity); - - // 4. 记录加签的评论到 task 任务 - AdminUserRespDTO currentUser = adminUserApi.getUser(userId).getCheckedData(); - String comment = StrUtil.format(BpmCommentTypeEnum.ADD_SIGN.getComment(), - currentUser.getNickname(), BpmTaskSignTypeEnum.nameOfType(reqVO.getType()), - String.join(",", convertList(userList, AdminUserRespDTO::getNickname)), reqVO.getReason()); - taskService.addComment(reqVO.getId(), taskEntity.getProcessInstanceId(), BpmCommentTypeEnum.ADD_SIGN.getType(), comment); - } - - /** - * 校验任务是å¦å¯ä»¥åŠ ç­¾ï¼Œä¸»è¦æ ¡éªŒåŠ ç­¾ç±»åž‹æ˜¯å¦ä¸€è‡´ï¼š - *

- * 1. 如果存在“å‘å‰åŠ ç­¾â€çš„任务,则ä¸èƒ½â€œå‘åŽåŠ ç­¾â€ - * 2. 如果存在“å‘åŽåŠ ç­¾â€çš„任务,则ä¸èƒ½â€œå‘å‰åŠ ç­¾â€ - * - * @param userId 当å‰ç”¨æˆ· ID - * @param reqVO è¯·æ±‚å‚æ•°ï¼ŒåŒ…å«ä»»åŠ¡ ID 和加签类型 - * @return 当å‰ä»»åŠ¡ - */ - private TaskEntityImpl validateTaskCanCreateSign(Long userId, BpmTaskSignCreateReqVO reqVO) { - TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId()); - // å‘å‰åŠ ç­¾å’Œå‘åŽåŠ ç­¾ä¸èƒ½åŒæ—¶å­˜åœ¨ - if (taskEntity.getScopeType() != null - && ObjectUtil.notEqual(taskEntity.getScopeType(), reqVO.getType())) { - throw exception(TASK_SIGN_CREATE_TYPE_ERROR, - BpmTaskSignTypeEnum.nameOfType(taskEntity.getScopeType()), BpmTaskSignTypeEnum.nameOfType(reqVO.getType())); - } - - // åŒä¸€ä¸ª key 的任务,审批人ä¸é‡å¤ - List taskList = taskService.createTaskQuery().processInstanceId(taskEntity.getProcessInstanceId()) - .taskDefinitionKey(taskEntity.getTaskDefinitionKey()).list(); - List currentAssigneeList = convertListByFlatMap(taskList, task -> // 需è¦è€ƒè™‘ owner 的情况,因为å‘åŽåŠ ç­¾æ—¶ï¼Œå®ƒæš‚æ—¶æ²¡ assignee 而是 owner - Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); - if (CollUtil.containsAny(currentAssigneeList, reqVO.getUserIds())) { - List userList = adminUserApi.getUserList(CollUtil.intersection(currentAssigneeList, reqVO.getUserIds())).getCheckedData(); - throw exception(TASK_SIGN_CREATE_USER_REPEAT, String.join(",", convertList(userList, AdminUserRespDTO::getNickname))); - } - return taskEntity; - } - - /** - * 创建加签å­ä»»åŠ¡ - * - * @param userIds 被加签的用户 ID - * @param taskEntity 被加签的任务 - */ - private void createSignTaskList(List userIds, TaskEntityImpl taskEntity) { - if (CollUtil.isEmpty(userIds)) { - return; - } - // 创建加签人的新任务,全部基于 taskEntity 为父任务æ¥åˆ›å»º - for (String addSignId : userIds) { - if (StrUtil.isBlank(addSignId)) { - continue; - } - createSignTask(taskEntity, addSignId); - } - } - - /** - * 创建加签å­ä»»åŠ¡ - * - * @param parentTask 父任务 - * @param assignee å­ä»»åŠ¡çš„æ‰§è¡Œäºº - */ - private void createSignTask(TaskEntityImpl parentTask, String assignee) { - // 1. 生æˆå­ä»»åŠ¡ - TaskEntityImpl task = (TaskEntityImpl) taskService.newTask(IdUtil.fastSimpleUUID()); - BpmTaskConvert.INSTANCE.copyTo(parentTask, task); - - // 2.1 å‘å‰åŠ ç­¾ï¼Œè®¾ç½®å®¡æ‰¹äºº - if (BpmTaskSignTypeEnum.BEFORE.getType().equals(parentTask.getScopeType())) { - task.setAssignee(assignee); - // 2.2 å‘åŽåŠ ç­¾ï¼Œè®¾ç½® owner ä¸è®¾ç½® assignee 是因为ä¸èƒ½åŒæ—¶å®¡æ‰¹ï¼Œéœ€è¦ç­‰çˆ¶ä»»åŠ¡å®Œæˆ - } else { - task.setOwner(assignee); - } - // 2.3 ä¿å­˜å­ä»»åŠ¡ - taskService.saveTask(task); - - // 3. å‘åŽå‰ç­¾ï¼Œè®¾ç½®å­ä»»åŠ¡çš„çŠ¶æ€ä¸º WAIT,因为需è¦ç­‰çˆ¶ä»»åŠ¡å®¡æ‰¹å®Œ - if (BpmTaskSignTypeEnum.AFTER.getType().equals(parentTask.getScopeType())) { - updateTaskStatus(task.getId(), BpmTaskStatusEnum.WAIT.getStatus()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - @SuppressWarnings("DataFlowIssue") - public void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO) { - // 1.1 校验 task å¯ä»¥è¢«å‡ç­¾ - Task task = validateTaskCanSignDelete(reqVO.getId()); - // 1.2 æ ¡éªŒå–æ¶ˆäººå­˜åœ¨ - AdminUserRespDTO cancelUser = null; - if (StrUtil.isNotBlank(task.getAssignee())) { - cancelUser = adminUserApi.getUser(NumberUtils.parseLong(task.getAssignee())).getCheckedData(); - } - if (cancelUser == null && StrUtil.isNotBlank(task.getOwner())) { - cancelUser = adminUserApi.getUser(NumberUtils.parseLong(task.getOwner())).getCheckedData(); - } - Assert.notNull(cancelUser, "任务中没有所有者和审批人,数æ®é”™è¯¯"); - - // 2.1 获得å­ä»»åŠ¡åˆ—è¡¨ï¼ŒåŒ…æ‹¬å­ä»»åŠ¡çš„å­ä»»åŠ¡ - List childTaskList = getAllChildTaskList(task); - childTaskList.add(task); - // 2.2 æ›´æ–°å­ä»»åŠ¡ä¸ºå·²å–æ¶ˆ - String cancelReason = StrUtil.format("ä»»åŠ¡è¢«å–æ¶ˆï¼ŒåŽŸå› ï¼šç”±äºŽ[{}]æ“作[å‡ç­¾],", cancelUser.getNickname()); - childTaskList.forEach(childTask -> updateTaskStatusAndReason(childTask.getId(), BpmTaskStatusEnum.CANCEL.getStatus(), cancelReason)); - // 2.3 删除任务和所有å­ä»»åŠ¡ - taskService.deleteTasks(convertList(childTaskList, Task::getId)); - - // 3. 记录日志到父任务中。先记录日志是因为,通过 handleParentTask 方法之åŽï¼Œä»»åŠ¡å¯èƒ½è¢«å®Œæˆäº†ï¼Œå¹¶ä¸”ä¸å­˜åœ¨äº†ï¼Œä¼šæŠ¥å¼‚常,所以先记录 - AdminUserRespDTO user = adminUserApi.getUser(userId).getCheckedData(); - taskService.addComment(task.getParentTaskId(), task.getProcessInstanceId(), BpmCommentTypeEnum.SUB_SIGN.getType(), - StrUtil.format(BpmCommentTypeEnum.SUB_SIGN.getComment(), user.getNickname(), cancelUser.getNickname())); - - // 4. 处ç†å½“å‰ä»»åŠ¡çš„çˆ¶ä»»åŠ¡ - handleParentTaskIfSign(task.getParentTaskId()); - } - - @Override - public void copyTask(Long userId, BpmTaskCopyReqVO reqVO) { - processInstanceCopyService.createProcessInstanceCopy(reqVO.getCopyUserIds(), reqVO.getReason(), reqVO.getId()); - } - - /** - * 校验任务是å¦èƒ½è¢«å‡ç­¾ - * - * @param id ä»»åŠ¡ç¼–å· - * @return ä»»åŠ¡ä¿¡æ¯ - */ - private Task validateTaskCanSignDelete(String id) { - Task task = validateTaskExist(id); - if (task.getParentTaskId() == null) { - throw exception(TASK_SIGN_DELETE_NO_PARENT); - } - Task parentTask = getTask(task.getParentTaskId()); - if (parentTask == null) { - throw exception(TASK_SIGN_DELETE_NO_PARENT); - } - if (BpmTaskSignTypeEnum.of(parentTask.getScopeType()) == null) { - throw exception(TASK_SIGN_DELETE_NO_PARENT); - } - return task; - } - - // ========== Event 事件相关方法 ========== - - @Override - public void processTaskCreated(Task task) { - // 1. 设置为待办中 - Integer status = (Integer) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_STATUS); - if (status != null) { - log.error("[updateTaskStatusWhenCreated][taskId({}) å·²ç»æœ‰çжæ€({})]", task.getId(), status); - return; - } - updateTaskStatus(task.getId(), BpmTaskStatusEnum.RUNNING.getStatus()); - - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (processInstance == null) { - log.error("[processTaskCreated][taskId({}) 没有找到æµç¨‹å®žä¾‹]", task.getId()); - return; - } - BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService. - getProcessDefinitionInfo(processInstance.getProcessDefinitionId()); - if (processDefinitionInfo == null) { - log.error("[processTaskCreated][processDefinitionId({}) 没有找到æµç¨‹å®šä¹‰]", processInstance.getProcessDefinitionId()); - return; - } - - // 2. 任务å‰ç½®é€šçŸ¥ - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())){ - BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskBeforeTriggerSetting(); - BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, - setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); - } - - // 3. 处ç†è‡ªåŠ¨é€šè¿‡çš„æƒ…å†µï¼Œä¾‹å¦‚è¯´ï¼š1)无审批人时,是å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ï¼›2)éžã€äººå·¥å®¡æ ¸ã€‘时,是å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); - FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - Integer approveType = BpmnModelUtils.parseApproveType(userTaskElement); - Integer assignEmptyHandlerType = BpmnModelUtils.parseAssignEmptyHandlerType(userTaskElement); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - /** - * 特殊情况:部分情况下,TransactionSynchronizationManager 注册 afterCommit ç›‘å¬æ—¶ï¼Œä¸ä¼šè¢«è°ƒç”¨ï¼Œä½†æ˜¯ afterCompletion å¯ä»¥ - * 例如说:第一个 task 就是é…ç½®ã€è‡ªåŠ¨é€šè¿‡ã€‘æˆ–è€…ã€è‡ªåŠ¨æ‹’ç»ã€‘æ—¶ - * å‚è§ issue å馈 - */ - @Override - public void afterCompletion(int transactionStatus) { - // 回滚情况,直接返回 - if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_ROLLED_BACK)) { - return; - } - // 特殊情况:第一个 task ã€è‡ªåŠ¨é€šè¿‡ã€‘æ—¶ï¼Œç¬¬äºŒä¸ªä»»åŠ¡è®¾ç½®å®¡æ‰¹äººæ—¶ transactionStatus 会为 STATUS_UNKNOWN,ä¸çŸ¥é“啥原因 - if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_UNKNOWN) - && getTask(task.getId()) == null) { - return; - } - // 特殊情况一:ã€äººå·¥å®¡æ ¸ã€‘审批人为空,根æ®é…置是å¦è¦è‡ªåŠ¨é€šè¿‡ã€è‡ªåŠ¨æ‹’ç» - if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) { - // å¦‚æžœæœ‰å®¡æ‰¹äººã€æˆ–è€…æ‹¥æœ‰äººï¼Œåˆ™è¯´æ˜Žä¸æ»¡è¶³æƒ…况一,ä¸è‡ªåŠ¨é€šè¿‡ã€ä¸è‡ªåŠ¨æ‹’ç» - if (!ObjectUtil.isAllEmpty(task.getAssignee(), task.getOwner())) { - return; - } - if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.APPROVE.getType())) { - getSelf().approveTask(null, new BpmTaskApproveReqVO() - .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_APPROVE.getReason())); - } else if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.REJECT.getType())) { - getSelf().rejectTask(null, new BpmTaskRejectReqVO() - .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_REJECT.getReason())); - } - // 特殊情况二:ã€è‡ªåŠ¨å®¡æ ¸ã€‘å®¡æ‰¹ç±»åž‹ä¸ºè‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ - } else { - if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType())) { - getSelf().approveTask(null, new BpmTaskApproveReqVO() - .setId(task.getId()).setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason())); - } else if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { - getSelf().rejectTask(null, new BpmTaskRejectReqVO() - .setId(task.getId()).setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_REJECT.getReason())); - } - } - } - - }); - } - - /** - * é‡è¦è¡¥å……说明:该方法目å‰ä¸»è¦æœ‰ä¸¤ä¸ªæƒ…况会调用到: - *

- * 1. 或签场景 + 审批通过:一个或签有多个审批时,如果 A 审批通过,其它或签 Bã€C 等任务会被 Flowable 自动删除,此时需è¦é€šè¿‡è¯¥æ–¹æ³•更新状æ€ä¸ºå·²å–消 - * 2. 审批ä¸é€šè¿‡ï¼šåœ¨ {@link #rejectTask(Long, BpmTaskRejectReqVO)} ä¸é€šè¿‡æ—¶ï¼Œå¯¹äºŽåŠ ç­¾çš„ä»»åŠ¡ï¼Œä¸ä¼šè¢« Flowable 删除,此时需è¦é€šè¿‡è¯¥æ–¹æ³•更新状æ€ä¸ºå·²å–消 - */ - @Override - public void processTaskCanceled(String taskId) { - Task task = getTask(taskId); - // 1. å¯èƒ½åªæ˜¯æ´»åŠ¨ï¼Œä¸æ˜¯ä»»åŠ¡ï¼Œæ‰€ä»¥æŸ¥è¯¢ä¸åˆ° - if (task == null) { - log.error("[updateTaskStatusWhenCanceled][taskId({}) 任务ä¸å­˜åœ¨]", taskId); - return; - } - - // 2. æ›´æ–° task çŠ¶æ€ + 原因 - Integer status = (Integer) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_STATUS); - if (BpmTaskStatusEnum.isEndStatus(status)) { - log.error("[updateTaskStatusWhenCanceled][taskId({}) 处于结果({}),无需进行更新]", taskId, status); - return; - } - updateTaskStatusAndReason(taskId, BpmTaskStatusEnum.CANCEL.getStatus(), BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); - // 补充说明:由于 Task è¢«åˆ é™¤æˆ HistoricTask åŽï¼Œæ— æ³•通过 taskService.addComment 添加ç†ç”±ï¼Œæ‰€ä»¥æ— æ³•å­˜å‚¨å…·ä½“çš„å–æ¶ˆç†ç”± - } - - @Override - @DataPermission(enable = false) // å¿½ç•¥æ•°æ®æƒé™ï¼Œé¿å…因为过滤,导致找ä¸åˆ°å€™é€‰äºº - public void processTaskAssigned(Task task) { - // å‘é€é€šçŸ¥ã€‚在事务æäº¤æ—¶ï¼Œæ‰¹é‡æ‰§è¡Œæ“作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监å¬äº‹åŠ¡çš„æäº¤æ¥å®žçŽ°ã€‚ - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - /** - * 特殊情况:部分情况下,TransactionSynchronizationManager 注册 afterCommit ç›‘å¬æ—¶ï¼Œä¸ä¼šè¢«è°ƒç”¨ï¼Œä½†æ˜¯ afterCompletion å¯ä»¥ - * 例如说:第一个 task 就是é…ç½®ã€è‡ªåŠ¨é€šè¿‡ã€‘æˆ–è€…ã€è‡ªåŠ¨æ‹’ç»ã€‘æ—¶ - * å‚è§ issue å馈 - */ - @Override - public void afterCompletion(int transactionStatus) { - // 回滚情况,直接返回 - if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_ROLLED_BACK)) { - return; - } - // 特殊情况:第一个 task ã€è‡ªåŠ¨é€šè¿‡ã€‘æ—¶ï¼Œç¬¬äºŒä¸ªä»»åŠ¡è®¾ç½®å®¡æ‰¹äººæ—¶ transactionStatus 会为 STATUS_UNKNOWN,ä¸çŸ¥é“啥原因 - if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_UNKNOWN) - && getTask(task.getId()) == null) { - return; - } - if (StrUtil.isEmpty(task.getAssignee())) { - log.error("[processTaskAssigned][taskId({}) 没有分é…到负责人]", task.getId()); - return; - } - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (processInstance == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到æµç¨‹å®žä¾‹]", task.getId()); - return; - } - - // 自动去é‡ï¼Œé€šè¿‡è‡ªåŠ¨å®¡æ‰¹çš„æ–¹å¼ TODO @ZT 驳回的情况得考虑一下;@lesan:驳回åŽï¼Œåˆè‡ªåŠ¨å®¡æ‰¹ä¹ˆï¼Ÿ - BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.getProcessDefinitionInfo(task.getProcessDefinitionId()); - if (processDefinitionInfo == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到æµç¨‹å®šä¹‰({})]", task.getId(), task.getProcessDefinitionId()); - return; - } - if (processDefinitionInfo.getAutoApprovalType() != null) { - HistoricTaskInstanceQuery sameAssigneeQuery = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) - .taskAssignee(task.getAssignee()) // 相åŒå®¡æ‰¹äºº - .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) - .finished(); - if (BpmAutoApproveTypeEnum.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) - && sameAssigneeQuery.count() > 0) { - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveTypeEnum.APPROVE_ALL.getName())); - return; - } - if (BpmAutoApproveTypeEnum.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); - if (bpmnModel == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到æµç¨‹æ¨¡åž‹({})]", task.getId(), task.getProcessDefinitionId()); - return; - } - List sourceTaskIds = convertList(BpmnModelUtils.getElementIncomingFlows( // èŽ·å–æ‰€æœ‰ä¸Šä¸€ä¸ªèŠ‚ç‚¹ - BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())), - SequenceFlow::getSourceRef); - if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveTypeEnum.APPROVE_SEQUENT.getName())); - return; - } - } - } - - // 获å–å‘起人节点 - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); - if (bpmnModel == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到æµç¨‹æ¨¡åž‹]", task.getId()); - return; - } - FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - // 判断是å¦ä¸ºé€€å›žæˆ–者驳回:如果是退回或者驳回ä¸èµ°è¿™ä¸ªç­–ç•¥ - // TODO ZT:ã€ä¼˜åŒ–ã€‘æœªæ¥æœ‰æ²¡æ›´å¥½çš„判断方å¼ï¼Ÿï¼å¦å¤–,还è¦è€ƒè™‘æ¸…ç†æœºåˆ¶ã€‚就是说,下次处ç†äº†ä¹‹åŽï¼Œå°±ç§»é™¤è¿™ä¸ªæ ‡è¯† - Boolean returnTaskFlag = runtimeService.getVariable(processInstance.getProcessInstanceId(), - String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, task.getTaskDefinitionKey()), Boolean.class); - Boolean skipStartUserNodeFlag = Convert.toBool(runtimeService.getVariable(processInstance.getProcessInstanceId(), - PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class)); - if (userTaskElement.getId().equals(START_USER_NODE_ID) - && (skipStartUserNodeFlag == null // 目的:一般是“主æµç¨‹â€ï¼Œå‘起人节点,自动通过审核 - || Boolean.TRUE.equals(skipStartUserNodeFlag)) // ç›®çš„ï¼šä¸€èˆ¬æ˜¯â€œå­æµç¨‹â€ï¼Œå‘起人节点,按é…置自动通过审核 - && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) { - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason())); - return; - } - // 当ä¸ä¸ºå‘起人节点时,审批人与æäº¤äººä¸ºåŒä¸€äººæ—¶ï¼Œæ ¹æ® BpmUserTaskAssignStartUserHandlerTypeEnum ç­–ç•¥è¿›è¡Œå¤„ç† - if (ObjectUtil.notEqual(userTaskElement.getId(), START_USER_NODE_ID) - && StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) { - if (ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) { - Integer assignStartUserHandlerType = BpmnModelUtils.parseAssignStartUserHandlerType(userTaskElement); - - // 情况一:自动跳过 - if (ObjectUtils.equalsAny(assignStartUserHandlerType, - BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP.getType())) { - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP.getReason())); - return; - } - // 情况二:转交给部门负责人审批 - if (ObjectUtils.equalsAny(assignStartUserHandlerType, - BpmUserTaskAssignStartUserHandlerTypeEnum.TRANSFER_DEPT_LEADER.getType())) { - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())).getCheckedData(); - Assert.notNull(startUser, "æäº¤äºº({})ä¿¡æ¯ä¸ºç©º", processInstance.getStartUserId()); - Long deptId = startUser.getDeptIds().stream().findAny().orElse(null); - DeptRespDTO dept = deptId != null ? deptApi.getDept(deptId).getCheckedData() : null; - Assert.notNull(dept, "æäº¤äºº({})部门({})ä¿¡æ¯ä¸ºç©º", processInstance.getStartUserId(), deptId); - // 找ä¸åˆ°éƒ¨é—¨è´Ÿè´£äººçš„æƒ…况下,自动审批通过 - // noinspection DataFlowIssue - if (dept.getLeaderUserId() == null) { - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_DEPT_LEADER_NOT_FOUND.getReason())); - return; - } - // 找得到部门负责人的情况下,修改负责人 - if (ObjectUtil.notEqual(dept.getLeaderUserId(), startUser.getId())) { - getSelf().transferTask(Long.valueOf(task.getAssignee()), new BpmTaskTransferReqVO() - .setId(task.getId()).setAssigneeUserId(dept.getLeaderUserId()) - .setReason(BpmReasonEnum.ASSIGN_START_USER_TRANSFER_DEPT_LEADER.getReason())); - return; - } - // 如果部门负责人是自己,还是自己审批å§~ - } - } - } - // 注æ„:需è¦åŸºäºŽ instance 设置租户编å·ï¼Œé¿å… Flowable å†…éƒ¨å¼‚æ­¥æ—¶ï¼Œä¸¢å¤±ç§Ÿæˆ·ç¼–å· - FlowableUtils.execute(processInstance.getTenantId(), () -> { - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())).getCheckedData(); - messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); - }); - } - - }); - } - - @Override - public void processTaskCompleted(Task task) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (processInstance == null) { - log.error("[processTaskCompleted][taskId({}) 没有找到æµç¨‹å®žä¾‹]", task.getId()); - return; - } - BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService. - getProcessDefinitionInfo(processInstance.getProcessDefinitionId()); - if (processDefinitionInfo == null) { - log.error("[processTaskCompleted][processDefinitionId({}) 没有找到æµç¨‹å®šä¹‰]", processInstance.getProcessDefinitionId()); - return; - } - - // 任务åŽç½®é€šçŸ¥ - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())){ - BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskAfterTriggerSetting(); - BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, - setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType) { - ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); - if (processInstance == null) { - log.error("[processTaskTimeout][processInstanceId({}) 没有找到æµç¨‹å®žä¾‹]", processInstanceId); - return; - } - List taskList = getRunningTaskListByProcessInstanceId(processInstanceId, true, taskDefineKey); - // TODO 优化:未æ¥éœ€è¦è€ƒè™‘加签的情况 - if (CollUtil.isEmpty(taskList)) { - log.error("[processTaskTimeout][processInstanceId({}) 定义Key({}) 没有找到任务]", processInstanceId, taskDefineKey); - return; - } - - taskList.forEach(task -> FlowableUtils.execute(task.getTenantId(), () -> { - // 情况一:自动æé†’ - if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.REMINDER.getType())) { - messageService.sendMessageWhenTaskTimeout(new BpmMessageSendWhenTaskTimeoutReqDTO() - .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName()) - .setTaskId(task.getId()).setTaskName(task.getName()).setAssigneeUserId(Long.parseLong(task.getAssignee()))); - return; - } - - // æƒ…å†µäºŒï¼šè‡ªåŠ¨åŒæ„ - if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.APPROVE.getType())) { - approveTask(Long.parseLong(task.getAssignee()), - new BpmTaskApproveReqVO().setId(task.getId()).setReason(BpmReasonEnum.TIMEOUT_APPROVE.getReason())); - return; - } - - // æƒ…å†µä¸‰ï¼šè‡ªåŠ¨æ‹’ç» - if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.REJECT.getType())) { - rejectTask(Long.parseLong(task.getAssignee()), - new BpmTaskRejectReqVO().setId(task.getId()).setReason(BpmReasonEnum.REJECT_TASK.getReason())); - } - })); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void processChildProcessTimeout(String processInstanceId, String taskDefineKey) { - List activityInstances = runtimeService.createActivityInstanceQuery() - .processInstanceId(processInstanceId) - .activityId(taskDefineKey).list(); - activityInstances.forEach(activityInstance -> FlowableUtils.execute(activityInstance.getTenantId(), - () -> moveTaskToEnd(activityInstance.getCalledProcessInstanceId(), BpmReasonEnum.TIMEOUT_APPROVE.getReason()))); - } - - @Override - public void triggerTask(String processInstanceId, String taskDefineKey) { - Execution execution = runtimeService.createExecutionQuery() - .processInstanceId(processInstanceId) - .activityId(taskDefineKey) - .singleResult(); - if (execution == null) { - log.error("[triggerTask][processInstanceId({}) activityId({}) 没有找到执行活动]", processInstanceId, taskDefineKey); - return; - } - - // è‹¥å­˜åœ¨ç›´æŽ¥è§¦å‘æŽ¥æ”¶ä»»åŠ¡ï¼Œæ‰§è¡ŒåŽç»­èŠ‚ç‚¹ - FlowableUtils.execute(execution.getTenantId(), - () -> runtimeService.trigger(execution.getId())); - } - - /** - * 获得自身的代ç†å¯¹è±¡ï¼Œè§£å†³ AOP 生效问题 - * - * @return 自己 - */ - private BpmTaskServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmCallActivityListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmCallActivityListener.java deleted file mode 100644 index e458af4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmCallActivityListener.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.zt.plat.module.bpm.service.task.listener; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; -import com.zt.plat.module.bpm.enums.definition.BpmChildProcessStartUserEmptyTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmChildProcessStartUserTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.FlowableUtils; -import com.zt.plat.module.bpm.service.definition.BpmProcessDefinitionService; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.ExecutionListener; -import org.flowable.engine.impl.el.FixedValue; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * BPM å­æµç¨‹ç›‘å¬å™¨ï¼šè®¾ç½®æµç¨‹çš„å‘起人 - * - * @author Lesan - */ -@Component -@Slf4j -public class BpmCallActivityListener implements ExecutionListener { - - public static final String DELEGATE_EXPRESSION = "${bpmCallActivityListener}"; - - @Setter - private FixedValue listenerConfig; - - @Resource - private BpmProcessDefinitionService processDefinitionService; - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public void notify(DelegateExecution execution) { - String expressionText = listenerConfig.getExpressionText(); - Assert.notNull(expressionText, "监å¬å™¨æ‰©å±•字段({})ä¸èƒ½ä¸ºç©º", expressionText); - BpmSimpleModelNodeVO.ChildProcessSetting.StartUserSetting startUserSetting = JsonUtils.parseObject( - expressionText, BpmSimpleModelNodeVO.ChildProcessSetting.StartUserSetting.class); - ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getRootProcessInstanceId()); - - // 1. 当å‘èµ·äººæ¥æºä¸ºä¸»æµç¨‹å‘起人时,并兜底 startUserSetting 为空时 - if (startUserSetting == null - || startUserSetting.getType().equals(BpmChildProcessStartUserTypeEnum.MAIN_PROCESS_START_USER.getType())) { - FlowableUtils.setAuthenticatedUserId(Long.parseLong(processInstance.getStartUserId())); - return; - } - - // 2. 当å‘èµ·äººæ¥æºä¸ºè¡¨å•æ—¶ - if (startUserSetting.getType().equals(BpmChildProcessStartUserTypeEnum.FROM_FORM.getType())) { - String formFieldValue = MapUtil.getStr(processInstance.getProcessVariables(), startUserSetting.getFormField()); - // 2.1 当表å•值为空时 - if (StrUtil.isEmpty(formFieldValue)) { - // 2.1.1 æ¥è‡ªä¸»æµç¨‹å‘起人 - if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER.getType())) { - FlowableUtils.setAuthenticatedUserId(Long.parseLong(processInstance.getStartUserId())); - return; - } - // 2.1.2 æ¥è‡ªå­æµç¨‹ç®¡ç†å‘˜ - if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.CHILD_PROCESS_ADMIN.getType())) { - BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(execution.getProcessDefinitionId()); - List managerUserIds = processDefinition.getManagerUserIds(); - FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0)); - return; - } - // 2.1.3 æ¥è‡ªä¸»æµç¨‹ç®¡ç†å‘˜ - if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_ADMIN.getType())) { - BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId()); - List managerUserIds = processDefinition.getManagerUserIds(); - FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0)); - return; - } - } - // 2.2 使用表å•值,并兜底字符串转 Long 失败时使用主æµç¨‹å‘起人 - try { - FlowableUtils.setAuthenticatedUserId(Long.parseLong(formFieldValue)); - } catch (Exception e) { - log.error("[notify][监å¬å™¨ï¼š{}ï¼Œå­æµç¨‹ç›‘å¬å™¨è®¾ç½®æµç¨‹çš„å‘起人字符串转 Long 失败,字符串:{}]", - DELEGATE_EXPRESSION, formFieldValue); - FlowableUtils.setAuthenticatedUserId(Long.parseLong(processInstance.getStartUserId())); - } - } - } - -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmUserTaskListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmUserTaskListener.java deleted file mode 100644 index ec0f164..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/listener/BpmUserTaskListener.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.zt.plat.module.bpm.service.task.listener; - -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.enums.definition.BpmHttpRequestParamTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.TaskListener; -import org.flowable.engine.impl.el.FixedValue; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.service.delegate.DelegateTask; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import static com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseListenerConfig; - -// TODO @ZT:å¯èƒ½ä¼šæƒ³æ¢ä¸ªåŒ…åœ°å€ -/** - * BPM 用户任务通用监å¬å™¨ - * - * @author Lesan - */ -@Component -@Slf4j -@Scope("prototype") -public class BpmUserTaskListener implements TaskListener { - - public static final String DELEGATE_EXPRESSION = "${bpmUserTaskListener}"; - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Setter - private FixedValue listenerConfig; - - @Override - public void notify(DelegateTask delegateTask) { - // 1. èŽ·å–æ‰€éœ€åŸºç¡€ä¿¡æ¯ - ProcessInstance processInstance = processInstanceService.getProcessInstance(delegateTask.getProcessInstanceId()); - BpmSimpleModelNodeVO.ListenerHandler listenerHandler = parseListenerConfig(listenerConfig); - - // 2. å‘起请求 - // TODO @ZTï¼šå“ªäº›é»˜è®¤å‚æ•°ï¼ŒåŽç»­å†è°ƒç ”下;感觉å¯ä»¥æžä¸ª task 字段,把整个 delegateTask 放进去; - listenerHandler.getBody().add(new BpmSimpleModelNodeVO.HttpRequestParam().setKey("processInstanceId") - .setType(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType()).setValue(delegateTask.getProcessInstanceId())); - listenerHandler.getBody().add(new BpmSimpleModelNodeVO.HttpRequestParam().setKey("assignee") - .setType(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType()).setValue(delegateTask.getAssignee())); - listenerHandler.getBody().add(new BpmSimpleModelNodeVO.HttpRequestParam().setKey("taskDefinitionKey") - .setType(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType()).setValue(delegateTask.getTaskDefinitionKey())); - listenerHandler.getBody().add(new BpmSimpleModelNodeVO.HttpRequestParam().setKey("taskId") - .setType(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType()).setValue(delegateTask.getId())); - BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, - listenerHandler.getPath(), listenerHandler.getHeader(), listenerHandler.getBody(), false, null); - - // 3. 是å¦éœ€è¦åŽç»­æ“作?TODO ZTï¼šå¾…å®šï¼ - } -} \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/BpmTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/BpmTrigger.java deleted file mode 100644 index 8aee717..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/BpmTrigger.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger; - -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; - -// TODO @ZT:å¯èƒ½ä¼šæƒ³æ¢ä¸ªåŒ…åœ°å€ -/** - * BPM 触å‘å™¨æŽ¥å£ - *

- * 处ç†ä¸åŒçš„动作 - * - * @author jason - */ -public interface BpmTrigger { - - /** - * 对应触å‘器类型 - * - * @return 触å‘器类型 - */ - BpmTriggerTypeEnum getType(); - - /** - * 触å‘器执行 - * - * @param processInstanceId æµç¨‹å®žä¾‹ç¼–å· - * @param param 触å‘噍傿•° - */ - void execute(String processInstanceId, String param); - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java deleted file mode 100644 index 46ed559..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormDeleteTrigger.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger.form; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.SimpleModelUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.trigger.BpmTrigger; -import com.fasterxml.jackson.core.type.TypeReference; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * BPM 删除æµç¨‹è¡¨å•æ•°æ®è§¦å‘器 - * - * @author jason - */ -@Component -@Slf4j -public class BpmFormDeleteTrigger implements BpmTrigger { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTriggerTypeEnum getType() { - return BpmTriggerTypeEnum.FORM_DELETE; - } - - @Override - public void execute(String processInstanceId, String param) { - // 1. è§£æžåˆ é™¤æµç¨‹è¡¨å•æ•°æ®é…ç½® - List settings = JsonUtils.parseObject(param, new TypeReference<>() {}); - if (CollUtil.isEmpty(settings)) { - log.error("[execute][æµç¨‹({}) 删除æµç¨‹è¡¨å•æ•°æ®è§¦å‘器é…置为空]", processInstanceId); - return; - } - - // 2. èŽ·å–æµç¨‹å˜é‡ - Map processVariables = processInstanceService.getProcessInstance(processInstanceId).getProcessVariables(); - - // 3.1 获å–需è¦åˆ é™¤çš„表å•字段 - Set deleteFields = new HashSet<>(); - settings.forEach(setting -> { - if (CollUtil.isEmpty(setting.getDeleteFields())) { - return; - } - // é…置了æ¡ä»¶ï¼Œåˆ¤æ–­æ¡ä»¶æ˜¯å¦æ»¡è¶³ - boolean isFieldDeletedNeeded = true; - if (setting.getConditionType() != null) { - String conditionExpression = SimpleModelUtils.buildConditionExpression( - setting.getConditionType(), setting.getConditionExpression(), setting.getConditionGroups()); - isFieldDeletedNeeded = BpmnModelUtils.evalConditionExpress(processVariables, conditionExpression); - } - if (isFieldDeletedNeeded) { - deleteFields.addAll(setting.getDeleteFields()); - } - }); - - // 3.2 删除æµç¨‹å˜é‡ - if (CollUtil.isNotEmpty(deleteFields)) { - processInstanceService.removeProcessInstanceVariables(processInstanceId, deleteFields); - } - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java deleted file mode 100644 index c8427b2..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/form/BpmFormUpdateTrigger.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger.form; - -import cn.hutool.core.collection.CollUtil; -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.FormTriggerSetting; -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import com.zt.plat.module.bpm.framework.flowable.core.util.SimpleModelUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import com.zt.plat.module.bpm.service.task.trigger.BpmTrigger; -import com.fasterxml.jackson.core.type.TypeReference; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -/** - * BPM æ›´æ–°æµç¨‹è¡¨å•触å‘器 - * - * @author jason - */ -@Component -@Slf4j -public class BpmFormUpdateTrigger implements BpmTrigger { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTriggerTypeEnum getType() { - return BpmTriggerTypeEnum.FORM_UPDATE; - } - - @Override - public void execute(String processInstanceId, String param) { - // 1. è§£æžæ›´æ–°æµç¨‹è¡¨å•é…ç½® - List settings = JsonUtils.parseObject(param, new TypeReference<>() {}); - if (CollUtil.isEmpty(settings)) { - log.error("[execute][æµç¨‹({}) æ›´æ–°æµç¨‹è¡¨å•触å‘器é…置为空]", processInstanceId); - return; - } - - // 2. èŽ·å–æµç¨‹å˜é‡ - Map processVariables = processInstanceService.getProcessInstance(processInstanceId).getProcessVariables(); - - // 3. æ›´æ–°æµç¨‹å˜é‡ - for (FormTriggerSetting setting : settings) { - if (CollUtil.isEmpty(setting.getUpdateFormFields())) { - continue; - } - // é…置了æ¡ä»¶ï¼Œåˆ¤æ–­æ¡ä»¶æ˜¯å¦æ»¡è¶³ - boolean isFormUpdateNeeded = true; - if (setting.getConditionType() != null) { - String conditionExpression = SimpleModelUtils.buildConditionExpression( - setting.getConditionType(), setting.getConditionExpression(), setting.getConditionGroups()); - isFormUpdateNeeded = BpmnModelUtils.evalConditionExpress(processVariables, conditionExpression); - } - // æ›´æ–°æµç¨‹è¡¨å• - if (isFormUpdateNeeded) { - processInstanceService.updateProcessInstanceVariables(processInstanceId, setting.getUpdateFormFields()); - } - } - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmAbstractHttpRequestTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmAbstractHttpRequestTrigger.java deleted file mode 100644 index 676b260..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmAbstractHttpRequestTrigger.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger.http; - -import com.zt.plat.module.bpm.service.task.trigger.BpmTrigger; -import lombok.extern.slf4j.Slf4j; - -/** - * BPM å‘é€ HTTP 请求触å‘器抽象类 - * - * @author jason - */ -@Slf4j -public abstract class BpmAbstractHttpRequestTrigger implements BpmTrigger { - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmHttpCallbackTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmHttpCallbackTrigger.java deleted file mode 100644 index 3fe0606..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmHttpCallbackTrigger.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger.http; - -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import com.zt.plat.module.bpm.enums.definition.BpmHttpRequestParamTypeEnum; -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -/** - * BPM HTTP 回调触å‘器 - * - * @author jason - */ -@Component -@Slf4j -public class BpmHttpCallbackTrigger extends BpmAbstractHttpRequestTrigger { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTriggerTypeEnum getType() { - return BpmTriggerTypeEnum.HTTP_CALLBACK; - } - - @Override - public void execute(String processInstanceId, String param) { - // 1. è§£æž http 请求é…ç½® - BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting setting = JsonUtils.parseObject(param, - BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting.class); - if (setting == null) { - log.error("[execute][æµç¨‹({}) HTTP 回调触å‘器é…置为空]", processInstanceId); - return; - } - - // 2. å‘起请求 - ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); - setting.getBody().add(new BpmSimpleModelNodeVO.HttpRequestParam() - .setKey("taskDefineKey") // é‡è¦ï¼šå›žè°ƒè¯·æ±‚ taskDefineKey 需è¦ä¼ ç»™è¢«è°ƒç”¨æ–¹ï¼Œç”¨äºŽå›žè°ƒæ‰§è¡Œ - .setType(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType()).setValue(setting.getCallbackTaskDefineKey())); - BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, - setting.getUrl(), setting.getHeader(), setting.getBody(), false, null); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmSyncHttpRequestTrigger.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmSyncHttpRequestTrigger.java deleted file mode 100644 index 617bf7a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/trigger/http/BpmSyncHttpRequestTrigger.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zt.plat.module.bpm.service.task.trigger.http; - -import com.zt.plat.framework.common.util.json.JsonUtils; -import com.zt.plat.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting; -import com.zt.plat.module.bpm.enums.definition.BpmTriggerTypeEnum; -import com.zt.plat.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils; -import com.zt.plat.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -/** - * BPM å‘é€åŒæ­¥ HTTP 请求触å‘器 - * - * @author jason - */ -@Component -@Slf4j -public class BpmSyncHttpRequestTrigger extends BpmAbstractHttpRequestTrigger { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public BpmTriggerTypeEnum getType() { - return BpmTriggerTypeEnum.HTTP_REQUEST; - } - - @Override - public void execute(String processInstanceId, String param) { - // 1. è§£æž http 请求é…ç½® - HttpRequestTriggerSetting setting = JsonUtils.parseObject(param, HttpRequestTriggerSetting.class); - if (setting == null) { - log.error("[execute][æµç¨‹({}) HTTP 触å‘器请求é…置为空]", processInstanceId); - return; - } - - // 2. å‘起请求 - ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); - BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, - setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); - } - -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/database/core/DmDatabase.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/database/core/DmDatabase.java deleted file mode 100644 index 9e2c50f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/database/core/DmDatabase.java +++ /dev/null @@ -1,572 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package liquibase.database.core; - -import java.lang.reflect.Method; -import java.sql.CallableStatement; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import liquibase.CatalogAndSchema; -import liquibase.GlobalConfiguration; -import liquibase.Scope; -import liquibase.database.AbstractJdbcDatabase; -import liquibase.database.DatabaseConnection; -import liquibase.database.OfflineConnection; -import liquibase.database.jvm.JdbcConnection; -import liquibase.exception.DatabaseException; -import liquibase.exception.UnexpectedLiquibaseException; -import liquibase.exception.ValidationErrors; -import liquibase.executor.ExecutorService; -import liquibase.statement.DatabaseFunction; -import liquibase.statement.SequenceCurrentValueFunction; -import liquibase.statement.SequenceNextValueFunction; -import liquibase.statement.UniqueConstraint; -import liquibase.statement.core.RawCallStatement; -import liquibase.statement.core.RawParameterizedSqlStatement; -import liquibase.structure.DatabaseObject; -import liquibase.structure.core.Catalog; -import liquibase.structure.core.Column; -import liquibase.structure.core.Index; -import liquibase.structure.core.PrimaryKey; -import liquibase.structure.core.Schema; -import liquibase.util.JdbcUtil; -import liquibase.util.StringUtil; -import org.apache.commons.lang3.StringUtils; - -public class DmDatabase extends AbstractJdbcDatabase { - private static final String PROXY_USER_REGEX = ".*(?:thin|oci)\\:(.+)/@.*"; - public static final Pattern PROXY_USER_PATTERN = Pattern.compile(".*(?:thin|oci)\\:(.+)/@.*"); - private static final String VERSION_REGEX = "(\\d+)\\.(\\d+)\\..*"; - private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\..*"); - public static final String PRODUCT_NAME = "DM DBMS"; - private static final ResourceBundle coreBundle = ResourceBundle.getBundle("liquibase/i18n/liquibase-core"); - protected final int SHORT_IDENTIFIERS_LENGTH = 30; - protected final int LONG_IDENTIFIERS_LEGNTH = 128; - public static final int ORACLE_12C_MAJOR_VERSION = 12; - public static final int ORACLE_23C_MAJOR_VERSION = 23; - private final Set reservedWords = new HashSet(); - private Set userDefinedTypes; - private Map savedSessionNlsSettings; - private Boolean canAccessDbaRecycleBin; - private Integer databaseMajorVersion; - private Integer databaseMinorVersion; - - public DmDatabase() { - super.unquotedObjectsAreUppercased = true; - super.setCurrentDateTimeFunction("SYSTIMESTAMP"); - this.dateFunctions.add(new DatabaseFunction("SYSDATE")); - this.dateFunctions.add(new DatabaseFunction("SYSTIMESTAMP")); - this.dateFunctions.add(new DatabaseFunction("CURRENT_TIMESTAMP")); - super.sequenceNextValueFunction = "%s.nextval"; - super.sequenceCurrentValueFunction = "%s.currval"; - } - - public int getPriority() { - return 1; - } - - private void tryProxySession(String url, Connection con) { - Matcher m = PROXY_USER_PATTERN.matcher(url); - if (m.matches()) { - Properties props = new Properties(); - props.put("PROXY_USER_NAME", m.group(1)); - - try { - Method method = con.getClass().getMethod("openProxySession", Integer.TYPE, Properties.class); - method.setAccessible(true); - method.invoke(con, 1, props); - } catch (Exception e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Could not open proxy session on OracleDatabase: " + e.getCause().getMessage()); - return; - } - - try { - Method method = con.getClass().getMethod("isProxySession"); - method.setAccessible(true); - boolean b = (Boolean)method.invoke(con); - if (!b) { - Scope.getCurrentScope().getLog(this.getClass()).info("Proxy session not established on OracleDatabase: "); - } - } catch (Exception e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Could not open proxy session on OracleDatabase: " + e.getCause().getMessage()); - } - } - - } - - public void setConnection(DatabaseConnection conn) { - this.reservedWords.addAll(Arrays.asList("GROUP", "USER", "SESSION", "PASSWORD", "RESOURCE", "START", "SIZE", "UID", "DESC", "ORDER")); - Connection sqlConn = null; - boolean dmDatabase = false; - if (!(conn instanceof OfflineConnection)) { - try { - if (conn instanceof JdbcConnection) { - sqlConn = ((JdbcConnection)conn).getWrappedConnection(); - } - } catch (Exception e) { - throw new UnexpectedLiquibaseException(e); - } - - if (sqlConn != null) { - this.tryProxySession(conn.getURL(), sqlConn); - - try { - this.reservedWords.addAll(Arrays.asList(sqlConn.getMetaData().getSQLKeywords().toUpperCase().split(",\\s*"))); - } catch (SQLException e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Could get sql keywords on OracleDatabase: " + e.getMessage()); - } - - try { - Method method = sqlConn.getClass().getMethod("setRemarksReporting", Boolean.TYPE); - method.setAccessible(true); - method.invoke(sqlConn, true); - } catch (Exception e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Could not set remarks reporting on OracleDatabase: " + e.getMessage()); - } - - try { - DatabaseMetaData metaData = sqlConn.getMetaData(); - if (metaData != null) { - String productName = metaData.getDatabaseProductName(); - dmDatabase = productName != null && PRODUCT_NAME.equalsIgnoreCase(productName); - if (dmDatabase) { - this.databaseMajorVersion = metaData.getDatabaseMajorVersion(); - this.databaseMinorVersion = metaData.getDatabaseMinorVersion(); - } - } - } catch (SQLException e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Unable to inspect database metadata for DM version detection: " + e.getMessage()); - } - - if (!dmDatabase) { - CallableStatement statement = null; - - try { - statement = sqlConn.prepareCall("{call DBMS_UTILITY.DB_VERSION(?,?)}"); - statement.registerOutParameter(1, 12); - statement.registerOutParameter(2, 12); - statement.execute(); - String compatibleVersion = statement.getString(2); - if (compatibleVersion != null) { - Matcher majorVersionMatcher = VERSION_PATTERN.matcher(compatibleVersion); - if (majorVersionMatcher.matches()) { - this.databaseMajorVersion = Integer.valueOf(majorVersionMatcher.group(1)); - this.databaseMinorVersion = Integer.valueOf(majorVersionMatcher.group(2)); - } - } - } catch (SQLException e) { - String message = "Cannot read from DBMS_UTILITY.DB_VERSION: " + e.getMessage(); - Scope.getCurrentScope().getLog(this.getClass()).info("Could not set check compatibility mode on OracleDatabase, assuming not running in any sort of compatibility mode: " + message); - } finally { - JdbcUtil.closeStatement(statement); - } - } - - if (GlobalConfiguration.DDL_LOCK_TIMEOUT.getCurrentValue() != null) { - int timeoutValue = (Integer)GlobalConfiguration.DDL_LOCK_TIMEOUT.getCurrentValue(); - Scope.getCurrentScope().getLog(this.getClass()).fine("Setting DDL_LOCK_TIMEOUT value to " + timeoutValue); - String sql = "ALTER SESSION SET DDL_LOCK_TIMEOUT=" + timeoutValue; - PreparedStatement ddlLockTimeoutStatement = null; - - try { - ddlLockTimeoutStatement = sqlConn.prepareStatement(sql); - ddlLockTimeoutStatement.execute(); - } catch (SQLException sqle) { - Scope.getCurrentScope().getUI().sendErrorMessage("Unable to set the DDL_LOCK_TIMEOUT_VALUE: " + sqle.getMessage(), sqle); - Scope.getCurrentScope().getLog(this.getClass()).warning("Unable to set the DDL_LOCK_TIMEOUT_VALUE: " + sqle.getMessage(), sqle); - } finally { - JdbcUtil.closeStatement(ddlLockTimeoutStatement); - } - } - } - } - - super.setConnection(conn); - } - - public String getShortName() { - return "dm"; - } - - protected String getDefaultDatabaseProductName() { - return PRODUCT_NAME; - } - - public int getDatabaseMajorVersion() throws DatabaseException { - return this.databaseMajorVersion == null ? super.getDatabaseMajorVersion() : this.databaseMajorVersion; - } - - public int getDatabaseMinorVersion() throws DatabaseException { - return this.databaseMinorVersion == null ? super.getDatabaseMinorVersion() : this.databaseMinorVersion; - } - - public Integer getDefaultPort() { - return 5236; - } - - public String getJdbcCatalogName(CatalogAndSchema schema) { - return null; - } - - public String getJdbcSchemaName(CatalogAndSchema schema) { - return this.correctObjectName(schema.getCatalogName() == null ? schema.getSchemaName() : schema.getCatalogName(), Schema.class); - } - - protected String getAutoIncrementClause(String generationType, Boolean defaultOnNull) { - if (StringUtil.isEmpty(generationType)) { - return super.getAutoIncrementClause(); - } else { - String autoIncrementClause = "GENERATED %s AS IDENTITY"; - String generationStrategy = generationType; - if (Boolean.TRUE.equals(defaultOnNull) && generationType.toUpperCase().equals("BY DEFAULT")) { - generationStrategy = generationType + " ON NULL"; - } - - return String.format(autoIncrementClause, generationStrategy); - } - } - - public String generatePrimaryKeyName(String tableName) { - return tableName.length() > 27 ? "PK_" + tableName.toUpperCase(Locale.US).substring(0, 27) : "PK_" + tableName.toUpperCase(Locale.US); - } - - public boolean supportsInitiallyDeferrableColumns() { - return true; - } - - public boolean isReservedWord(String objectName) { - return this.reservedWords.contains(objectName.toUpperCase()); - } - - public boolean supportsSequences() { - return true; - } - - public boolean supports(Class object) { - return Schema.class.isAssignableFrom(object) ? false : super.supports(object); - } - - public boolean supportsSchemas() { - return false; - } - - protected String getConnectionCatalogName() throws DatabaseException { - if (this.getConnection() instanceof OfflineConnection) { - return this.getConnection().getCatalog(); - } else if (!(this.getConnection() instanceof JdbcConnection)) { - return this.defaultCatalogName; - } else { - try { - return (String)((ExecutorService)Scope.getCurrentScope().getSingleton(ExecutorService.class)).getExecutor("jdbc", this).queryForObject(new RawCallStatement("select sys_context( 'userenv', 'current_schema' ) from dual"), String.class); - } catch (Exception e) { - Scope.getCurrentScope().getLog(this.getClass()).info("Error getting default schema", e); - return null; - } - } - } - - public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { - String databaseProductName = conn == null ? null : conn.getDatabaseProductName(); - if (databaseProductName == null) { - return false; - } - if (PRODUCT_NAME.equalsIgnoreCase(databaseProductName)) { - return true; - } - // Flowable 历å²ä¸Šå°† DM 映射为 Oracle 元数æ®ï¼Œå› æ­¤è¿™é‡ŒåŒæ ·æŽ¥å— Oracle ä»¥ä¿æŒå…¼å®¹ - return "oracle".equalsIgnoreCase(databaseProductName); - } - - public String getDefaultDriver(String url) { - return url.startsWith("jdbc:dm") ? "dm.jdbc.driver.DmDriver" : null; - } - - public String getDefaultCatalogName() { - String defaultCatalogName = super.getDefaultCatalogName(); - if (Boolean.TRUE.equals(GlobalConfiguration.PRESERVE_SCHEMA_CASE.getCurrentValue())) { - return defaultCatalogName; - } else { - return defaultCatalogName == null ? null : defaultCatalogName.toUpperCase(Locale.US); - } - } - - public String getDateLiteral(String isoDate) { - String normalLiteral = super.getDateLiteral(isoDate); - if (this.isDateOnly(isoDate)) { - return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD')"; - } else if (this.isTimeOnly(isoDate)) { - return "TO_DATE(" + normalLiteral + ", 'HH24:MI:SS')"; - } else if (this.isTimestamp(isoDate)) { - return "TO_TIMESTAMP(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS.FF')"; - } else if (this.isDateTime(isoDate)) { - int seppos = normalLiteral.lastIndexOf(46); - if (seppos != -1) { - normalLiteral = normalLiteral.substring(0, seppos) + "'"; - } - - return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS')"; - } else { - return "UNSUPPORTED:" + isoDate; - } - } - - public boolean isSystemObject(DatabaseObject example) { - if (example == null) { - return false; - } else if (this.isLiquibaseObject(example)) { - return false; - } else { - if (example instanceof Schema) { - if ("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName())) { - return true; - } - - if ("SYSTEM".equals(example.getSchema().getCatalogName()) || "SYS".equals(example.getSchema().getCatalogName()) || "CTXSYS".equals(example.getSchema().getCatalogName()) || "XDB".equals(example.getSchema().getCatalogName())) { - return true; - } - } else if (this.isSystemObject(example.getSchema())) { - return true; - } - - if (example instanceof Catalog) { - if ("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName())) { - return true; - } - } else if (example.getName() != null) { - if (example.getName().startsWith("BIN$")) { - boolean filteredInOriginalQuery = this.canAccessDbaRecycleBin(); - if (!filteredInOriginalQuery) { - filteredInOriginalQuery = StringUtil.trimToEmpty(example.getSchema().getName()).equalsIgnoreCase(this.getConnection().getConnectionUserName()); - } - - if (!filteredInOriginalQuery) { - return true; - } - - return !(example instanceof PrimaryKey) && !(example instanceof Index) && !(example instanceof UniqueConstraint); - } - - if (example.getName().startsWith("AQ$")) { - return true; - } - - if (example.getName().startsWith("DR$")) { - return true; - } - - if (example.getName().startsWith("SYS_IOT_OVER")) { - return true; - } - - if ((example.getName().startsWith("MDRT_") || example.getName().startsWith("MDRS_")) && example.getName().endsWith("$")) { - return true; - } - - if (example.getName().startsWith("MLOG$_")) { - return true; - } - - if (example.getName().startsWith("RUPD$_")) { - return true; - } - - if (example.getName().startsWith("WM$_")) { - return true; - } - - if ("CREATE$JAVA$LOB$TABLE".equals(example.getName())) { - return true; - } - - if ("JAVA$CLASS$MD5$TABLE".equals(example.getName())) { - return true; - } - - if (example.getName().startsWith("ISEQ$$_")) { - return true; - } - - if (example.getName().startsWith("USLOG$")) { - return true; - } - - if (example.getName().startsWith("SYS_FBA")) { - return true; - } - } - - return super.isSystemObject(example); - } - } - - public boolean supportsTablespaces() { - return true; - } - - public boolean supportsAutoIncrement() { - boolean isAutoIncrementSupported = false; - - try { - if (this.getDatabaseMajorVersion() >= 12) { - isAutoIncrementSupported = true; - } - } catch (DatabaseException var3) { - isAutoIncrementSupported = false; - } - - return isAutoIncrementSupported; - } - - public boolean supportsRestrictForeignKeys() { - return false; - } - - public int getDataTypeMaxParameters(String dataTypeName) { - if ("BINARY_FLOAT".equals(dataTypeName.toUpperCase())) { - return 0; - } else { - return "BINARY_DOUBLE".equals(dataTypeName.toUpperCase()) ? 0 : super.getDataTypeMaxParameters(dataTypeName); - } - } - - public String getSystemTableWhereClause(String tableNameColumn) { - List clauses = new ArrayList(Arrays.asList("BIN$", "AQ$", "DR$", "SYS_IOT_OVER", "MLOG$_", "RUPD$_", "WM$_", "ISEQ$$_", "USLOG$", "SYS_FBA")); - clauses.replaceAll((s) -> tableNameColumn + " NOT LIKE '" + s + "%'"); - return "(" + StringUtil.join(clauses, " AND ") + ")"; - } - - public boolean jdbcCallsCatalogsSchemas() { - return true; - } - - public Set getUserDefinedTypes() { - if (this.userDefinedTypes == null) { - this.userDefinedTypes = new HashSet(); - if (this.getConnection() != null && !(this.getConnection() instanceof OfflineConnection)) { - try { - try { - this.userDefinedTypes.addAll(((ExecutorService)Scope.getCurrentScope().getSingleton(ExecutorService.class)).getExecutor("jdbc", this).queryForList(new RawParameterizedSqlStatement("SELECT DISTINCT TYPE_NAME FROM ALL_TYPES"), String.class)); - } catch (DatabaseException var2) { - this.userDefinedTypes.addAll(((ExecutorService)Scope.getCurrentScope().getSingleton(ExecutorService.class)).getExecutor("jdbc", this).queryForList(new RawParameterizedSqlStatement("SELECT TYPE_NAME FROM USER_TYPES"), String.class)); - } - } catch (DatabaseException var3) { - } - } - } - - return this.userDefinedTypes; - } - - public String generateDatabaseFunctionValue(DatabaseFunction databaseFunction) { - if (databaseFunction != null && "current_timestamp".equalsIgnoreCase(databaseFunction.toString())) { - return databaseFunction.toString(); - } else if (!(databaseFunction instanceof SequenceNextValueFunction) && !(databaseFunction instanceof SequenceCurrentValueFunction)) { - return super.generateDatabaseFunctionValue(databaseFunction); - } else { - String quotedSeq = super.generateDatabaseFunctionValue(databaseFunction); - return quotedSeq.replaceFirst("\"([^.\"]+)\\.([^.\"]+)\"", "\"$1\".\"$2\""); - } - } - - public ValidationErrors validate() { - ValidationErrors errors = super.validate(); - DatabaseConnection connection = this.getConnection(); - if (connection != null && !(connection instanceof OfflineConnection)) { - if (!this.canAccessDbaRecycleBin()) { - errors.addWarning(this.getDbaRecycleBinWarning()); - } - - return errors; - } else { - Scope.getCurrentScope().getLog(this.getClass()).info("Cannot validate offline database"); - return errors; - } - } - - public String getDbaRecycleBinWarning() { - return "Liquibase needs to access the DBA_RECYCLEBIN table so we can automatically handle the case where constraints are deleted and restored. Since Oracle doesn't properly restore the original table names referenced in the constraint, we use the information from the DBA_RECYCLEBIN to automatically correct this issue.\n\nThe user you used to connect to the database (" + this.getConnection().getConnectionUserName() + ") needs to have \"SELECT ON SYS.DBA_RECYCLEBIN\" permissions set before we can perform this operation. Please run the following SQL to set the appropriate permissions, and try running the command again.\n\n GRANT SELECT ON SYS.DBA_RECYCLEBIN TO " + this.getConnection().getConnectionUserName() + ";"; - } - - public boolean canAccessDbaRecycleBin() { - if (this.canAccessDbaRecycleBin == null) { - DatabaseConnection connection = this.getConnection(); - if (connection == null || connection instanceof OfflineConnection) { - return false; - } - - Statement statement = null; - - try { - statement = ((JdbcConnection)connection).createStatement(); - ResultSet resultSet = statement.executeQuery("select 1 from dba_recyclebin where 0=1"); - resultSet.close(); - this.canAccessDbaRecycleBin = true; - } catch (Exception var7) { - if (var7 instanceof SQLException && var7.getMessage().startsWith("ORA-00942")) { - this.canAccessDbaRecycleBin = false; - } else { - Scope.getCurrentScope().getLog(this.getClass()).warning("Cannot check dba_recyclebin access", var7); - this.canAccessDbaRecycleBin = false; - } - } finally { - JdbcUtil.close((ResultSet)null, statement); - } - } - - return this.canAccessDbaRecycleBin; - } - - public boolean supportsNotNullConstraintNames() { - return true; - } - - public boolean isValidOracleIdentifier(String identifier, Class type) { - if (identifier != null && identifier.length() >= 1) { - if (!identifier.matches("^(i?)[A-Z][A-Z0-9\\$\\_\\#]*$")) { - return false; - } else { - return identifier.length() <= 128; - } - } else { - return false; - } - } - - public int getIdentifierMaximumLength() { - try { - if (this.getDatabaseMajorVersion() < 12) { - return 30; - } else { - return this.getDatabaseMajorVersion() == 12 && this.getDatabaseMinorVersion() <= 1 ? 30 : 128; - } - } catch (DatabaseException ex) { - throw new UnexpectedLiquibaseException("Cannot determine the Oracle database version number", ex); - } - } - - public boolean supportsDatabaseChangeLogHistory() { - return true; - } - - public String correctObjectName(String objectName, Class objectType) { - return objectType.equals(Column.class) && StringUtils.startsWithIgnoreCase(objectName, "int") ? "NUMBER(*, 0)" : super.correctObjectName(objectName, objectType); - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java deleted file mode 100644 index b2c55f0..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java +++ /dev/null @@ -1,148 +0,0 @@ -package liquibase.datatype.core; - -import liquibase.change.core.LoadDataChange; -import liquibase.database.Database; -import liquibase.database.core.*; -import liquibase.datatype.DataTypeInfo; -import liquibase.datatype.DatabaseDataType; -import liquibase.datatype.LiquibaseDataType; -import liquibase.exception.UnexpectedLiquibaseException; -import liquibase.statement.DatabaseFunction; -import liquibase.util.StringUtil; - -import java.util.Locale; - -@DataTypeInfo(name = "boolean", aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"}, minParameters = 0, maxParameters = 0, priority = LiquibaseDataType.PRIORITY_DEFAULT) -public class BooleanType extends LiquibaseDataType { - - @Override - public DatabaseDataType toDatabaseDataType(Database database) { - String originalDefinition = StringUtil.trimToEmpty(getRawDefinition()); -// if ((database instanceof Firebird3Database)) { -// return new DatabaseDataType("BOOLEAN"); -// } - - if ((database instanceof AbstractDb2Database) || (database instanceof FirebirdDatabase)) { - return new DatabaseDataType("SMALLINT"); - } else if (database instanceof MSSQLDatabase) { - return new DatabaseDataType(database.escapeDataTypeName("bit")); - } else if (database instanceof MySQLDatabase) { - if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) { - return new DatabaseDataType("BIT", getParameters()); - } - return new DatabaseDataType("BIT", 1); - } else if (database instanceof OracleDatabase) { - return new DatabaseDataType("NUMBER", 1); - } else if ((database instanceof SybaseASADatabase) || (database instanceof SybaseDatabase)) { - return new DatabaseDataType("BIT"); - } else if (database instanceof DerbyDatabase) { - if (((DerbyDatabase) database).supportsBooleanDataType()) { - return new DatabaseDataType("BOOLEAN"); - } else { - return new DatabaseDataType("SMALLINT"); - } - } else if (database.getClass().isAssignableFrom(DB2Database.class)) { - if (((DB2Database) database).supportsBooleanDataType()) - return new DatabaseDataType("BOOLEAN"); - else - return new DatabaseDataType("SMALLINT"); - } else if (database instanceof HsqlDatabase) { - return new DatabaseDataType("BOOLEAN"); - } else if (database instanceof PostgresDatabase) { - if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) { - return new DatabaseDataType("BIT", getParameters()); - } - } else if(database instanceof DmDatabase) { - return new DatabaseDataType("bit"); - } - - return super.toDatabaseDataType(database); - } - - @Override - public String objectToSql(Object value, Database database) { - if ((value == null) || "null".equals(value.toString().toLowerCase(Locale.US))) { - return null; - } - - String returnValue; - if (value instanceof String) { - value = ((String) value).replaceAll("'", ""); - if ("true".equals(((String) value).toLowerCase(Locale.US)) || "1".equals(value) || "b'1'".equals(((String) value).toLowerCase(Locale.US)) || "t".equals(((String) value).toLowerCase(Locale.US)) || ((String) value).toLowerCase(Locale.US).equals(this.getTrueBooleanValue(database).toLowerCase(Locale.US))) { - returnValue = this.getTrueBooleanValue(database); - } else if ("false".equals(((String) value).toLowerCase(Locale.US)) || "0".equals(value) || "b'0'".equals( - ((String) value).toLowerCase(Locale.US)) || "f".equals(((String) value).toLowerCase(Locale.US)) || ((String) value).toLowerCase(Locale.US).equals(this.getFalseBooleanValue(database).toLowerCase(Locale.US))) { - returnValue = this.getFalseBooleanValue(database); - } else { - throw new UnexpectedLiquibaseException("Unknown boolean value: " + value); - } - } else if (value instanceof Long) { - if (Long.valueOf(1).equals(value)) { - returnValue = this.getTrueBooleanValue(database); - } else { - returnValue = this.getFalseBooleanValue(database); - } - } else if (value instanceof Number) { - if (value.equals(1) || "1".equals(value.toString()) || "1.0".equals(value.toString())) { - returnValue = this.getTrueBooleanValue(database); - } else { - returnValue = this.getFalseBooleanValue(database); - } - } else if (value instanceof DatabaseFunction) { - return value.toString(); - } else if (value instanceof Boolean) { - if (((Boolean) value)) { - returnValue = this.getTrueBooleanValue(database); - } else { - returnValue = this.getFalseBooleanValue(database); - } - } else { - throw new UnexpectedLiquibaseException("Cannot convert type " + value.getClass() + " to a boolean value"); - } - - return returnValue; - } - - protected boolean isNumericBoolean(Database database) { - if (database instanceof DerbyDatabase) { - return !((DerbyDatabase) database).supportsBooleanDataType(); - } else if (database.getClass().isAssignableFrom(DB2Database.class)) { - return !((DB2Database) database).supportsBooleanDataType(); - } - return (database instanceof Db2zDatabase) || (database instanceof DB2Database) || (database instanceof FirebirdDatabase) || (database instanceof - MSSQLDatabase) || (database instanceof MySQLDatabase) || (database instanceof OracleDatabase) || - (database instanceof SQLiteDatabase) || (database instanceof SybaseASADatabase) || (database instanceof - SybaseDatabase) || (database instanceof DmDatabase); - } - - /** - * The database-specific value to use for "false" "boolean" columns. - */ - public String getFalseBooleanValue(Database database) { - if (isNumericBoolean(database)) { - return "0"; - } - if (database instanceof InformixDatabase) { - return "'f'"; - } - return "FALSE"; - } - - /** - * The database-specific value to use for "true" "boolean" columns. - */ - public String getTrueBooleanValue(Database database) { - if (isNumericBoolean(database)) { - return "1"; - } - if (database instanceof InformixDatabase) { - return "'t'"; - } - return "TRUE"; - } - - @Override - public LoadDataChange.LOAD_DATA_TYPE getLoadTypeName() { - return LoadDataChange.LOAD_DATA_TYPE.BOOLEAN; - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java deleted file mode 100644 index 7f66250..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java +++ /dev/null @@ -1,32 +0,0 @@ -package liquibase.datatype.core; - -import liquibase.database.Database; -import liquibase.database.core.DmDatabase; -import liquibase.datatype.DataTypeInfo; -import liquibase.datatype.DatabaseDataType; - -@DataTypeInfo( - name = "boolean", - aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"}, - minParameters = 0, - maxParameters = 0, - priority = 2 -) -public class DmBooleanType extends BooleanType { - - @Override - public boolean supports(Database database) { - if (database instanceof DmDatabase) { - return true; - } - return super.supports(database); - } - - @Override - public DatabaseDataType toDatabaseDataType(Database database) { - if (database instanceof DmDatabase) { - return new DatabaseDataType("NUMBER", 1); - } - return super.toDatabaseDataType(database); - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java deleted file mode 100644 index 1e0a40e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java +++ /dev/null @@ -1,1957 +0,0 @@ -package liquibase.snapshot; - -import liquibase.CatalogAndSchema; -import liquibase.Scope; -import liquibase.database.AbstractJdbcDatabase; -import liquibase.database.Database; -import liquibase.database.DatabaseConnection; -import liquibase.database.LiquibaseTableNamesFactory; -import liquibase.database.core.*; -import liquibase.database.jvm.JdbcConnection; -import liquibase.exception.DatabaseException; -import liquibase.executor.jvm.ColumnMapRowMapper; -import liquibase.executor.jvm.RowMapperNotNullConstraintsResultSetExtractor; -import liquibase.structure.DatabaseObject; -import liquibase.structure.core.Catalog; -import liquibase.structure.core.Schema; -import liquibase.structure.core.Table; -import liquibase.structure.core.View; -import liquibase.util.JdbcUtil; -import liquibase.util.StringUtil; - -import java.sql.*; -import java.util.*; - -public class JdbcDatabaseSnapshot extends DatabaseSnapshot { - - private boolean warnedAboutDbaRecycleBin; - private static final boolean ignoreWarnAboutDbaRecycleBin = Boolean.getBoolean("liquibase.ignoreRecycleBinWarning"); - - private CachingDatabaseMetaData cachingDatabaseMetaData; - - private Map cachedExpressionMap = null; - - private Set userDefinedTypes; - - public JdbcDatabaseSnapshot(DatabaseObject[] examples, Database database, SnapshotControl snapshotControl) throws DatabaseException, InvalidExampleException { - super(examples, database, snapshotControl); - } - - public JdbcDatabaseSnapshot(DatabaseObject[] examples, Database database) throws DatabaseException, InvalidExampleException { - super(examples, database); - } - - public CachingDatabaseMetaData getMetaDataFromCache() throws SQLException { - if (cachingDatabaseMetaData == null) { - DatabaseMetaData databaseMetaData = null; - if (getDatabase().getConnection() != null) { - databaseMetaData = ((JdbcConnection) getDatabase().getConnection()).getUnderlyingConnection().getMetaData(); - } - - cachingDatabaseMetaData = new CachingDatabaseMetaData(this.getDatabase(), databaseMetaData); - } - return cachingDatabaseMetaData; - } - - public class CachingDatabaseMetaData { - private static final String SQL_FILTER_MATCH_ALL = "%"; - private final DatabaseMetaData databaseMetaData; - private final Database database; - - public CachingDatabaseMetaData(Database database, DatabaseMetaData metaData) { - this.databaseMetaData = metaData; - this.database = database; - } - - public java.sql.DatabaseMetaData getDatabaseMetaData() { - return databaseMetaData; - } - - public List getForeignKeys(final String catalogName, final String schemaName, final String tableName, - final String fkName) throws DatabaseException { - ForeignKeysResultSetCache foreignKeysResultSetCache = new ForeignKeysResultSetCache(database, catalogName, schemaName, tableName, fkName); - ResultSetCache importedKeys = getResultSetCache("getImportedKeys"); - importedKeys.setBulkTracking(!(database instanceof MSSQLDatabase)); - - return importedKeys.get(foreignKeysResultSetCache); - } - - public List getIndexInfo(final String catalogName, final String schemaName, final String tableName, final String indexName) throws DatabaseException, SQLException { - - return getResultSetCache("getIndexInfo").get(new ResultSetCache.UnionResultSetExtractor(database) { - - public boolean isBulkFetchMode; - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME"), row.getString("INDEX_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, indexName); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return getAllCatalogsStringScratchData() != null && database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEM"); - } - - @Override - public List fastFetch() throws SQLException, DatabaseException { - List returnList = new ArrayList<>(); - - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - if (database instanceof OracleDatabase) { - warnAboutDbaRecycleBin(); - - //oracle getIndexInfo is buggy and slow. See Issue 1824548 and http://forums.oracle.com/forums/thread.jspa?messageID=578383򍍏 - String sql = - "SELECT " + - "c.INDEX_NAME, " + - "3 AS TYPE, " + - "c.TABLE_OWNER AS TABLE_SCHEM, " + - "c.TABLE_NAME, " + - "c.COLUMN_NAME, " + - "c.COLUMN_POSITION AS ORDINAL_POSITION, " + - "NULL AS FILTER_CONDITION, " + - "c.INDEX_OWNER, " + - "CASE I.UNIQUENESS WHEN 'UNIQUE' THEN 0 ELSE 1 END AS NON_UNIQUE, " + - "CASE c.DESCEND WHEN 'Y' THEN 'D' WHEN 'DESC' THEN 'D' WHEN 'N' THEN 'A' WHEN 'ASC' THEN 'A' END AS ASC_OR_DESC, " + - "CASE WHEN tablespace_name = (SELECT default_tablespace FROM user_users) " + - "THEN NULL ELSE tablespace_name END AS tablespace_name " + - "FROM ALL_IND_COLUMNS c " + - "JOIN ALL_INDEXES i ON i.owner=c.index_owner AND i.index_name = c.index_name and i.table_owner = c.table_owner " + - "LEFT OUTER JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=c.table_name "; - if (!isBulkFetchMode || getAllCatalogsStringScratchData() == null) { - sql += "WHERE c.TABLE_OWNER = '" + database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class) + "' "; - } else { - sql += "WHERE c.TABLE_OWNER IN ('" + database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class) + "', " + getAllCatalogsStringScratchData() + ")"; - } - sql += "AND i.OWNER = c.TABLE_OWNER " + - "AND d.object_name IS NULL "; - - - if (!isBulkFetchMode && (tableName != null)) { - sql += " AND c.TABLE_NAME='" + tableName + "'"; - } - - if (!isBulkFetchMode && (indexName != null)) { - sql += " AND c.INDEX_NAME='" + indexName + "'"; - } - - sql += " ORDER BY c.INDEX_NAME, ORDINAL_POSITION"; - - returnList.addAll(setIndexExpressions(executeAndExtract(sql, database))); - } else if (database instanceof MSSQLDatabase) { - String tableCat = "original_db_name()"; - - if (9 <= database.getDatabaseMajorVersion()) { - tableCat = "db_name()"; - } - //fetch additional index info - String sql = "SELECT " + - tableCat + " as TABLE_CAT, " + - "object_schema_name(i.object_id) as TABLE_SCHEM, " + - "object_name(i.object_id) as TABLE_NAME, " + - "CASE is_unique WHEN 1 then 0 else 1 end as NON_UNIQUE, " + - "object_name(i.object_id) as INDEX_QUALIFIER, " + - "i.name as INDEX_NAME, " + - "case i.type when 1 then 1 ELSE 3 end as TYPE, " + - "key_ordinal as ORDINAL_POSITION, " + - "COL_NAME(c.object_id,c.column_id) AS COLUMN_NAME, " + - "case is_descending_key when 0 then 'A' else 'D' end as ASC_OR_DESC, " + - "null as CARDINALITY, " + - "null as PAGES, " + - "i.filter_definition as FILTER_CONDITION, " + - "o.type AS INTERNAL_OBJECT_TYPE, " + - "i.*, " + - "c.*, " + - "s.* " + - "FROM sys.indexes i " + - "join sys.index_columns c on i.object_id=c.object_id and i.index_id=c.index_id " + - "join sys.stats s on i.object_id=s.object_id and i.name=s.name " + - "join sys.objects o on i.object_id=o.object_id " + - "WHERE object_schema_name(i.object_id)='" + database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class) + "'"; - - if (!isBulkFetchMode && (tableName != null)) { - sql += " AND object_name(i.object_id)='" + database.escapeStringForDatabase(tableName) + "'"; - } - - if (!isBulkFetchMode && (indexName != null)) { - sql += " AND i.name='" + database.escapeStringForDatabase(indexName) + "'"; - } - - sql += "ORDER BY i.object_id, i.index_id, c.key_ordinal"; - - returnList.addAll(executeAndExtract(sql, database)); - - } else if (database instanceof Db2zDatabase) { - List parameters = new ArrayList<>(3); - String sql = "SELECT i.CREATOR AS TABLE_SCHEM, " + - "i.TBNAME AS TABLE_NAME, " + - "i.NAME AS INDEX_NAME, " + - "3 AS TYPE, " + - "k.COLNAME AS COLUMN_NAME, " + - "k.COLSEQ AS ORDINAL_POSITION, " + - "CASE UNIQUERULE WHEN 'D' then 1 else 0 end as NON_UNIQUE, " + - "k.ORDERING AS ORDER, " + - "i.CREATOR AS INDEX_QUALIFIER " + - "FROM SYSIBM.SYSKEYS k " + - "JOIN SYSIBM.SYSINDEXES i " + - "ON k.IXNAME = i.NAME " + - "AND k.IXCREATOR = i.CREATOR " + - "WHERE i.CREATOR = ?"; - parameters.add(database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class)); - if (!isBulkFetchMode && tableName != null) { - sql += " AND i.TBNAME = ?"; - parameters.add(database.escapeStringForDatabase(tableName)); - } - - if (!isBulkFetchMode && indexName != null) { - sql += " AND i.NAME = ?"; - parameters.add(database.escapeStringForDatabase(indexName)); - } - - sql += "ORDER BY i.NAME, k.COLSEQ"; - - returnList.addAll(executeAndExtract(database, sql, parameters.toArray())); - } else if (!(database instanceof MariaDBDatabase) && database instanceof MySQLDatabase) { - - //mysql 8.0.13 introduced support for indexes on `lower(first_name)` which comes back in an "expression" column - String filterConditionValue = "NULL"; - if (database.getDatabaseMajorVersion() > 8 || (database.getDatabaseMajorVersion() == 8 && ((MySQLDatabase) database).getDatabasePatchVersion() >= 13)) { - filterConditionValue = "EXPRESSION"; - } - - StringBuilder sql = new StringBuilder("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM,"); - sql.append(" TABLE_NAME, NON_UNIQUE, NULL AS INDEX_QUALIFIER, INDEX_NAME,"); - sql.append(DatabaseMetaData.tableIndexOther); - sql.append(" AS TYPE, SEQ_IN_INDEX AS ORDINAL_POSITION, COLUMN_NAME,"); - sql.append("COLLATION AS ASC_OR_DESC, CARDINALITY, 0 AS PAGES, " + filterConditionValue + " AS FILTER_CONDITION FROM INFORMATION_SCHEMA.STATISTICS WHERE"); - sql.append(" TABLE_SCHEMA = '").append(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)).append("'"); - - if (!isBulkFetchMode && tableName != null) { - sql.append(" AND TABLE_NAME = '").append(database.escapeStringForDatabase(tableName)).append("'"); - } - - if (!isBulkFetchMode && indexName != null) { - sql.append(" AND INDEX_NAME='").append(database.escapeStringForDatabase(indexName)).append("'"); - } - - sql.append("ORDER BY NON_UNIQUE, INDEX_NAME, SEQ_IN_INDEX"); - - returnList.addAll(executeAndExtract(sql.toString(), database)); - } else { - /* - * If we do not know in which table to look for the index, things get a little bit ugly. - * First, we get a collection of all tables within the catalogAndSchema, then iterate through - * them until we (hopefully) find the index we are looking for. - */ - List tables = new ArrayList<>(); - if (tableName == null) { - // Build a list of all candidate tables in the catalog/schema that might contain the index - for (CachedRow row : getTables(((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), null)) { - tables.add(row.getString("TABLE_NAME")); - } - } else { - tables.add(tableName); - } - - // Iterate through all the candidate tables and try to find the index. - for (String tableName1 : tables) { - ResultSet rs = databaseMetaData.getIndexInfo( - ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), - ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), - tableName1, - false, - true); - List rows = extract(rs, (database instanceof InformixDatabase)); - returnList.addAll(rows); - } - } - - return returnList; - } - - private List setIndexExpressions(List c) throws DatabaseException, SQLException { - Map expressionMap = getCachedExpressionMap(); - c.forEach(row -> { - row.set("FILTER_CONDITION", null); - String key = row.getString("INDEX_OWNER") + "::" + row.getString("INDEX_NAME") + "::" + - row.getInt("ORDINAL_POSITION"); - CachedRow fromMap = expressionMap.get(key); - if (fromMap != null) { - row.set("FILTER_CONDITION", fromMap.get("COLUMN_EXPRESSION")); - } - }); - return c; - } - - private Map getCachedExpressionMap() throws DatabaseException, SQLException { - if (cachedExpressionMap != null) { - return cachedExpressionMap; - } - String expSql = "SELECT e.column_expression, e.index_owner, e.index_name, e.column_position FROM all_ind_expressions e"; - List ec = executeAndExtract(expSql, database); - cachedExpressionMap = new HashMap<>(); - ec.forEach(row -> { - String key = row.getString("INDEX_OWNER") + "::" + row.getString("INDEX_NAME") + "::" + - row.getInt("COLUMN_POSITION"); - cachedExpressionMap.put(key, row); - }); - return cachedExpressionMap; - } - - @Override - public List bulkFetch() throws SQLException, DatabaseException { - this.isBulkFetchMode = true; - return fastFetch(); - } - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - if (database instanceof OracleDatabase || database instanceof MSSQLDatabase) { - return JdbcDatabaseSnapshot.this.getAllCatalogsStringScratchData() != null || (tableName == null && indexName == null) || super.shouldBulkSelect(schemaKey, resultSetCache); - } - return false; - } - }); - } - - - protected void warnAboutDbaRecycleBin() { - if (!ignoreWarnAboutDbaRecycleBin && !warnedAboutDbaRecycleBin && !(((OracleDatabase) database).canAccessDbaRecycleBin())) { - Scope.getCurrentScope().getLog(getClass()).warning(((OracleDatabase) database).getDbaRecycleBinWarning()); - warnedAboutDbaRecycleBin = true; - } - } - - /** - * Return the columns for the given catalog, schema, table, and column. - */ - public List getColumns(final String catalogName, final String schemaName, final String tableName, final String columnName) throws SQLException, DatabaseException { - - if ((database instanceof MSSQLDatabase) && (userDefinedTypes == null)) { - userDefinedTypes = new HashSet<>(); - DatabaseConnection databaseConnection = database.getConnection(); - if (databaseConnection instanceof JdbcConnection) { - Statement stmt = null; - ResultSet resultSet = null; - try { - stmt = ((JdbcConnection) databaseConnection).getUnderlyingConnection().createStatement(); - resultSet = stmt.executeQuery("select name from " + (catalogName == null ? "" : "[" + catalogName + "].") + "sys.types where is_user_defined=1"); - while (resultSet.next()) { - userDefinedTypes.add(resultSet.getString("name").toLowerCase()); - } - } finally { - JdbcUtil.close(resultSet, stmt); - } - } - } - GetColumnResultSetCache getColumnResultSetCache = new GetColumnResultSetCache(database, catalogName, - schemaName, tableName, columnName); - return getResultSetCache("getColumns").get(getColumnResultSetCache); - } - - /** - * Return the NotNullConstraints for the given catalog, schema, table, and column. - */ - public List getNotNullConst(final String catalogName, final String schemaName, - final String tableName) throws DatabaseException { - if (!(database instanceof OracleDatabase)) { - return Collections.emptyList(); - } - GetNotNullConstraintsResultSetCache getNotNullConstraintsResultSetCache = new GetNotNullConstraintsResultSetCache(database, catalogName, - schemaName, tableName); - return getResultSetCache("getNotNullConst").get(getNotNullConstraintsResultSetCache); - } - - private class GetColumnResultSetCache extends ResultSetCache.SingleResultSetExtractor { - final String catalogName; - final String schemaName; - final String tableName; - final String columnName; - - private GetColumnResultSetCache(Database database, String catalogName, String schemaName, String tableName, String columnName) { - super(database); - this.catalogName = catalogName; - this.schemaName = schemaName; - this.tableName = tableName; - this.columnName = columnName; - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME"), row.getString("COLUMN_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, columnName); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - String catalogs = getAllCatalogsStringScratchData(); - return catalogs != null && schemaKey != null - && catalogs.contains("'" + schemaKey.toUpperCase() + "'") - && database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEM"); - } - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - LiquibaseTableNamesFactory liquibaseTableNamesFactory = Scope.getCurrentScope().getSingleton(LiquibaseTableNamesFactory.class); - List liquibaseTableNames = liquibaseTableNamesFactory.getLiquibaseTableNames(database); - return liquibaseTableNames.stream().noneMatch(tableName::equalsIgnoreCase); - } - - @Override - public List fastFetchQuery() throws SQLException, DatabaseException { - if (database instanceof OracleDatabase) { - return oracleQuery(false); - } else if (database instanceof MSSQLDatabase) { - return mssqlQuery(false); - } - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - try { - List returnList = - extract( - databaseMetaData.getColumns( - ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), - escapeForLike(((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), database), - escapeForLike(tableName, database), - SQL_FILTER_MATCH_ALL) - ); - // - // IF MARIADB OR SQL ANYWHERE - // Query to get actual data types and then map each column to its CachedRow - // - determineActualDataTypes(returnList, tableName); - return returnList; - } catch (SQLException e) { - if (shouldReturnEmptyColumns(e)) { //view with table already dropped. Act like it has no columns. - return new ArrayList<>(); - } else { - throw e; - } - } - } - - @Override - public List bulkFetchQuery() throws SQLException, DatabaseException { - if (database instanceof OracleDatabase) { - return oracleQuery(true); - } else if (database instanceof MSSQLDatabase) { - return mssqlQuery(true); - } - - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - try { - List returnList = - extract(databaseMetaData.getColumns(((AbstractJdbcDatabase) database) - .getJdbcCatalogName(catalogAndSchema), - escapeForLike(((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), database), - SQL_FILTER_MATCH_ALL, SQL_FILTER_MATCH_ALL)); - // - // IF MARIADB OR SQL ANYWHERE - // Query to get actual data types and then map each column to its CachedRow - // - determineActualDataTypes(returnList, null); - return returnList; - } catch (SQLException e) { - if (shouldReturnEmptyColumns(e)) { - return new ArrayList<>(); - } else { - throw e; - } - } - } - - // - // For MariaDB, query for the data type column so that we can correctly - // set the DATETIME(6) type if specified - // - // For SQL Anywhere, query for the scale column so we can correctly - // set the size unit - // - private void determineActualDataTypes(List returnList, String tableName) throws SQLException { - // - // If not MariaDB / SQL Anywhere then just return - // - if (!(database instanceof MariaDBDatabase || database instanceof SybaseASADatabase)) { - return; - } - - if (database instanceof SybaseASADatabase) { - // - // Query for actual data type for column. The actual SYSTABCOL.scale column value is - // not reported by the DatabaseMetadata.getColumns() query for CHAR-limited (in contrast - // to BYTE-limited) columns, and it is needed to capture the kind if limitation. - // The actual SYSTABCOL.column_type is not reported by the DatabaseMetadata.getColumns() - // query as the IS_GENERATEDCOLUMN columns is missing in the result set, and it is needed to - // capture the kind of column (regular or computed). - // - // See https://help.sap.com/docs/SAP_SQL_Anywhere/93079d4ba8e44920ae63ffb4def91f5b/3beaa3956c5f1014883cb0c3e3559cc9.html. - // - String selectStatement = - "SELECT table_name, column_name, scale, column_type FROM SYSTABCOL KEY JOIN SYSTAB KEY JOIN SYSUSER " + - "WHERE user_name = ? AND ? IS NULL OR table_name = ?"; - Connection underlyingConnection = ((JdbcConnection) database.getConnection()).getUnderlyingConnection(); - try (PreparedStatement stmt = underlyingConnection.prepareStatement(selectStatement)) { - stmt.setString(1, schemaName); - stmt.setString(2, tableName); - stmt.setString(3, tableName); - try (ResultSet columnSelectRS = stmt.executeQuery()) { - while (columnSelectRS.next()) { - String selectedTableName = columnSelectRS.getString("table_name"); - String selectedColumnName = columnSelectRS.getString("column_name"); - int selectedScale = columnSelectRS.getInt("scale"); - String selectedColumnType = columnSelectRS.getString("column_type"); - for (CachedRow row : returnList) { - String rowTableName = row.getString("TABLE_NAME"); - String rowColumnName = row.getString("COLUMN_NAME"); - if (rowTableName.equalsIgnoreCase(selectedTableName) && - rowColumnName.equalsIgnoreCase(selectedColumnName)) { - int rowDataType = row.getInt("DATA_TYPE"); - if (rowDataType == Types.VARCHAR || rowDataType == Types.CHAR) { - row.set("scale", selectedScale); - } - row.set("IS_GENERATEDCOLUMN", "C".equals(selectedColumnType) ? "YES" : "NO"); - break; - } - } - } - } - } catch (SQLException sqle) { - throw new RuntimeException(sqle); - // - // Do not stop - // - } - return; - } - - // - // Query for actual data type for column. The actual DATA_TYPE column string is - // not returned by the DatabaseMetadata.getColumns() query, and it is needed - // to capture DATETIME() data types. - // - StringBuilder selectStatement = new StringBuilder( - "SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ?"); - if(tableName != null) { - selectStatement.append(" AND TABLE_NAME = ?"); - } - Connection underlyingConnection = ((JdbcConnection) database.getConnection()).getUnderlyingConnection(); - PreparedStatement statement = underlyingConnection.prepareStatement(selectStatement.toString()); - statement.setString(1, schemaName); - if (tableName != null) { - statement.setString(2, tableName); - } - try { - ResultSet columnSelectRS = statement.executeQuery(selectStatement.toString()); - // - // Iterate the result set from the query and match the rows - // to the rows that were returned by getColumns() in order - // to assign the actual DATA_TYPE string to the appropriate row. - // - while (columnSelectRS.next()) { - String selectedTableName = columnSelectRS.getString("TABLE_NAME"); - String selectedColumnName = columnSelectRS.getString("COLUMN_NAME"); - String actualDataType = columnSelectRS.getString("DATA_TYPE"); - for (CachedRow row : returnList) { - String rowTableName = row.getString("TABLE_NAME"); - String rowColumnName = row.getString("COLUMN_NAME"); - String rowTypeName = row.getString("TYPE_NAME"); - int rowDataType = row.getInt("DATA_TYPE"); - if (rowTableName.equalsIgnoreCase(selectedTableName) && - rowColumnName.equalsIgnoreCase(selectedColumnName) && - rowTypeName.equalsIgnoreCase("datetime") && - rowDataType == Types.OTHER && - !rowTypeName.equalsIgnoreCase(actualDataType)) { - row.set("TYPE_NAME", actualDataType); - row.set("DATA_TYPE", Types.TIMESTAMP); - break; - } - } - } - } catch (SQLException sqle) { - // - // Do not stop - // - } - finally { - JdbcUtil.closeStatement(statement); - } - } - - protected boolean shouldReturnEmptyColumns(SQLException e) { - return e.getMessage().contains("references invalid table"); //view with table already dropped. Act like it has no columns. - } - - protected List oracleQuery(boolean bulk) throws DatabaseException, SQLException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - boolean collectIdentityData = database.getDatabaseMajorVersion() >= OracleDatabase.ORACLE_12C_MAJOR_VERSION; - - String sql = "select NULL AS TABLE_CAT, OWNER AS TABLE_SCHEM, 'NO' as IS_AUTOINCREMENT, cc.COMMENTS AS REMARKS," + - "OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE AS DATA_TYPE_NAME, DATA_TYPE_MOD, DATA_TYPE_OWNER, " + - // note: oracle reports DATA_LENGTH=4*CHAR_LENGTH when using VARCHAR( CHAR ), thus BYTEs - "DECODE (c.data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3, 'LONG', -1, 'DATE', " + "93" + ", 'RAW', -3, 'LONG RAW', -4, 'BLOB', 2004, 'CLOB', 2005, 'BFILE', -13, 'FLOAT', 6, 'TIMESTAMP(6)', 93, 'TIMESTAMP(6) WITH TIME ZONE', -101, 'TIMESTAMP(6) WITH LOCAL TIME ZONE', -102, 'INTERVAL YEAR(2) TO MONTH', -103, 'INTERVAL DAY(2) TO SECOND(6)', -104, 'BINARY_FLOAT', 100, 'BINARY_DOUBLE', 101, 'XMLTYPE', 2009, 1111) AS data_type, " + - "DECODE( CHAR_USED, 'C',CHAR_LENGTH, DATA_LENGTH ) as DATA_LENGTH, " + - "DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID as ORDINAL_POSITION, DEFAULT_LENGTH, " + - "DATA_DEFAULT, " + - "NUM_BUCKETS, CHARACTER_SET_NAME, " + - "CHAR_COL_DECL_LENGTH, CHAR_LENGTH, " + - "CHAR_USED, VIRTUAL_COLUMN "; - if (collectIdentityData) { - sql += ", DEFAULT_ON_NULL, IDENTITY_COLUMN, ic.GENERATION_TYPE "; - } - sql += "FROM ALL_TAB_COLS c " + - "JOIN ALL_COL_COMMENTS cc USING ( OWNER, TABLE_NAME, COLUMN_NAME ) "; - if (collectIdentityData) { - sql += "LEFT JOIN ALL_TAB_IDENTITY_COLS ic USING (OWNER, TABLE_NAME, COLUMN_NAME ) "; - } - if (!bulk || getAllCatalogsStringScratchData() == null) { - sql += "WHERE OWNER='" + jdbcSchemaName + "' AND hidden_column='NO'"; - } else { - sql += "WHERE OWNER IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") AND hidden_column='NO'"; - } - - if (!bulk) { - if (tableName != null) { - sql += " AND TABLE_NAME='" + database.escapeStringForDatabase(tableName) + "'"; - } - if (columnName != null) { - sql += " AND COLUMN_NAME='" + database.escapeStringForDatabase(columnName) + "'"; - } - } - sql += " AND " + ((OracleDatabase) database).getSystemTableWhereClause("TABLE_NAME"); - sql += " ORDER BY OWNER, TABLE_NAME, c.COLUMN_ID"; - - return this.executeAndExtract(sql, database); - } - - - protected List mssqlQuery(boolean bulk) throws DatabaseException, SQLException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); - String dbIdParam; - String databasePrefix; - if (databaseName == null) { - databasePrefix = ""; - dbIdParam = ""; - } else { - dbIdParam = ", db_id('" + databaseName + "')"; - databasePrefix = "[" + databaseName + "]."; - } - - String sql = "select " + - "db_name(" + (databaseName == null ? "" : "db_id('" + databaseName + "')") + ") AS TABLE_CAT, " + - "object_schema_name(c.object_id" + dbIdParam + ") AS TABLE_SCHEM, " + - "object_name(c.object_id" + dbIdParam + ") AS TABLE_NAME, " + - "c.name AS COLUMN_NAME, " + - "is_filestream AS IS_FILESTREAM, " + - "is_rowguidcol AS IS_ROWGUIDCOL, " + - "CASE WHEN c.is_identity = 'true' THEN 'YES' ELSE 'NO' END as IS_AUTOINCREMENT, " + - "{REMARKS_COLUMN_PLACEHOLDER}" + - "t.name AS TYPE_NAME, " + - "dc.name as COLUMN_DEF_NAME, " + - "dc.definition as COLUMN_DEF, " + - // data type mapping from https://msdn.microsoft.com/en-us/library/ms378878(v=sql.110).aspx - "CASE t.name " + - "WHEN 'bigint' THEN " + java.sql.Types.BIGINT + " " + - "WHEN 'binary' THEN " + java.sql.Types.BINARY + " " + - "WHEN 'bit' THEN " + java.sql.Types.BIT + " " + - "WHEN 'char' THEN " + java.sql.Types.CHAR + " " + - "WHEN 'date' THEN " + java.sql.Types.DATE + " " + - "WHEN 'datetime' THEN " + java.sql.Types.TIMESTAMP + " " + - "WHEN 'datetime2' THEN " + java.sql.Types.TIMESTAMP + " " + - "WHEN 'datetimeoffset' THEN -155 " + - "WHEN 'decimal' THEN " + java.sql.Types.DECIMAL + " " + - "WHEN 'float' THEN " + java.sql.Types.DOUBLE + " " + - "WHEN 'image' THEN " + java.sql.Types.LONGVARBINARY + " " + - "WHEN 'int' THEN " + java.sql.Types.INTEGER + " " + - "WHEN 'money' THEN " + java.sql.Types.DECIMAL + " " + - "WHEN 'nchar' THEN " + java.sql.Types.NCHAR + " " + - "WHEN 'ntext' THEN " + java.sql.Types.LONGNVARCHAR + " " + - "WHEN 'numeric' THEN " + java.sql.Types.NUMERIC + " " + - "WHEN 'nvarchar' THEN " + java.sql.Types.NVARCHAR + " " + - "WHEN 'real' THEN " + Types.REAL + " " + - "WHEN 'smalldatetime' THEN " + java.sql.Types.TIMESTAMP + " " + - "WHEN 'smallint' THEN " + java.sql.Types.SMALLINT + " " + - "WHEN 'smallmoney' THEN " + java.sql.Types.DECIMAL + " " + - "WHEN 'text' THEN " + java.sql.Types.LONGVARCHAR + " " + - "WHEN 'time' THEN " + java.sql.Types.TIME + " " + - "WHEN 'timestamp' THEN " + java.sql.Types.BINARY + " " + - "WHEN 'tinyint' THEN " + java.sql.Types.TINYINT + " " + - "WHEN 'udt' THEN " + java.sql.Types.VARBINARY + " " + - "WHEN 'uniqueidentifier' THEN " + java.sql.Types.CHAR + " " + - "WHEN 'varbinary' THEN " + java.sql.Types.VARBINARY + " " + - "WHEN 'varbinary(max)' THEN " + java.sql.Types.VARBINARY + " " + - "WHEN 'varchar' THEN " + java.sql.Types.VARCHAR + " " + - "WHEN 'varchar(max)' THEN " + java.sql.Types.VARCHAR + " " + - "WHEN 'xml' THEN " + java.sql.Types.LONGVARCHAR + " " + - "WHEN 'LONGNVARCHAR' THEN " + java.sql.Types.SQLXML + " " + - "ELSE " + Types.OTHER + " END AS DATA_TYPE, " + - "CASE WHEN c.is_nullable = 'true' THEN 1 ELSE 0 END AS NULLABLE, " + - "10 as NUM_PREC_RADIX, " + - "c.column_id as ORDINAL_POSITION, " + - "c.scale as DECIMAL_DIGITS, " + - "c.max_length as COLUMN_SIZE, " + - "c.precision as DATA_PRECISION, " + - "c.is_computed as IS_COMPUTED " + - "FROM " + databasePrefix + "sys.columns c " + - "inner join " + databasePrefix + "sys.types t on c.user_type_id=t.user_type_id " + - "{REMARKS_JOIN_PLACEHOLDER}" + - "left outer join " + databasePrefix + "sys.default_constraints dc on dc.parent_column_id = c.column_id AND dc.parent_object_id=c.object_id AND type_desc='DEFAULT_CONSTRAINT' " + - "WHERE object_schema_name(c.object_id" + dbIdParam + ")='" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "'"; - - - if (!bulk) { - if (tableName != null) { - sql += " and object_name(c.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(tableName) + "'"; - } - if (columnName != null) { - sql += " and c.name='" + database.escapeStringForDatabase(columnName) + "'"; - } - } - sql += "order by object_schema_name(c.object_id" + dbIdParam + "), object_name(c.object_id" + dbIdParam + "), c.column_id"; - - - // sys.extended_properties is added to Azure on V12: https://feedback.azure.com/forums/217321-sql-database/suggestions/6549815-add-sys-extended-properties-for-meta-data-support - if ((!((MSSQLDatabase) database).isAzureDb()) // Either NOT AzureDB (=SQL Server 2008 or higher) - || (database.getDatabaseMajorVersion() >= 12)) { // or at least AzureDB v12 - // SQL Server 2005 or later - // https://technet.microsoft.com/en-us/library/ms177541.aspx - sql = sql.replace("{REMARKS_COLUMN_PLACEHOLDER}", "CAST([ep].[value] AS [nvarchar](MAX)) AS [REMARKS], "); - sql = sql.replace("{REMARKS_JOIN_PLACEHOLDER}", "left outer join " + databasePrefix + "[sys].[extended_properties] AS [ep] ON [ep].[class] = 1 " + - "AND [ep].[major_id] = c.object_id " + - "AND [ep].[minor_id] = column_id " + - "AND [ep].[name] = 'MS_Description' "); - } else { - sql = sql.replace("{REMARKS_COLUMN_PLACEHOLDER}", ""); - sql = sql.replace("{REMARKS_JOIN_PLACEHOLDER}", ""); - } - - List rows = this.executeAndExtract(sql, database); - - for (CachedRow row : rows) { - String typeName = row.getString("TYPE_NAME"); - if ("nvarchar".equals(typeName) || "nchar".equals(typeName)) { - Integer size = row.getInt("COLUMN_SIZE"); - if (size > 0) { - row.set("COLUMN_SIZE", size / 2); - } - } else if ((row.getInt("DATA_PRECISION") != null) && (row.getInt("DATA_PRECISION") > 0)) { - row.set("COLUMN_SIZE", row.getInt("DATA_PRECISION")); - } - } - - return rows; - } - - @Override - protected List extract(ResultSet resultSet, boolean informixIndexTrimHint) throws SQLException { - List rows = super.extract(resultSet, informixIndexTrimHint); - if ((database instanceof MSSQLDatabase) && !userDefinedTypes.isEmpty()) { //UDT types in MSSQL don't take parameters - for (CachedRow row : rows) { - String dataType = (String) row.get("TYPE_NAME"); - if (userDefinedTypes.contains(dataType.toLowerCase())) { - row.set("COLUMN_SIZE", null); - row.set("DECIMAL_DIGITS ", null); - } - } - } - return rows; - } - } - - private class ForeignKeysResultSetCache extends ResultSetCache.UnionResultSetExtractor { - final String catalogName; - final String schemaName; - final String tableName; - final String fkName; - - private ForeignKeysResultSetCache(Database database, String catalogName, String schemaName, String tableName, String fkName) { - super(database); - this.catalogName = catalogName; - this.schemaName = schemaName; - this.tableName = tableName; - this.fkName = fkName; - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("FKTABLE_CAT"), row.getString("FKTABLE_SCHEM"), database, row.getString("FKTABLE_NAME"), row.getString("FK_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, fkName); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("FKTABLE_SCHEM"); - } - - @Override - public List fastFetch() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - String jdbcCatalogName = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - - if (database instanceof DB2Database) { - if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { - return executeAndExtract(getDB2ForAs400Sql(jdbcSchemaName, tableName), database); - } - return querytDB2Luw(jdbcSchemaName, tableName); - } else if (database instanceof Db2zDatabase) { - return queryDb2Zos(catalogAndSchema, tableName); - } else { - List tables = new ArrayList<>(); - if (tableName == null) { - for (CachedRow row : getTables(jdbcCatalogName, jdbcSchemaName, null)) { - tables.add(row.getString("TABLE_NAME")); - } - } else { - tables.add(tableName); - } - - List returnList = new ArrayList<>(); - for (String foundTable : tables) { - if (database instanceof OracleDatabase) { - throw new RuntimeException("Should have bulk selected"); - } else { - returnList.addAll(extract(databaseMetaData.getImportedKeys(jdbcCatalogName, jdbcSchemaName, foundTable))); - } - } - - return returnList; - } - } - - @Override - public List bulkFetch() throws SQLException, DatabaseException { - if (database instanceof OracleDatabase) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - String sql = getOracleSql(jdbcSchemaName); - return executeAndExtract(sql, database); - } else if (database instanceof DB2Database) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { - return executeAndExtract(getDB2ForAs400Sql(jdbcSchemaName, null), database); - } - return querytDB2Luw(jdbcSchemaName, null); - } else if (database instanceof Db2zDatabase) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - return queryDb2Zos(catalogAndSchema, null); - } else if (database instanceof MSSQLDatabase) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - String sql = getMSSQLSql(jdbcSchemaName, tableName); - return executeAndExtract(sql, database); - } else { - throw new RuntimeException("Cannot bulk select"); - } - } - - protected String getOracleSql(String jdbcSchemaName) { - String sql = "SELECT /*+rule*/" + - " NULL AS pktable_cat, " + - " p.owner as pktable_schem, " + - " p.table_name as pktable_name, " + - " pc.column_name as pkcolumn_name, " + - " NULL as fktable_cat, " + - " f.owner as fktable_schem, " + - " f.table_name as fktable_name, " + - " fc.column_name as fkcolumn_name, " + - " fc.position as key_seq, " + - " NULL as update_rule, " + - " decode (f.delete_rule, 'CASCADE', 0, 'SET NULL', 2, 1) as delete_rule, " + - " f.constraint_name as fk_name, " + - " p.constraint_name as pk_name, " + - " decode(f.deferrable, 'DEFERRABLE', 5, 'NOT DEFERRABLE', 7, 'DEFERRED', 6) deferrability, " + - " f.validated as fk_validate " + - "FROM " + - "all_cons_columns pc " + - "INNER JOIN all_constraints p " + - "ON pc.owner = p.owner " + - "AND pc.constraint_name = p.constraint_name " + - "INNER JOIN all_constraints f " + - "ON pc.owner = f.r_owner " + - "AND pc.constraint_name = f.r_constraint_name " + - "INNER JOIN all_cons_columns fc " + - "ON fc.owner = f.owner " + - "AND fc.constraint_name = f.constraint_name " + - "AND fc.position = pc.position "; - if (getAllCatalogsStringScratchData() == null) { - sql += "WHERE f.owner = '" + jdbcSchemaName + "' "; - } else { - sql += "WHERE f.owner IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") "; - } - sql += "AND p.constraint_type in ('P', 'U') " + - "AND f.constraint_type = 'R' " + - "AND p.table_name NOT LIKE 'BIN$%' " + - "ORDER BY fktable_schem, fktable_name, key_seq"; - return sql; - } - - protected String getMSSQLSql(String jdbcSchemaName, String tableName) { - //comes from select object_definition(object_id('sp_fkeys')) - return "select " + - "convert(sysname,db_name()) AS PKTABLE_CAT, " + - "convert(sysname,schema_name(o1.schema_id)) AS PKTABLE_SCHEM, " + - "convert(sysname,o1.name) AS PKTABLE_NAME, " + - "convert(sysname,c1.name) AS PKCOLUMN_NAME, " + - "convert(sysname,db_name()) AS FKTABLE_CAT, " + - "convert(sysname,schema_name(o2.schema_id)) AS FKTABLE_SCHEM, " + - "convert(sysname,o2.name) AS FKTABLE_NAME, " + - "convert(sysname,c2.name) AS FKCOLUMN_NAME, " + - "isnull(convert(smallint,k.constraint_column_id), convert(smallint,0)) AS KEY_SEQ, " + - "convert(smallint, case ObjectProperty(f.object_id, 'CnstIsUpdateCascade') when 1 then 0 else 1 end) AS UPDATE_RULE, " + - "convert(smallint, case ObjectProperty(f.object_id, 'CnstIsDeleteCascade') when 1 then 0 else 1 end) AS DELETE_RULE, " + - "convert(sysname,object_name(f.object_id)) AS FK_NAME, " + - "convert(sysname,i.name) AS PK_NAME, " + - "convert(smallint, 7) AS DEFERRABILITY " + - "from " + - "sys.objects o1, " + - "sys.objects o2, " + - "sys.columns c1, " + - "sys.columns c2, " + - "sys.foreign_keys f inner join " + - "sys.foreign_key_columns k on (k.constraint_object_id = f.object_id) inner join " + - "sys.indexes i on (f.referenced_object_id = i.object_id and f.key_index_id = i.index_id) " + - "where " + - "o1.object_id = f.referenced_object_id and " + - "o2.object_id = f.parent_object_id and " + - "c1.object_id = f.referenced_object_id and " + - "c2.object_id = f.parent_object_id and " + - "c1.column_id = k.referenced_column_id and " + - "c2.column_id = k.parent_column_id and " + - "((object_schema_name(o1.object_id)='" + jdbcSchemaName + "'" + - " and convert(sysname,schema_name(o2.schema_id))='" + jdbcSchemaName + "' and " + - "convert(sysname,o2.name)='" + tableName + "' ) or ( convert(sysname,schema_name" + - "(o2.schema_id))='" + jdbcSchemaName + "' and convert(sysname,o2.name)='" + tableName + - "' )) order by 5, 6, 7, 9, 8"; - } - - private List querytDB2Luw(String jdbcSchemaName, String tableName) throws DatabaseException, SQLException { - List parameters = new ArrayList<>(2); - StringBuilder sql = new StringBuilder ("SELECT " + - " pk_col.tabschema AS pktable_cat, " + - " pk_col.tabname as pktable_name, " + - " pk_col.colname as pkcolumn_name, " + - " fk_col.tabschema as fktable_cat, " + - " fk_col.tabname as fktable_name, " + - " fk_col.colname as fkcolumn_name, " + - " fk_col.colseq as key_seq, " + - " decode (ref.updaterule, 'A', 3, 'R', 1, 1) as update_rule, " + - " decode (ref.deleterule, 'A', 3, 'C', 0, 'N', 2, 'R', 1, 1) as delete_rule, " + - " ref.constname as fk_name, " + - " ref.refkeyname as pk_name, " + - " 7 as deferrability " + - "FROM " + - "syscat.references ref " + - "join syscat.keycoluse fk_col on ref.constname=fk_col.constname and ref.tabschema=fk_col.tabschema and ref.tabname=fk_col.tabname " + - "join syscat.keycoluse pk_col on ref.refkeyname=pk_col.constname and ref.reftabschema=pk_col.tabschema and ref.reftabname=pk_col.tabname and pk_col.colseq=fk_col.colseq " + - "WHERE ref.tabschema = ? "); - parameters.add(jdbcSchemaName); - if (tableName != null) { - sql.append("and fk_col.tabname = ? "); - parameters.add(tableName); - } - sql.append("ORDER BY fk_col.colseq"); - return executeAndExtract(database, sql.toString(), parameters.toArray()); - } - - private String getDB2ForAs400Sql(String jdbcSchemaName, String tableName) { - return "SELECT " + - "pktable_cat, " + - "pktable_name, " + - "pkcolumn_name, " + - "fktable_cat, " + - "fktable_name, " + - "fkcolumn_name, " + - "key_seq, " + - "update_rule, " + - "delete_rule, " + - "fk_name, " + - "pk_name, " + - "deferrability " + - "FROM " + - "sysibm.SQLFORKEYS " + - "WHERE " + - "FKTABLE_SCHEM = '" + jdbcSchemaName + "' " + - "AND FKTABLE_NAME = '" + tableName + "'"; - } - - protected List queryDb2Zos(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { - - List parameters = new ArrayList<>(2); - StringBuilder sql = new StringBuilder("SELECT " + - " ref.REFTBCREATOR AS pktable_cat, " + - " ref.REFTBNAME as pktable_name, " + - " pk_col.colname as pkcolumn_name, " + - " ref.CREATOR as fktable_cat, " + - " ref.TBNAME as fktable_name, " + - " fk_col.colname as fkcolumn_name, " + - " fk_col.colseq as key_seq, " + - " decode (ref.deleterule, 'A', 3, 'C', 0, 'N', 2, 'R', 1, 1) as delete_rule, " + - " ref.relname as fk_name, " + - " pk_col.colname as pk_name, " + - " 7 as deferrability " + - "FROM " + - "SYSIBM.SYSRELS ref " + - "join SYSIBM.SYSFOREIGNKEYS fk_col " + - "on ref.relname = fk_col.RELNAME " + - "and ref.CREATOR = fk_col.CREATOR " + - "and ref.TBNAME = fk_col.TBNAME " + - "join SYSIBM.SYSKEYCOLUSE pk_col " + - "on ref.REFTBCREATOR = pk_col.TBCREATOR " + - "and ref.REFTBNAME = pk_col.TBNAME " + - "and pk_col.colseq=fk_col.colseq " + - "WHERE ref.CREATOR = ? "); - parameters.add(((AbstractJdbcDatabase) CachingDatabaseMetaData.this.database).getJdbcSchemaName(catalogAndSchema)); - if (tableName != null) { - sql.append("AND ref.TBNAME = ? "); - parameters.add(tableName); - } - sql.append("ORDER BY fk_col.colseq"); - - return executeAndExtract(CachingDatabaseMetaData.this.database, sql.toString(), parameters.toArray()); - } - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - if (database instanceof AbstractDb2Database || database instanceof MSSQLDatabase) { - return super.shouldBulkSelect(schemaKey, resultSetCache); //can bulk and fast fetch - } else { - return database instanceof OracleDatabase; //oracle is slow, always bulk select while you are at it. Other databases need to go through all tables. - } - } - } - - private class GetNotNullConstraintsResultSetCache extends ResultSetCache.SingleResultSetExtractor { - final String catalogName; - final String schemaName; - final String tableName; - - private GetNotNullConstraintsResultSetCache(Database database, String catalogName, String schemaName, String tableName) { - super(database); - this.catalogName = catalogName; - this.schemaName = schemaName; - this.tableName = tableName; - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEMA"), - database, row.getString("TABLE_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, tableName); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEMA"); - } - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - LiquibaseTableNamesFactory liquibaseTableNamesFactory = Scope.getCurrentScope().getSingleton(LiquibaseTableNamesFactory.class); - List liquibaseTableNames = liquibaseTableNamesFactory.getLiquibaseTableNames(database); - return liquibaseTableNames.stream().noneMatch(tableName::equalsIgnoreCase); - } - - @Override - public List fastFetchQuery() throws SQLException, DatabaseException { - if (database instanceof OracleDatabase) { - return oracleQuery(false); - } - return Collections.emptyList(); - } - - @Override - public List bulkFetchQuery() throws SQLException, DatabaseException { - if (database instanceof OracleDatabase) { - return oracleQuery(true); - } - return Collections.emptyList(); - } - - private List oracleQuery(boolean bulk) throws DatabaseException, SQLException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - String jdbcTableName = database.escapeStringForDatabase(tableName); - String sqlToSelectNotNullConstraints = "SELECT NULL AS TABLE_CAT, atc.OWNER AS TABLE_SCHEMA, atc.OWNER, atc.TABLE_NAME, " + - "atc.COLUMN_NAME, NULLABLE, ac.VALIDATED as VALIDATED, ac.SEARCH_CONDITION, ac.CONSTRAINT_NAME " + - "FROM ALL_TAB_COLS atc " + - "JOIN all_cons_columns acc ON atc.OWNER = acc.OWNER AND atc.TABLE_NAME = acc.TABLE_NAME AND atc.COLUMN_NAME = acc.COLUMN_NAME " + - "JOIN all_constraints ac ON atc.OWNER = ac.OWNER AND atc.TABLE_NAME = ac.TABLE_NAME AND acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME "; - - if (!bulk || getAllCatalogsStringScratchData() == null) { - sqlToSelectNotNullConstraints += " WHERE atc.OWNER='" + jdbcSchemaName + "' AND atc.hidden_column='NO' AND ac.CONSTRAINT_TYPE='C' and ac.search_condition is not null "; - } else { - sqlToSelectNotNullConstraints += " WHERE atc.OWNER IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") " - + " AND atc.hidden_column='NO' AND ac.CONSTRAINT_TYPE='C' and ac.search_condition is not null "; - } - - sqlToSelectNotNullConstraints += (!bulk && tableName != null && !tableName.isEmpty()) ? " AND atc.TABLE_NAME='" + jdbcTableName + "'" : ""; - - return this.executeAndExtract(sqlToSelectNotNullConstraints, database); - } - - @Override - protected List extract(ResultSet resultSet, boolean informixIndexTrimHint) throws SQLException { - List cachedRowList = new ArrayList<>(); - if (!(database instanceof OracleDatabase)) { - return cachedRowList; - } - - resultSet.setFetchSize(database.getFetchSize()); - - try { - List result = (List) new RowMapperNotNullConstraintsResultSetExtractor(new ColumnMapRowMapper(database.isCaseSensitive()) { - @Override - protected Object getColumnValue(ResultSet rs, int index) throws SQLException { - Object value = super.getColumnValue(rs, index); - if (!(value instanceof String)) { - return value; - } - return value.toString().trim(); - } - }).extractData(resultSet); - - for (Map row : result) { - cachedRowList.add(new CachedRow(row)); - } - } finally { - JdbcUtil.closeResultSet(resultSet); - } - return cachedRowList; - - } - } - - public List getTables(final String catalogName, final String schemaName, final String table) throws DatabaseException { - return getResultSetCache("getTables").get(new ResultSetCache.SingleResultSetExtractor(database) { - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - return table == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, table); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEM"); - } - - @Override - public List fastFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - if (database instanceof OracleDatabase) { - return queryOracle(catalogAndSchema, table); - } else if (database instanceof MSSQLDatabase) { - return queryMssql(catalogAndSchema, table); - } else if (database instanceof Db2zDatabase) { - return queryDb2Zos(catalogAndSchema, table); - } else if (database instanceof PostgresDatabase) { - return queryPostgres(catalogAndSchema, table); - } - - String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((table == null) ? - SQL_FILTER_MATCH_ALL : escapeForLike(table, database)), new String[]{"TABLE"})); - } - - @Override - public List bulkFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - if (database instanceof OracleDatabase) { - return queryOracle(catalogAndSchema, null); - } else if (database instanceof MSSQLDatabase) { - return queryMssql(catalogAndSchema, null); - } else if (database instanceof Db2zDatabase) { - return queryDb2Zos(catalogAndSchema, null); - } else if (database instanceof PostgresDatabase) { - return queryPostgres(catalogAndSchema, table); - } - - String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), SQL_FILTER_MATCH_ALL, new String[]{"TABLE"})); - } - - private List queryMssql(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { - String ownerName = database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class); - - String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); - String dbIdParam; - String databasePrefix; - if (databaseName == null) { - databasePrefix = ""; - dbIdParam = ""; - } else { - dbIdParam = ", db_id('" + databaseName + "')"; - databasePrefix = "[" + databaseName + "]."; - } - - - //From select object_definition(object_id('sp_tables')) - String sql = "select " + - "db_name(" + (databaseName == null ? "" : "db_id('" + databaseName + "')") + ") AS TABLE_CAT, " + - "convert(sysname,object_schema_name(o.object_id" + dbIdParam + ")) AS TABLE_SCHEM, " + - "convert(sysname,o.name) AS TABLE_NAME, " + - "'TABLE' AS TABLE_TYPE, " + - "CAST(ep.value as varchar(max)) as REMARKS " + - "from " + databasePrefix + "sys.all_objects o " + - "left outer join sys.extended_properties ep on ep.name='MS_Description' and major_id=o.object_id and minor_id=0 " + - "where " + - "o.type in ('U') " + - "and has_perms_by_name(" + (databaseName == null ? "" : "quotename('" + databaseName + "') + '.' + ") + "quotename(object_schema_name(o.object_id" + dbIdParam + ")) + '.' + quotename(o.name), 'object', 'select') = 1 " + - "and charindex(substring(o.type,1,1),'U') <> 0 " + - "and object_schema_name(o.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(ownerName) + "'"; - if (tableName != null) { - sql += " AND o.name='" + database.escapeStringForDatabase(tableName) + "' "; - } - sql += "order by 4, 1, 2, 3"; - - return executeAndExtract(sql, database); - } - - private List queryOracle(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { - String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); - - String sql = "SELECT null as TABLE_CAT, a.OWNER as TABLE_SCHEM, a.TABLE_NAME as TABLE_NAME, " + - "a.TEMPORARY as TEMPORARY, a.DURATION as DURATION, 'TABLE' as TABLE_TYPE, " + - "c.COMMENTS as REMARKS, A.tablespace_name as tablespace_name, CASE WHEN A.tablespace_name = " + - "(SELECT DEFAULT_TABLESPACE FROM USER_USERS) THEN 'true' ELSE null END as default_tablespace " + - "from ALL_TABLES a " + - "join ALL_TAB_COMMENTS c on a.TABLE_NAME=c.table_name and a.owner=c.owner " + - "left outer join ALL_QUEUE_TABLES q ON a.TABLE_NAME = q.QUEUE_TABLE and a.OWNER = q.OWNER " + - "WHERE q.QUEUE_TABLE is null "; - String allCatalogsString = getAllCatalogsStringScratchData(); - if (tableName != null || allCatalogsString == null) { - sql += "AND a.OWNER='" + ownerName + "'"; - } else { - sql += "AND a.OWNER IN ('" + ownerName + "', " + allCatalogsString + ")"; - } - if (tableName != null) { - sql += " AND a.TABLE_NAME='" + tableName + "'"; - } - - return executeAndExtract(sql, database); - } - - private List queryDb2Zos(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { - String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); - - String sql = "SELECT CREATOR AS TABLE_SCHEM, " + - "NAME AS TABLE_NAME, " + - "'TABLE' AS TABLE_TYPE, " + - "REMARKS " + - "FROM SYSIBM.SYSTABLES " + - "WHERE TYPE = 'T'"; - List parameters = new ArrayList<>(2); - if (ownerName != null) { - sql += " AND CREATOR = ?"; - parameters.add(ownerName); - } - if (tableName != null) { - sql += " AND NAME = ?"; - parameters.add(tableName); - } - - return executeAndExtract(database, sql, parameters.toArray()); - } - - private List queryPostgres(CatalogAndSchema catalogAndSchema, String tableName) throws SQLException { - String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((tableName == null) ? - SQL_FILTER_MATCH_ALL : escapeForLike(tableName, database)), new String[]{"TABLE", "PARTITIONED TABLE"})); - - } - }); - } - - public List getViews(final String catalogName, final String schemaName, String viewName) throws DatabaseException { - final String view; - if (database instanceof DB2Database) { - view = database.correctObjectName(viewName, View.class); - } else { - view = viewName; - } - return getResultSetCache("getViews").get(new ResultSetCache.SingleResultSetExtractor(database) { - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - return view == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); - } - - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, view); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEM"); - } - - - @Override - public List fastFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - if (database instanceof OracleDatabase) { - return queryOracle(catalogAndSchema, view); - } else if (database instanceof MSSQLDatabase) { - return queryMssql(catalogAndSchema, view); - } - - String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((view == null) ? SQL_FILTER_MATCH_ALL - : escapeForLike(view, database)), new String[]{"VIEW"})); - } - - @Override - public List bulkFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - if (database instanceof OracleDatabase) { - return queryOracle(catalogAndSchema, null); - } else if (database instanceof MSSQLDatabase) { - return queryMssql(catalogAndSchema, null); - } - - String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); - String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); - return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), SQL_FILTER_MATCH_ALL, new String[]{"VIEW"})); - } - - private List queryMssql(CatalogAndSchema catalogAndSchema, String viewName) throws DatabaseException, SQLException { - String ownerName = database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class); - String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); - String dbIdParam = ""; - String databasePrefix = ""; - boolean haveDatabaseName = databaseName != null; - - if (haveDatabaseName) { - dbIdParam = ", db_id('" + databaseName + "')"; - databasePrefix = "[" + databaseName + "]."; - } - String tableCatParam = haveDatabaseName ? "db_id('" + databaseName + "')" : ""; - String permsParam = haveDatabaseName ? "quotename('" + databaseName + "') + '.' + " : ""; - - String sql = "select " + - "db_name(" + tableCatParam + ") AS TABLE_CAT, " + - "convert(sysname,object_schema_name(o.object_id" + dbIdParam + ")) AS TABLE_SCHEM, " + - "convert(sysname,o.name) AS TABLE_NAME, " + - "'VIEW' AS TABLE_TYPE, " + - "CAST(ep.value as varchar(max)) as REMARKS " + - "from " + databasePrefix + "sys.all_objects o " + - "left join sys.extended_properties ep on ep.name='MS_Description' and major_id=o.object_id and minor_id=0 " + - "where " + - "o.type in ('V') " + - "and has_perms_by_name(" + permsParam + "quotename(object_schema_name(o.object_id" + dbIdParam + ")) + '.' + quotename(o.name), 'object', 'select') = 1 " + - "and charindex(substring(o.type,1,1),'V') <> 0 " + - "and object_schema_name(o.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(ownerName) + "'"; - if (viewName != null) { - sql += " AND o.name='" + database.escapeStringForDatabase(viewName) + "' "; - } - sql += "order by 4, 1, 2, 3"; - - return executeAndExtract(sql, database); - } - - - private List queryOracle(CatalogAndSchema catalogAndSchema, String viewName) throws DatabaseException, SQLException { - String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); - - String sql = "SELECT null as TABLE_CAT, a.OWNER as TABLE_SCHEM, a.VIEW_NAME as TABLE_NAME, 'TABLE' as TABLE_TYPE, c.COMMENTS as REMARKS, TEXT as OBJECT_BODY"; - if (database.getDatabaseMajorVersion() > 10) { - sql += ", EDITIONING_VIEW"; - } - sql += " from ALL_VIEWS a " + - "join ALL_TAB_COMMENTS c on a.VIEW_NAME=c.table_name and a.owner=c.owner "; - if (viewName != null || getAllCatalogsStringScratchData() == null) { - sql += "WHERE a.OWNER='" + ownerName + "'"; - } else { - sql += "WHERE a.OWNER IN ('" + ownerName + "', " + getAllCatalogsStringScratchData() + ")"; - } - if (viewName != null) { - sql += " AND a.VIEW_NAME='" + database.correctObjectName(viewName, View.class) + "'"; - } - sql += " AND a.VIEW_NAME not in (select mv.name from all_registered_mviews mv where mv.owner=a.owner)"; - - return executeAndExtract(sql, database); - } - }); - } - - public List getPrimaryKeys(final String catalogName, final String schemaName, final String table) throws DatabaseException { - return getResultSetCache("getPrimaryKeys").get(new ResultSetCache.SingleResultSetExtractor(database) { - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, table); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("TABLE_SCHEM"); - } - - @Override - public List fastFetchQuery() throws SQLException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - try { - List foundPks = new ArrayList<>(); - if (table == null) { - List tables = CachingDatabaseMetaData.this.getTables(catalogName, schemaName, null); - for (CachedRow table : tables) { - List pkInfo = getPkInfo(catalogAndSchema, table.getString("TABLE_NAME")); - if (pkInfo != null) { - foundPks.addAll(pkInfo); - } - } - return foundPks; - } else { - List pkInfo = getPkInfo(catalogAndSchema, table); - if (pkInfo != null) { - foundPks.addAll(pkInfo); - } - } - return foundPks; - } catch (DatabaseException e) { - throw new SQLException(e); - } - } - - private List getPkInfo(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { - List pkInfo; - if (database instanceof MSSQLDatabase) { - String sql = mssqlSql(catalogAndSchema, tableName); - pkInfo = executeAndExtract(sql, database); - } else { - if (database instanceof Db2zDatabase) { - String sql = "SELECT 'NULL' AS TABLE_CAT," + - " SYSTAB.TBCREATOR AS TABLE_SCHEM, " + - "SYSTAB.TBNAME AS TABLE_NAME, " + - "COLUSE.COLNAME AS COLUMN_NAME, " + - "COLUSE.COLSEQ AS KEY_SEQ, " + - "SYSTAB.CONSTNAME AS PK_NAME " + - "FROM SYSIBM.SYSTABCONST SYSTAB " + - "JOIN SYSIBM.SYSKEYCOLUSE COLUSE " + - "ON SYSTAB.TBCREATOR = COLUSE.TBCREATOR " + - "WHERE SYSTAB.TYPE = 'P' " + - "AND SYSTAB.TBNAME = ? " + - "AND SYSTAB.TBCREATOR = ? " + - "AND SYSTAB.TBNAME=COLUSE.TBNAME " + - "AND SYSTAB.CONSTNAME=COLUSE.CONSTNAME " + - "ORDER BY COLUSE.COLNAME"; - try { - return executeAndExtract(database, sql, table, ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema)); - } catch (DatabaseException e) { - throw new SQLException(e); - } - } else if (database instanceof OracleDatabase) { - warnAboutDbaRecycleBin(); - - String sql = "SELECT NULL AS table_cat, c.owner AS table_schem, c.table_name, c.column_name as COLUMN_NAME, c.position AS key_seq, c.constraint_name AS pk_name, k.VALIDATED as VALIDATED " + - "FROM all_cons_columns c, all_constraints k " + - "LEFT JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=k.table_name " + - "WHERE k.constraint_type = 'P' " + - "AND d.object_name IS NULL " + - "AND k.table_name = '" + table + "' " + - "AND k.owner = '" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "' " + - "AND k.constraint_name = c.constraint_name " + - "AND k.table_name = c.table_name " + - "AND k.owner = c.owner " + - "ORDER BY column_name"; - try { - return executeAndExtract(sql, database); - } catch (DatabaseException e) { - throw new SQLException(e); - } - } else if (database instanceof CockroachDatabase) { - // This is the same as the query generated by PGJDBC's getPrimaryKeys method, except it - // also adds an `asc_or_desc` column to the result. - String sql = "SELECT " + - " result.table_cat, " + - " result.table_schem, " + - " result.table_name, " + - " result.column_name, " + - " result.key_seq, " + - " result.pk_name, " + - " CASE result.indoption[result.key_seq - 1] & 1 " + - " WHEN 1 THEN 'D' " + - " ELSE 'A' " + - " END AS asc_or_desc " + - "FROM " + - " (" + - " SELECT " + - " NULL AS table_cat, " + - " n.nspname AS table_schem, " + - " ct.relname AS table_name, " + - " a.attname AS column_name, " + - " (information_schema._pg_expandarray(i.indkey)).n " + - " AS key_seq, " + - " ci.relname AS pk_name, " + - " information_schema._pg_expandarray(i.indkey) AS keys, " + - " i.indoption, " + - " a.attnum AS a_attnum " + - " FROM " + - " pg_catalog.pg_class AS ct " + - " JOIN pg_catalog.pg_attribute AS a ON (ct.oid = a.attrelid) " + - " JOIN pg_catalog.pg_namespace AS n ON " + - " (ct.relnamespace = n.oid) " + - " JOIN pg_catalog.pg_index AS i ON (a.attrelid = i.indrelid) " + - " JOIN pg_catalog.pg_class AS ci ON (ci.oid = i.indexrelid) " + - " WHERE " + - " true " + - " AND n.nspname = '" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "' " + - " AND ct.relname = '" + table + "' " + - " AND i.indisprimary" + - " ) " + - " AS result " + - "WHERE " + - " result.a_attnum = (result.keys).x " + - "ORDER BY " + - " result.table_name, result.pk_name, result.key_seq"; - - try { - return executeAndExtract(sql, database); - } catch (DatabaseException e) { - throw new SQLException(e); - } - } else { - return extract( - databaseMetaData.getPrimaryKeys( - ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), - ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), - table - ) - ); - } - } - return pkInfo; - } - - private String mssqlSql(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException { - String sql; - sql = - "SELECT " + - "DB_NAME() AS [TABLE_CAT], " + - "[s].[name] AS [TABLE_SCHEM], " + - "[t].[name] AS [TABLE_NAME], " + - "[c].[name] AS [COLUMN_NAME], " + - "CASE [ic].[is_descending_key] WHEN 0 THEN N'A' WHEN 1 THEN N'D' END AS [ASC_OR_DESC], " + - "[ic].[key_ordinal] AS [KEY_SEQ], " + - "[kc].[name] AS [PK_NAME] " + - "FROM [sys].[schemas] AS [s] " + - "INNER JOIN [sys].[tables] AS [t] " + - "ON [t].[schema_id] = [s].[schema_id] " + - "INNER JOIN [sys].[key_constraints] AS [kc] " + - "ON [kc].[parent_object_id] = [t].[object_id] " + - "INNER JOIN [sys].[indexes] AS [i] " + - "ON [i].[object_id] = [kc].[parent_object_id] " + - "AND [i].[index_id] = [kc].[unique_index_id] " + - "INNER JOIN [sys].[index_columns] AS [ic] " + - "ON [ic].[object_id] = [i].[object_id] " + - "AND [ic].[index_id] = [i].[index_id] " + - "INNER JOIN [sys].[columns] AS [c] " + - "ON [c].[object_id] = [ic].[object_id] " + - "AND [c].[column_id] = [ic].[column_id] " + - "WHERE [s].[name] = N'" + database.escapeStringForDatabase(catalogAndSchema.getSchemaName()) + "' " + // The schema name was corrected in the customized CatalogAndSchema - (tableName == null ? "" : "AND [t].[name] = N'" + database.escapeStringForDatabase(database.correctObjectName(tableName, Table.class)) + "' ") + - "AND [kc].[type] = 'PK' " + - "AND [ic].[key_ordinal] > 0 " + - "ORDER BY " + - "[ic].[key_ordinal]"; - return sql; - } - - @Override - public List bulkFetchQuery() throws SQLException { - if (database instanceof OracleDatabase) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - warnAboutDbaRecycleBin(); - try { - String sql = "SELECT NULL AS table_cat, c.owner AS table_schem, c.table_name, c.column_name, c.position AS key_seq,c.constraint_name AS pk_name, k.VALIDATED as VALIDATED FROM " + - "all_cons_columns c, " + - "all_constraints k " + - "LEFT JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=k.table_name " + - "WHERE k.constraint_type = 'P' " + - "AND d.object_name IS NULL "; - if (getAllCatalogsStringScratchData() == null) { - sql += "AND k.owner='" + catalogAndSchema.getCatalogName() + "' "; - } else { - sql += "AND k.owner IN ('" + catalogAndSchema.getCatalogName() + "', " + getAllCatalogsStringScratchData() + ")"; - } - sql += "AND k.constraint_name = c.constraint_name " + - "AND k.table_name = c.table_name " + - "AND k.owner = c.owner " + - "ORDER BY column_name"; - return executeAndExtract(sql, database); - } catch (DatabaseException e) { - throw new SQLException(e); - } - } else if (database instanceof MSSQLDatabase) { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - try { - return executeAndExtract(mssqlSql(catalogAndSchema, null), database); - } catch (DatabaseException e) { - throw new SQLException(e); - } - } - return null; - } - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - if ((database instanceof OracleDatabase) || (database instanceof MSSQLDatabase)) { - return table == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); - } else { - return false; - } - } - }); - } - - public List getUniqueConstraints(final String catalogName, final String schemaName, final String tableName) throws DatabaseException { - return getResultSetCache("getUniqueConstraints").get(new ResultSetCache.SingleResultSetExtractor(database) { - - @Override - protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { - return tableName == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); - } - - @Override - public boolean bulkContainsSchema(String schemaKey) { - return database instanceof OracleDatabase; - } - - @Override - public String getSchemaKey(CachedRow row) { - return row.getString("CONSTRAINT_SCHEM"); - } - - @Override - public ResultSetCache.RowData rowKeyParameters(CachedRow row) { - return new ResultSetCache.RowData(catalogName, schemaName, database, row.getString("TABLE_NAME")); - } - - @Override - public ResultSetCache.RowData wantedKeyParameters() { - return new ResultSetCache.RowData(catalogName, schemaName, database, tableName); - } - - @Override - public List fastFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - return queryDb(catalogAndSchema, tableName); - } - - @Override - public List bulkFetchQuery() throws SQLException, DatabaseException { - CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); - - return queryDb(catalogAndSchema, null); - } - - private List queryDb(CatalogAndSchema catalogAndSchema, String tableName) throws SQLException, DatabaseException { - - String jdbcCatalogName = catalogAndSchema.getCatalogName(); - String jdbcSchemaName = catalogAndSchema.getSchemaName(); - - Database database = getDatabase(); - List parameters = new ArrayList<>(3); - String sql = null; - if (database instanceof Ingres9Database) { - sql = "select CONSTRAINT_NAME, TABLE_NAME from iiconstraints where schema_name ='" - + schemaName + "' and constraint_type='U'"; - if (tableName != null) { - sql += " and table_name='" + tableName + "'"; - } - } else if ((database instanceof MySQLDatabase) || (database instanceof HsqlDatabase) || (database - instanceof MariaDBDatabase)) { - sql = "select CONSTRAINT_NAME, TABLE_NAME " - + "from " + database.getSystemSchema() + ".table_constraints " - + "where constraint_schema='" + jdbcCatalogName + "' " - + "and constraint_type='UNIQUE'"; - if (tableName != null) { - sql += " and table_name='" + tableName + "'"; - } - } else if (database instanceof PostgresDatabase) { - sql = "select CONSTRAINT_NAME, TABLE_NAME " - + "from " + database.getSystemSchema() + ".table_constraints " - + "where constraint_catalog='" + jdbcCatalogName + "' " - + "and constraint_schema='" + jdbcSchemaName + "' " - + "and constraint_type='UNIQUE'"; - if (tableName != null) { - sql += " and table_name='" + tableName + "'"; - } - } else if (database.getClass().getName().contains("MaxDB")) { //have to check classname as this is currently an extension - sql = "select distinct tablename AS TABLE_NAME, constraintname AS CONSTRAINT_NAME from CONSTRAINTCOLUMNS WHERE CONSTRAINTTYPE = 'UNIQUE_CONST'"; - if (tableName != null) { - sql += " and tablename='" + tableName + "'"; - } - } else if (database instanceof MSSQLDatabase) { - sql = - "SELECT " + - "[TC].[CONSTRAINT_NAME], " + - "[TC].[TABLE_NAME], " + - "[TC].[CONSTRAINT_CATALOG] AS INDEX_CATALOG, " + - "[TC].[CONSTRAINT_SCHEMA] AS INDEX_SCHEMA, " + - "[IDX].[TYPE_DESC], " + - "[IDX].[name] AS INDEX_NAME " + - "FROM [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] AS [TC] " + - "JOIN sys.indexes AS IDX ON IDX.name=[TC].[CONSTRAINT_NAME] AND object_schema_name(object_id)=[TC].[CONSTRAINT_SCHEMA] " + - "WHERE [TC].[CONSTRAINT_TYPE] = 'UNIQUE' " + - "AND [TC].[CONSTRAINT_CATALOG] = N'" + database.escapeStringForDatabase(jdbcCatalogName) + "' " + - "AND [TC].[CONSTRAINT_SCHEMA] = N'" + database.escapeStringForDatabase(jdbcSchemaName) + "'"; - if (tableName != null) { - sql += " AND [TC].[TABLE_NAME] = N'" + database.escapeStringForDatabase(database.correctObjectName(tableName, Table.class)) + "'"; - } - } else if (database instanceof OracleDatabase) { - warnAboutDbaRecycleBin(); - - sql = "select uc.owner AS CONSTRAINT_SCHEM, uc.constraint_name, uc.table_name,uc.status,uc.deferrable,uc.deferred,ui.tablespace_name, ui.index_name, ui.owner as INDEX_CATALOG, uc.VALIDATED as VALIDATED, ac.COLUMN_NAME as COLUMN_NAME " + - "from all_constraints uc " + - "join all_indexes ui on uc.index_name = ui.index_name and uc.owner=ui.table_owner and uc.table_name=ui.table_name " + - "LEFT OUTER JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=ui.table_name " + - "LEFT JOIN all_cons_columns ac ON ac.OWNER = uc.OWNER AND ac.TABLE_NAME = uc.TABLE_NAME AND ac.CONSTRAINT_NAME = uc.CONSTRAINT_NAME " + - "where uc.constraint_type='U' "; - if (tableName != null || getAllCatalogsStringScratchData() == null) { - sql += "and uc.owner = '" + jdbcSchemaName + "'"; - } else { - sql += "and uc.owner IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ")"; - } - sql += "AND d.object_name IS NULL "; - - if (tableName != null) { - sql += " and uc.table_name = '" + tableName + "'"; - } - } else if (database instanceof DB2Database) { - // if we are on DB2 AS400 iSeries - if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { - sql = "select constraint_name as constraint_name, table_name as table_name from QSYS2.TABLE_CONSTRAINTS where table_schema='" + jdbcSchemaName + "' and constraint_type='UNIQUE'"; - if (tableName != null) { - sql += " and table_name = '" + tableName + "'"; - } - // DB2 z/OS - } - // here we are on DB2 UDB - else { - sql = "select distinct k.constname as constraint_name, t.tabname as TABLE_NAME " - + "from syscat.keycoluse k " - + "inner join syscat.tabconst t " - + "on k.constname = t.constname " - + "where t.tabschema = ? " - + "and t.type = 'U'"; - parameters.add(jdbcSchemaName); - if (tableName != null) { - sql += " and t.tabname = ?"; - parameters.add(tableName); - } - } - } else if (database instanceof Db2zDatabase) { - sql = "select k.constname as constraint_name, t.tbname as TABLE_NAME" - + " from SYSIBM.SYSKEYCOLUSE k" - + " inner join SYSIBM.SYSTABCONST t" - + " on k.constname = t.constname" - + " and k.TBCREATOR = t.TBCREATOR" - + " and k.TBNAME = t.TBNAME" - + " where t.TBCREATOR = ?" - + " and t.TYPE = 'U'"; - parameters.add(jdbcSchemaName); - if (tableName != null) { - sql += " and t.TBNAME = ?"; - parameters.add(tableName); - } - } else if (database instanceof FirebirdDatabase) { - sql = "SELECT TRIM(RDB$INDICES.RDB$INDEX_NAME) AS CONSTRAINT_NAME, " + - "TRIM(RDB$INDICES.RDB$RELATION_NAME) AS TABLE_NAME " + - "FROM RDB$INDICES " - + "LEFT JOIN RDB$RELATION_CONSTRAINTS " - + "ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME " - + "WHERE RDB$INDICES.RDB$UNIQUE_FLAG IS NOT NULL " - + "AND (" - + "RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL " - + "OR TRIM(RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE)='UNIQUE') " - + "AND NOT(RDB$INDICES.RDB$INDEX_NAME LIKE 'RDB$%')"; - if (tableName != null) { - sql += " AND TRIM(RDB$INDICES.RDB$RELATION_NAME)='" + tableName + "'"; - } - } else if (database instanceof DerbyDatabase) { - sql = "select c.constraintname as CONSTRAINT_NAME, tablename AS TABLE_NAME " - + "from sys.systables t, sys.sysconstraints c, sys.sysschemas s " - + "where s.schemaname='" + jdbcCatalogName + "' " - + "and t.tableid = c.tableid " - + "and t.schemaid=s.schemaid " - + "and c.type = 'U'"; - if (tableName != null) { - sql += " AND t.tablename = '" + tableName + "'"; - } - } else if (database instanceof InformixDatabase) { - sql = "select unique sysindexes.idxname as CONSTRAINT_NAME, sysindexes.idxtype, systables.tabname as TABLE_NAME " - + "from sysindexes, systables " - + "left outer join sysconstraints on sysconstraints.tabid = systables.tabid and sysconstraints.constrtype = 'P' " - + "where sysindexes.tabid = systables.tabid and sysindexes.idxtype = 'U' " - + "and sysconstraints.idxname != sysindexes.idxname " - + "and sysconstraints.tabid = sysindexes.tabid"; - if (tableName != null) { - sql += " and systables.tabname = '" + database.correctObjectName(tableName, Table.class) + "'"; - } - } else if (database instanceof SybaseDatabase) { - sql = "select idx.name as CONSTRAINT_NAME, tbl.name as TABLE_NAME " - + "from sysindexes idx " - + "inner join sysobjects tbl on tbl.id = idx.id " - + "where idx.indid between 1 and 254 " - + "and (idx.status & 2) = 2 " - + "and tbl.type = 'U'"; - if (tableName != null) { - sql += " and tbl.name = '" + database.correctObjectName(tableName, Table.class) + "'"; - } - } else if (database instanceof SybaseASADatabase) { - sql = "select sysconstraint.constraint_name, sysconstraint.constraint_type, systable.table_name " + - "from sysconstraint, systable " + - "where sysconstraint.table_object_id = systable.object_id " + - "and sysconstraint.constraint_type = 'U'"; - if (tableName != null) { - sql += " and systable.table_name = '" + tableName + "'"; - } - } else { - if (database instanceof H2Database) { - try { - if (database.getDatabaseMajorVersion() >= 2) { - sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " - + "from " + database.getSystemSchema() + ".table_constraints " - + "where constraint_schema='" + jdbcSchemaName + "' " - + "and constraint_catalog='" + jdbcCatalogName + "' " - + "and constraint_type='UNIQUE'"; - if (tableName != null) { - sql += " and table_name='" + tableName + "'"; - } - } - } catch (DatabaseException e) { - Scope.getCurrentScope().getLog(getClass()).fine("Cannot determine h2 version, using default unique constraint query"); - } - } - if (sql == null) { - - sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " - + "from " + database.getSystemSchema() + ".constraints " - + "where constraint_schema='" + jdbcSchemaName + "' " - + "and constraint_catalog='" + jdbcCatalogName + "' " - + "and constraint_type='UNIQUE'"; - if (tableName != null) { - sql += " and table_name='" + tableName + "'"; - } - } - } - - return executeAndExtract(database, database instanceof InformixDatabase, sql, parameters.toArray()); - } - }); - } - } - - private String getAllCatalogsStringScratchData() { - return (String) getScratchData(ALL_CATALOGS_STRING_SCRATCH_KEY); - } - - private String escapeForLike(String string, Database database) { - if (string == null) { - return null; - } - - if (database instanceof SQLiteDatabase || database instanceof DmDatabase) { - //sqlite jdbc's queries does not support escaped patterns. - // DM ä¹Ÿä¸æ”¯æŒè½¬ä¹‰çš„åŒ¹é…æ–¹å¼ï¼Œéœ€è¦å…¼å®¹ - return string; - } - - return string - .replace("%", "\\%") - .replace("_", "\\_"); - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java deleted file mode 100644 index 790e65e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java +++ /dev/null @@ -1,2038 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.flowable.common.engine.impl; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.builder.xml.XMLConfigBuilder; -import org.apache.ibatis.builder.xml.XMLMapperBuilder; -import org.apache.ibatis.datasource.pooled.PooledDataSource; -import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; -import org.apache.ibatis.transaction.TransactionFactory; -import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; -import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; -import org.apache.ibatis.type.*; -import org.flowable.common.engine.api.FlowableException; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; -import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher; -import org.flowable.common.engine.api.delegate.event.FlowableEventListener; -import org.flowable.common.engine.api.engine.EngineLifecycleListener; -import org.flowable.common.engine.impl.agenda.AgendaOperationExecutionListener; -import org.flowable.common.engine.impl.agenda.AgendaOperationRunner; -import org.flowable.common.engine.impl.cfg.CommandExecutorImpl; -import org.flowable.common.engine.impl.cfg.IdGenerator; -import org.flowable.common.engine.impl.cfg.TransactionContextFactory; -import org.flowable.common.engine.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory; -import org.flowable.common.engine.impl.db.*; -import org.flowable.common.engine.impl.event.EventDispatchAction; -import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl; -import org.flowable.common.engine.impl.interceptor.*; -import org.flowable.common.engine.impl.lock.LockManager; -import org.flowable.common.engine.impl.lock.LockManagerImpl; -import org.flowable.common.engine.impl.logging.LoggingListener; -import org.flowable.common.engine.impl.logging.LoggingSession; -import org.flowable.common.engine.impl.logging.LoggingSessionFactory; -import org.flowable.common.engine.impl.persistence.GenericManagerFactory; -import org.flowable.common.engine.impl.persistence.StrongUuidGenerator; -import org.flowable.common.engine.impl.persistence.cache.EntityCache; -import org.flowable.common.engine.impl.persistence.cache.EntityCacheImpl; -import org.flowable.common.engine.impl.persistence.entity.*; -import org.flowable.common.engine.impl.persistence.entity.data.ByteArrayDataManager; -import org.flowable.common.engine.impl.persistence.entity.data.PropertyDataManager; -import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisByteArrayDataManager; -import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisPropertyDataManager; -import org.flowable.common.engine.impl.runtime.Clock; -import org.flowable.common.engine.impl.service.CommonEngineServiceImpl; -import org.flowable.common.engine.impl.util.DefaultClockImpl; -import org.flowable.common.engine.impl.util.IoUtil; -import org.flowable.common.engine.impl.util.ReflectUtil; -import org.flowable.eventregistry.api.EventRegistryEventConsumer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.naming.InitialContext; -import javax.sql.DataSource; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.sql.*; -import java.time.Duration; -import java.util.*; - -public abstract class AbstractEngineConfiguration { - - protected final Logger logger = LoggerFactory.getLogger(getClass()); - - /** The tenant id indicating 'no tenant' */ - public static final String NO_TENANT_ID = ""; - - /** - * Checks the version of the DB schema against the library when the form engine is being created and throws an exception if the versions don't match. - */ - public static final String DB_SCHEMA_UPDATE_FALSE = "false"; - public static final String DB_SCHEMA_UPDATE_CREATE = "create"; - public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop"; - - /** - * Creates the schema when the form engine is being created and drops the schema when the form engine is being closed. - */ - public static final String DB_SCHEMA_UPDATE_DROP_CREATE = "drop-create"; - - /** - * Upon building of the process engine, a check is performed and an update of the schema is performed if it is necessary. - */ - public static final String DB_SCHEMA_UPDATE_TRUE = "true"; - - protected boolean forceCloseMybatisConnectionPool = true; - - protected String databaseType; - protected String jdbcDriver = "org.h2.Driver"; - protected String jdbcUrl = "jdbc:h2:tcp://localhost/~/flowable"; - protected String jdbcUsername = "sa"; - protected String jdbcPassword = ""; - protected String dataSourceJndiName; - protected int jdbcMaxActiveConnections = 16; - protected int jdbcMaxIdleConnections = 8; - protected int jdbcMaxCheckoutTime; - protected int jdbcMaxWaitTime; - protected boolean jdbcPingEnabled; - protected String jdbcPingQuery; - protected int jdbcPingConnectionNotUsedFor; - protected int jdbcDefaultTransactionIsolationLevel; - protected DataSource dataSource; - protected SchemaManager commonSchemaManager; - protected SchemaManager schemaManager; - protected Command schemaManagementCmd; - - protected String databaseSchemaUpdate = DB_SCHEMA_UPDATE_FALSE; - - /** - * Whether to use a lock when performing the database schema create or update operations. - */ - protected boolean useLockForDatabaseSchemaUpdate = false; - - protected String xmlEncoding = "UTF-8"; - - // COMMAND EXECUTORS /////////////////////////////////////////////// - - protected CommandExecutor commandExecutor; - protected Collection defaultCommandInterceptors; - protected CommandConfig defaultCommandConfig; - protected CommandConfig schemaCommandConfig; - protected CommandContextFactory commandContextFactory; - protected CommandInterceptor commandInvoker; - - protected AgendaOperationRunner agendaOperationRunner = (commandContext, runnable) -> runnable.run(); - protected Collection agendaOperationExecutionListeners; - - protected List customPreCommandInterceptors; - protected List customPostCommandInterceptors; - protected List commandInterceptors; - - protected Map engineConfigurations = new HashMap<>(); - protected Map serviceConfigurations = new HashMap<>(); - - protected ClassLoader classLoader; - /** - * Either use Class.forName or ClassLoader.loadClass for class loading. See http://forums.activiti.org/content/reflectutilloadclass-and-custom- classloader - */ - protected boolean useClassForNameClassLoading = true; - - protected List engineLifecycleListeners; - - // Event Registry ////////////////////////////////////////////////// - protected Map eventRegistryEventConsumers = new HashMap<>(); - - // MYBATIS SQL SESSION FACTORY ///////////////////////////////////// - - protected boolean isDbHistoryUsed = true; - protected DbSqlSessionFactory dbSqlSessionFactory; - protected SqlSessionFactory sqlSessionFactory; - protected TransactionFactory transactionFactory; - protected TransactionContextFactory transactionContextFactory; - - /** - * If set to true, enables bulk insert (grouping sql inserts together). Default true. - * For some databases (eg DB2+z/OS) needs to be set to false. - */ - protected boolean isBulkInsertEnabled = true; - - /** - * Some databases have a limit of how many parameters one sql insert can have (eg SQL Server, 2000 params (!= insert statements) ). Tweak this parameter in case of exceptions indicating too much - * is being put into one bulk insert, or make it higher if your database can cope with it and there are inserts with a huge amount of data. - *

- * By default: 100 (55 for mssql server as it has a hard limit of 2000 parameters in a statement) - */ - protected int maxNrOfStatementsInBulkInsert = 100; - - public int DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER = 55; // currently Execution has most params (35). 2000 / 35 = 57. - - protected String mybatisMappingFile; - protected Set> customMybatisMappers; - protected Set customMybatisXMLMappers; - protected List customMybatisInterceptors; - - protected Set dependentEngineMyBatisXmlMappers; - protected List dependentEngineMybatisTypeAliasConfigs; - protected List dependentEngineMybatisTypeHandlerConfigs; - - // SESSION FACTORIES /////////////////////////////////////////////// - protected List customSessionFactories; - protected Map, SessionFactory> sessionFactories; - - protected boolean enableEventDispatcher = true; - protected FlowableEventDispatcher eventDispatcher; - protected List eventListeners; - protected Map> typedEventListeners; - protected List additionalEventDispatchActions; - - protected LoggingListener loggingListener; - - protected boolean transactionsExternallyManaged; - - /** - * Flag that can be set to configure or not a relational database is used. This is useful for custom implementations that do not use relational databases at all. - * - * If true (default), the {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will be used to determine what needs to happen wrt the database schema. - * - * If false, no validation or schema creation will be done. That means that the database schema must have been created 'manually' before but the engine does not validate whether the schema is - * correct. The {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will not be used. - */ - protected boolean usingRelationalDatabase = true; - - /** - * Flag that can be set to configure whether or not a schema is used. This is useful for custom implementations that do not use relational databases at all. - * Setting {@link #usingRelationalDatabase} to true will automatically imply using a schema. - */ - protected boolean usingSchemaMgmt = true; - - /** - * Allows configuring a database table prefix which is used for all runtime operations of the process engine. For example, if you specify a prefix named 'PRE1.', Flowable will query for executions - * in a table named 'PRE1.ACT_RU_EXECUTION_'. - * - *

- * NOTE: the prefix is not respected by automatic database schema management. If you use {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_CREATE_DROP} or - * {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_TRUE}, Flowable will create the database tables using the default names, regardless of the prefix configured here. - */ - protected String databaseTablePrefix = ""; - - /** - * Escape character for doing wildcard searches. - * - * This will be added at then end of queries that include for example a LIKE clause. For example: SELECT * FROM table WHERE column LIKE '%\%%' ESCAPE '\'; - */ - protected String databaseWildcardEscapeCharacter; - - /** - * database catalog to use - */ - protected String databaseCatalog = ""; - - /** - * In some situations you want to set the schema to use for table checks / generation if the database metadata doesn't return that correctly, see https://jira.codehaus.org/browse/ACT-1220, - * https://jira.codehaus.org/browse/ACT-1062 - */ - protected String databaseSchema; - - /** - * Set to true in case the defined databaseTablePrefix is a schema-name, instead of an actual table name prefix. This is relevant for checking if Flowable-tables exist, the databaseTablePrefix - * will not be used here - since the schema is taken into account already, adding a prefix for the table-check will result in wrong table-names. - */ - protected boolean tablePrefixIsSchema; - - /** - * Set to true if the latest version of a definition should be retrieved, ignoring a possible parent deployment id value - */ - protected boolean alwaysLookupLatestDefinitionVersion; - - /** - * Set to true if by default lookups should fallback to the default tenant (an empty string by default or a defined tenant value) - */ - protected boolean fallbackToDefaultTenant; - - /** - * Default tenant provider that is executed when looking up definitions, in case the global or local fallback to default tenant value is true - */ - protected DefaultTenantProvider defaultTenantProvider = (tenantId, scope, scopeKey) -> NO_TENANT_ID; - - /** - * Enables the MyBatis plugin that logs the execution time of sql statements. - */ - protected boolean enableLogSqlExecutionTime; - - protected Properties databaseTypeMappings = getDefaultDatabaseTypeMappings(); - - /** - * Duration between the checks when acquiring a lock. - */ - protected Duration lockPollRate = Duration.ofSeconds(10); - - /** - * Duration to wait for the DB Schema lock before giving up. - */ - protected Duration schemaLockWaitTime = Duration.ofMinutes(5); - - // DATA MANAGERS ////////////////////////////////////////////////////////////////// - - protected PropertyDataManager propertyDataManager; - protected ByteArrayDataManager byteArrayDataManager; - protected TableDataManager tableDataManager; - - // ENTITY MANAGERS //////////////////////////////////////////////////////////////// - - protected PropertyEntityManager propertyEntityManager; - protected ByteArrayEntityManager byteArrayEntityManager; - - protected List customPreDeployers; - protected List customPostDeployers; - protected List deployers; - - // CONFIGURATORS //////////////////////////////////////////////////////////// - - protected boolean enableConfiguratorServiceLoader = true; // Enabled by default. In certain environments this should be set to false (eg osgi) - protected List configurators; // The injected configurators - protected List allConfigurators; // Including auto-discovered configurators - protected EngineConfigurator idmEngineConfigurator; - protected EngineConfigurator eventRegistryConfigurator; - - public static final String PRODUCT_NAME_POSTGRES = "PostgreSQL"; - public static final String PRODUCT_NAME_CRDB = "CockroachDB"; - - public static final String DATABASE_TYPE_H2 = "h2"; - public static final String DATABASE_TYPE_HSQL = "hsql"; - public static final String DATABASE_TYPE_MYSQL = "mysql"; - public static final String DATABASE_TYPE_ORACLE = "oracle"; - public static final String DATABASE_TYPE_POSTGRES = "postgres"; - public static final String DATABASE_TYPE_MSSQL = "mssql"; - public static final String DATABASE_TYPE_DB2 = "db2"; - public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb"; - - public static Properties getDefaultDatabaseTypeMappings() { - Properties databaseTypeMappings = new Properties(); - databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2); - databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL); - databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL); - databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL); - databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE); - databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES); - databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL); - databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2); - databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB); - databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_ORACLE);// åŠ å…¥è¾¾æ¢¦æ”¯æŒ å¯ä»¥ç›´æŽ¥ä½¿ç”¨ORACLE或者MYSQLçš„ - return databaseTypeMappings; - } - - protected Map beans; - - protected IdGenerator idGenerator; - protected boolean usePrefixId; - - protected Clock clock; - protected ObjectMapper objectMapper; - - // Variables - - public static final int DEFAULT_GENERIC_MAX_LENGTH_STRING = 4000; - public static final int DEFAULT_ORACLE_MAX_LENGTH_STRING = 2000; - - /** - * Define a max length for storing String variable types in the database. Mainly used for the Oracle NVARCHAR2 limit of 2000 characters - */ - protected int maxLengthStringVariableType = -1; - - protected void initEngineConfigurations() { - addEngineConfiguration(getEngineCfgKey(), getEngineScopeType(), this); - } - - // DataSource - // /////////////////////////////////////////////////////////////// - - protected void initDataSource() { - if (dataSource == null) { - if (dataSourceJndiName != null) { - try { - dataSource = (DataSource) new InitialContext().lookup(dataSourceJndiName); - } catch (Exception e) { - throw new FlowableException("couldn't lookup datasource from " + dataSourceJndiName + ": " + e.getMessage(), e); - } - - } else if (jdbcUrl != null) { - if ((jdbcDriver == null) || (jdbcUsername == null)) { - throw new FlowableException("DataSource or JDBC properties have to be specified in a process engine configuration"); - } - - logger.debug("initializing datasource to db: {}", jdbcUrl); - - if (logger.isInfoEnabled()) { - logger.info("Configuring Datasource with following properties (omitted password for security)"); - logger.info("datasource driver : {}", jdbcDriver); - logger.info("datasource url : {}", jdbcUrl); - logger.info("datasource user name : {}", jdbcUsername); - } - - PooledDataSource pooledDataSource = new PooledDataSource(this.getClass().getClassLoader(), jdbcDriver, jdbcUrl, jdbcUsername, jdbcPassword); - - if (jdbcMaxActiveConnections > 0) { - pooledDataSource.setPoolMaximumActiveConnections(jdbcMaxActiveConnections); - } - if (jdbcMaxIdleConnections > 0) { - pooledDataSource.setPoolMaximumIdleConnections(jdbcMaxIdleConnections); - } - if (jdbcMaxCheckoutTime > 0) { - pooledDataSource.setPoolMaximumCheckoutTime(jdbcMaxCheckoutTime); - } - if (jdbcMaxWaitTime > 0) { - pooledDataSource.setPoolTimeToWait(jdbcMaxWaitTime); - } - if (jdbcPingEnabled) { - pooledDataSource.setPoolPingEnabled(true); - if (jdbcPingQuery != null) { - pooledDataSource.setPoolPingQuery(jdbcPingQuery); - } - pooledDataSource.setPoolPingConnectionsNotUsedFor(jdbcPingConnectionNotUsedFor); - } - if (jdbcDefaultTransactionIsolationLevel > 0) { - pooledDataSource.setDefaultTransactionIsolationLevel(jdbcDefaultTransactionIsolationLevel); - } - dataSource = pooledDataSource; - } - } - - if (databaseType == null) { - initDatabaseType(); - } - } - - public void initDatabaseType() { - Connection connection = null; - try { - connection = dataSource.getConnection(); - DatabaseMetaData databaseMetaData = connection.getMetaData(); - String databaseProductName = databaseMetaData.getDatabaseProductName(); - logger.debug("database product name: '{}'", databaseProductName); - - // CRDB does not expose the version through the jdbc driver, so we need to fetch it through version(). - if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) { - try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;"); - ResultSet resultSet = preparedStatement.executeQuery()) { - String version = null; - if (resultSet.next()) { - version = resultSet.getString("version"); - } - - if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) { - databaseProductName = PRODUCT_NAME_CRDB; - logger.info("CockroachDB version '{}' detected", version); - } - } - } - - databaseType = databaseTypeMappings.getProperty(databaseProductName); - if (databaseType == null) { - throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'"); - } - logger.debug("using database type: {}", databaseType); - - } catch (SQLException e) { - throw new RuntimeException("Exception while initializing Database connection", e); - } finally { - try { - if (connection != null) { - connection.close(); - } - } catch (SQLException e) { - logger.error("Exception while closing the Database connection", e); - } - } - - // Special care for MSSQL, as it has a hard limit of 2000 params per statement (incl bulk statement). - // Especially with executions, with 100 as default, this limit is passed. - if (DATABASE_TYPE_MSSQL.equals(databaseType)) { - maxNrOfStatementsInBulkInsert = DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER; - } - } - - public void initSchemaManager() { - if (this.commonSchemaManager == null) { - this.commonSchemaManager = new CommonDbSchemaManager(); - } - } - - // session factories //////////////////////////////////////////////////////// - - public void addSessionFactory(SessionFactory sessionFactory) { - sessionFactories.put(sessionFactory.getSessionType(), sessionFactory); - } - - public void initCommandContextFactory() { - if (commandContextFactory == null) { - commandContextFactory = new CommandContextFactory(); - } - } - - public void initTransactionContextFactory() { - if (transactionContextFactory == null) { - transactionContextFactory = new StandaloneMybatisTransactionContextFactory(); - } - } - - public void initCommandExecutors() { - initDefaultCommandConfig(); - initSchemaCommandConfig(); - initCommandInvoker(); - initCommandInterceptors(); - initCommandExecutor(); - } - - - public void initDefaultCommandConfig() { - if (defaultCommandConfig == null) { - defaultCommandConfig = new CommandConfig(); - } - } - - public void initSchemaCommandConfig() { - if (schemaCommandConfig == null) { - schemaCommandConfig = new CommandConfig(); - } - } - - public void initCommandInvoker() { - if (commandInvoker == null) { - commandInvoker = new DefaultCommandInvoker(); - } - } - - public void initCommandInterceptors() { - if (commandInterceptors == null) { - commandInterceptors = new ArrayList<>(); - if (customPreCommandInterceptors != null) { - commandInterceptors.addAll(customPreCommandInterceptors); - } - commandInterceptors.addAll(getDefaultCommandInterceptors()); - if (customPostCommandInterceptors != null) { - commandInterceptors.addAll(customPostCommandInterceptors); - } - commandInterceptors.add(commandInvoker); - } - } - - public Collection getDefaultCommandInterceptors() { - if (defaultCommandInterceptors == null) { - List interceptors = new ArrayList<>(); - interceptors.add(new LogInterceptor()); - - if (DATABASE_TYPE_COCKROACHDB.equals(databaseType)) { - interceptors.add(new CrDbRetryInterceptor()); - } - - CommandInterceptor transactionInterceptor = createTransactionInterceptor(); - if (transactionInterceptor != null) { - interceptors.add(transactionInterceptor); - } - - if (commandContextFactory != null) { - String engineCfgKey = getEngineCfgKey(); - CommandContextInterceptor commandContextInterceptor = new CommandContextInterceptor(commandContextFactory, - classLoader, useClassForNameClassLoading, clock, objectMapper); - engineConfigurations.put(engineCfgKey, this); - commandContextInterceptor.setEngineCfgKey(engineCfgKey); - commandContextInterceptor.setEngineConfigurations(engineConfigurations); - interceptors.add(commandContextInterceptor); - } - - if (transactionContextFactory != null) { - interceptors.add(new TransactionContextInterceptor(transactionContextFactory)); - } - - List additionalCommandInterceptors = getAdditionalDefaultCommandInterceptors(); - if (additionalCommandInterceptors != null) { - interceptors.addAll(additionalCommandInterceptors); - } - - defaultCommandInterceptors = interceptors; - } - return defaultCommandInterceptors; - } - - public abstract String getEngineCfgKey(); - - public abstract String getEngineScopeType(); - - public List getAdditionalDefaultCommandInterceptors() { - return null; - } - - public void initCommandExecutor() { - if (commandExecutor == null) { - CommandInterceptor first = initInterceptorChain(commandInterceptors); - commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first); - } - } - - public CommandInterceptor initInterceptorChain(List chain) { - if (chain == null || chain.isEmpty()) { - throw new FlowableException("invalid command interceptor chain configuration: " + chain); - } - for (int i = 0; i < chain.size() - 1; i++) { - chain.get(i).setNext(chain.get(i + 1)); - } - return chain.get(0); - } - - public abstract CommandInterceptor createTransactionInterceptor(); - - - public void initBeans() { - if (beans == null) { - beans = new HashMap<>(); - } - } - - // id generator - // ///////////////////////////////////////////////////////////// - - public void initIdGenerator() { - if (idGenerator == null) { - idGenerator = new StrongUuidGenerator(); - } - } - - public void initObjectMapper() { - if (objectMapper == null) { - objectMapper = new ObjectMapper(); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - } - } - - public void initClock() { - if (clock == null) { - clock = new DefaultClockImpl(); - } - } - - // Data managers /////////////////////////////////////////////////////////// - - public void initDataManagers() { - if (propertyDataManager == null) { - propertyDataManager = new MybatisPropertyDataManager(idGenerator); - } - - if (byteArrayDataManager == null) { - byteArrayDataManager = new MybatisByteArrayDataManager(idGenerator); - } - } - - // Entity managers ////////////////////////////////////////////////////////// - - public void initEntityManagers() { - if (propertyEntityManager == null) { - propertyEntityManager = new PropertyEntityManagerImpl(this, propertyDataManager); - } - - if (byteArrayEntityManager == null) { - byteArrayEntityManager = new ByteArrayEntityManagerImpl(byteArrayDataManager, getEngineCfgKey(), this::getEventDispatcher); - } - - if (tableDataManager == null) { - tableDataManager = new TableDataManagerImpl(this); - } - } - - // services - // ///////////////////////////////////////////////////////////////// - - protected void initService(Object service) { - if (service instanceof CommonEngineServiceImpl) { - ((CommonEngineServiceImpl) service).setCommandExecutor(commandExecutor); - } - } - - // myBatis SqlSessionFactory - // //////////////////////////////////////////////// - - public void initSessionFactories() { - if (sessionFactories == null) { - sessionFactories = new HashMap<>(); - - if (usingRelationalDatabase) { - initDbSqlSessionFactory(); - } - - addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class)); - - if (isLoggingSessionEnabled()) { - if (!sessionFactories.containsKey(LoggingSession.class)) { - LoggingSessionFactory loggingSessionFactory = new LoggingSessionFactory(); - loggingSessionFactory.setLoggingListener(loggingListener); - loggingSessionFactory.setObjectMapper(objectMapper); - sessionFactories.put(LoggingSession.class, loggingSessionFactory); - } - } - - commandContextFactory.setSessionFactories(sessionFactories); - - } else { - if (usingRelationalDatabase) { - initDbSqlSessionFactoryEntitySettings(); - } - } - - if (customSessionFactories != null) { - for (SessionFactory sessionFactory : customSessionFactories) { - addSessionFactory(sessionFactory); - } - } - } - - public void initDbSqlSessionFactory() { - if (dbSqlSessionFactory == null) { - dbSqlSessionFactory = createDbSqlSessionFactory(); - } - dbSqlSessionFactory.setDatabaseType(databaseType); - dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory); - dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed); - dbSqlSessionFactory.setDatabaseTablePrefix(databaseTablePrefix); - dbSqlSessionFactory.setTablePrefixIsSchema(tablePrefixIsSchema); - dbSqlSessionFactory.setDatabaseCatalog(databaseCatalog); - dbSqlSessionFactory.setDatabaseSchema(databaseSchema); - dbSqlSessionFactory.setMaxNrOfStatementsInBulkInsert(maxNrOfStatementsInBulkInsert); - - initDbSqlSessionFactoryEntitySettings(); - - addSessionFactory(dbSqlSessionFactory); - } - - public DbSqlSessionFactory createDbSqlSessionFactory() { - return new DbSqlSessionFactory(usePrefixId); - } - - protected abstract void initDbSqlSessionFactoryEntitySettings(); - - protected void defaultInitDbSqlSessionFactoryEntitySettings(List> insertOrder, List> deleteOrder) { - if (insertOrder != null) { - for (Class clazz : insertOrder) { - dbSqlSessionFactory.getInsertionOrder().add(clazz); - - if (isBulkInsertEnabled) { - dbSqlSessionFactory.getBulkInserteableEntityClasses().add(clazz); - } - } - } - - if (deleteOrder != null) { - for (Class clazz : deleteOrder) { - dbSqlSessionFactory.getDeletionOrder().add(clazz); - } - } - } - - public void initTransactionFactory() { - if (transactionFactory == null) { - if (transactionsExternallyManaged) { - transactionFactory = new ManagedTransactionFactory(); - Properties properties = new Properties(); - properties.put("closeConnection", "false"); - this.transactionFactory.setProperties(properties); - } else { - transactionFactory = new JdbcTransactionFactory(); - } - } - } - - public void initSqlSessionFactory() { - if (sqlSessionFactory == null) { - InputStream inputStream = null; - try { - inputStream = getMyBatisXmlConfigurationStream(); - - Environment environment = new Environment("default", transactionFactory, dataSource); - Reader reader = new InputStreamReader(inputStream); - Properties properties = new Properties(); - properties.put("prefix", databaseTablePrefix); - - String wildcardEscapeClause = ""; - if ((databaseWildcardEscapeCharacter != null) && (databaseWildcardEscapeCharacter.length() != 0)) { - wildcardEscapeClause = " escape '" + databaseWildcardEscapeCharacter + "'"; - } - properties.put("wildcardEscapeClause", wildcardEscapeClause); - - // set default properties - properties.put("limitBefore", ""); - properties.put("limitAfter", ""); - properties.put("limitBetween", ""); - properties.put("limitBeforeNativeQuery", ""); - properties.put("limitAfterNativeQuery", ""); - properties.put("blobType", "BLOB"); - properties.put("boolValue", "TRUE"); - - if (databaseType != null) { - properties.load(getResourceAsStream(pathToEngineDbProperties())); - } - - Configuration configuration = initMybatisConfiguration(environment, reader, properties); - sqlSessionFactory = new DefaultSqlSessionFactory(configuration); - - } catch (Exception e) { - throw new FlowableException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e); - } finally { - IoUtil.closeSilently(inputStream); - } - } else { - // This is needed when the SQL Session Factory is created by another engine. - // When custom XML Mappers are registered with this engine they need to be loaded in the configuration as well - applyCustomMybatisCustomizations(sqlSessionFactory.getConfiguration()); - } - } - - public String pathToEngineDbProperties() { - return "org/flowable/common/db/properties/" + databaseType + ".properties"; - } - - public Configuration initMybatisConfiguration(Environment environment, Reader reader, Properties properties) { - XMLConfigBuilder parser = new XMLConfigBuilder(reader, "", properties); - Configuration configuration = parser.getConfiguration(); - - if (databaseType != null) { - configuration.setDatabaseId(databaseType); - } - - configuration.setEnvironment(environment); - - initMybatisTypeHandlers(configuration); - initCustomMybatisInterceptors(configuration); - if (isEnableLogSqlExecutionTime()) { - initMyBatisLogSqlExecutionTimePlugin(configuration); - } - - configuration = parseMybatisConfiguration(parser); - return configuration; - } - - public void initCustomMybatisMappers(Configuration configuration) { - if (getCustomMybatisMappers() != null) { - for (Class clazz : getCustomMybatisMappers()) { - if (!configuration.hasMapper(clazz)) { - configuration.addMapper(clazz); - } - } - } - } - - public void initMybatisTypeHandlers(Configuration configuration) { - // When mapping into Map there is currently a problem with MyBatis. - // It will return objects which are driver specific. - // Therefore we are registering the mappings between Object.class and the specific jdbc type here. - // see https://github.com/mybatis/mybatis-3/issues/2216 for more info - TypeHandlerRegistry handlerRegistry = configuration.getTypeHandlerRegistry(); - - handlerRegistry.register(Object.class, JdbcType.BOOLEAN, new BooleanTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.BIT, new BooleanTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.TINYINT, new ByteTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.SMALLINT, new ShortTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.INTEGER, new IntegerTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.FLOAT, new FloatTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.DOUBLE, new DoubleTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.CHAR, new StringTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.CLOB, new ClobTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.VARCHAR, new StringTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new StringTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new NStringTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.NCHAR, new NStringTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.NCLOB, new NClobTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.BIGINT, new LongTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.REAL, new BigDecimalTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.DECIMAL, new BigDecimalTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.NUMERIC, new BigDecimalTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.BLOB, new BlobInputStreamTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.LONGVARBINARY, new BlobTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.DATE, new DateOnlyTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.TIME, new TimeOnlyTypeHandler()); - handlerRegistry.register(Object.class, JdbcType.TIMESTAMP, new DateTypeHandler()); - - handlerRegistry.register(Object.class, JdbcType.SQLXML, new SqlxmlTypeHandler()); - } - - public void initCustomMybatisInterceptors(Configuration configuration) { - if (customMybatisInterceptors!=null){ - for (Interceptor interceptor :customMybatisInterceptors){ - configuration.addInterceptor(interceptor); - } - } - } - - public void initMyBatisLogSqlExecutionTimePlugin(Configuration configuration) { - configuration.addInterceptor(new LogSqlExecutionTimePlugin()); - } - - public Configuration parseMybatisConfiguration(XMLConfigBuilder parser) { - Configuration configuration = parser.parse(); - - applyCustomMybatisCustomizations(configuration); - return configuration; - } - - protected void applyCustomMybatisCustomizations(Configuration configuration) { - initCustomMybatisMappers(configuration); - - if (dependentEngineMybatisTypeAliasConfigs != null) { - for (MybatisTypeAliasConfigurator typeAliasConfig : dependentEngineMybatisTypeAliasConfigs) { - typeAliasConfig.configure(configuration.getTypeAliasRegistry()); - } - } - if (dependentEngineMybatisTypeHandlerConfigs != null) { - for (MybatisTypeHandlerConfigurator typeHandlerConfig : dependentEngineMybatisTypeHandlerConfigs) { - typeHandlerConfig.configure(configuration.getTypeHandlerRegistry()); - } - } - - parseDependentEngineMybatisXMLMappers(configuration); - parseCustomMybatisXMLMappers(configuration); - } - - public void parseCustomMybatisXMLMappers(Configuration configuration) { - if (getCustomMybatisXMLMappers() != null) { - for (String resource : getCustomMybatisXMLMappers()) { - parseMybatisXmlMapping(configuration, resource); - } - } - } - - public void parseDependentEngineMybatisXMLMappers(Configuration configuration) { - if (getDependentEngineMyBatisXmlMappers() != null) { - for (String resource : getDependentEngineMyBatisXmlMappers()) { - parseMybatisXmlMapping(configuration, resource); - } - } - } - - protected void parseMybatisXmlMapping(Configuration configuration, String resource) { - // see XMLConfigBuilder.mapperElement() - XMLMapperBuilder mapperParser = new XMLMapperBuilder(getResourceAsStream(resource), configuration, resource, configuration.getSqlFragments()); - mapperParser.parse(); - } - - protected InputStream getResourceAsStream(String resource) { - ClassLoader classLoader = getClassLoader(); - if (classLoader != null) { - return getClassLoader().getResourceAsStream(resource); - } else { - return this.getClass().getClassLoader().getResourceAsStream(resource); - } - } - - public void setMybatisMappingFile(String file) { - this.mybatisMappingFile = file; - } - - public String getMybatisMappingFile() { - return mybatisMappingFile; - } - - public abstract InputStream getMyBatisXmlConfigurationStream(); - - public void initConfigurators() { - - allConfigurators = new ArrayList<>(); - allConfigurators.addAll(getEngineSpecificEngineConfigurators()); - - // Configurators that are explicitly added to the config - if (configurators != null) { - allConfigurators.addAll(configurators); - } - - // Auto discovery through ServiceLoader - if (enableConfiguratorServiceLoader) { - ClassLoader classLoader = getClassLoader(); - if (classLoader == null) { - classLoader = ReflectUtil.getClassLoader(); - } - - ServiceLoader configuratorServiceLoader = ServiceLoader.load(EngineConfigurator.class, classLoader); - int nrOfServiceLoadedConfigurators = 0; - for (EngineConfigurator configurator : configuratorServiceLoader) { - allConfigurators.add(configurator); - nrOfServiceLoadedConfigurators++; - } - - if (nrOfServiceLoadedConfigurators > 0) { - logger.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators, nrOfServiceLoadedConfigurators > 1 ? "s" : ""); - } - - if (!allConfigurators.isEmpty()) { - - // Order them according to the priorities (useful for dependent - // configurator) - allConfigurators.sort(new Comparator() { - - @Override - public int compare(EngineConfigurator configurator1, EngineConfigurator configurator2) { - int priority1 = configurator1.getPriority(); - int priority2 = configurator2.getPriority(); - - if (priority1 < priority2) { - return -1; - } else if (priority1 > priority2) { - return 1; - } - return 0; - } - }); - - // Execute the configurators - logger.info("Found {} Engine Configurators in total:", allConfigurators.size()); - for (EngineConfigurator configurator : allConfigurators) { - logger.info("{} (priority:{})", configurator.getClass(), configurator.getPriority()); - } - - } - - } - } - - public void close() { - if (forceCloseMybatisConnectionPool && dataSource instanceof PooledDataSource) { - /* - * When the datasource is created by a Flowable engine (i.e. it's an instance of PooledDataSource), - * the connection pool needs to be closed when closing the engine. - * Note that calling forceCloseAll() multiple times (as is the case when running with multiple engine) is ok. - */ - ((PooledDataSource) dataSource).forceCloseAll(); - } - } - - protected List getEngineSpecificEngineConfigurators() { - // meant to be overridden if needed - return Collections.emptyList(); - } - - public void configuratorsBeforeInit() { - for (EngineConfigurator configurator : allConfigurators) { - logger.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority()); - configurator.beforeInit(this); - } - } - - public void configuratorsAfterInit() { - for (EngineConfigurator configurator : allConfigurators) { - logger.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority()); - configurator.configure(this); - } - } - - public LockManager getLockManager(String lockName) { - return new LockManagerImpl(commandExecutor, lockName, getLockPollRate(), getEngineCfgKey()); - } - - // getters and setters - // ////////////////////////////////////////////////////// - - public abstract String getEngineName(); - - public ClassLoader getClassLoader() { - return classLoader; - } - - public AbstractEngineConfiguration setClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - return this; - } - - public boolean isUseClassForNameClassLoading() { - return useClassForNameClassLoading; - } - - public AbstractEngineConfiguration setUseClassForNameClassLoading(boolean useClassForNameClassLoading) { - this.useClassForNameClassLoading = useClassForNameClassLoading; - return this; - } - - public void addEngineLifecycleListener(EngineLifecycleListener engineLifecycleListener) { - if (this.engineLifecycleListeners == null) { - this.engineLifecycleListeners = new ArrayList<>(); - } - this.engineLifecycleListeners.add(engineLifecycleListener); - } - - public List getEngineLifecycleListeners() { - return engineLifecycleListeners; - } - - public AbstractEngineConfiguration setEngineLifecycleListeners(List engineLifecycleListeners) { - this.engineLifecycleListeners = engineLifecycleListeners; - return this; - } - - public String getDatabaseType() { - return databaseType; - } - - public AbstractEngineConfiguration setDatabaseType(String databaseType) { - this.databaseType = databaseType; - return this; - } - - public DataSource getDataSource() { - return dataSource; - } - - public AbstractEngineConfiguration setDataSource(DataSource dataSource) { - this.dataSource = dataSource; - return this; - } - - public SchemaManager getSchemaManager() { - return schemaManager; - } - - public AbstractEngineConfiguration setSchemaManager(SchemaManager schemaManager) { - this.schemaManager = schemaManager; - return this; - } - - public SchemaManager getCommonSchemaManager() { - return commonSchemaManager; - } - - public AbstractEngineConfiguration setCommonSchemaManager(SchemaManager commonSchemaManager) { - this.commonSchemaManager = commonSchemaManager; - return this; - } - - public Command getSchemaManagementCmd() { - return schemaManagementCmd; - } - - public AbstractEngineConfiguration setSchemaManagementCmd(Command schemaManagementCmd) { - this.schemaManagementCmd = schemaManagementCmd; - return this; - } - - public String getJdbcDriver() { - return jdbcDriver; - } - - public AbstractEngineConfiguration setJdbcDriver(String jdbcDriver) { - this.jdbcDriver = jdbcDriver; - return this; - } - - public String getJdbcUrl() { - return jdbcUrl; - } - - public AbstractEngineConfiguration setJdbcUrl(String jdbcUrl) { - this.jdbcUrl = jdbcUrl; - return this; - } - - public String getJdbcUsername() { - return jdbcUsername; - } - - public AbstractEngineConfiguration setJdbcUsername(String jdbcUsername) { - this.jdbcUsername = jdbcUsername; - return this; - } - - public String getJdbcPassword() { - return jdbcPassword; - } - - public AbstractEngineConfiguration setJdbcPassword(String jdbcPassword) { - this.jdbcPassword = jdbcPassword; - return this; - } - - public int getJdbcMaxActiveConnections() { - return jdbcMaxActiveConnections; - } - - public AbstractEngineConfiguration setJdbcMaxActiveConnections(int jdbcMaxActiveConnections) { - this.jdbcMaxActiveConnections = jdbcMaxActiveConnections; - return this; - } - - public int getJdbcMaxIdleConnections() { - return jdbcMaxIdleConnections; - } - - public AbstractEngineConfiguration setJdbcMaxIdleConnections(int jdbcMaxIdleConnections) { - this.jdbcMaxIdleConnections = jdbcMaxIdleConnections; - return this; - } - - public int getJdbcMaxCheckoutTime() { - return jdbcMaxCheckoutTime; - } - - public AbstractEngineConfiguration setJdbcMaxCheckoutTime(int jdbcMaxCheckoutTime) { - this.jdbcMaxCheckoutTime = jdbcMaxCheckoutTime; - return this; - } - - public int getJdbcMaxWaitTime() { - return jdbcMaxWaitTime; - } - - public AbstractEngineConfiguration setJdbcMaxWaitTime(int jdbcMaxWaitTime) { - this.jdbcMaxWaitTime = jdbcMaxWaitTime; - return this; - } - - public boolean isJdbcPingEnabled() { - return jdbcPingEnabled; - } - - public AbstractEngineConfiguration setJdbcPingEnabled(boolean jdbcPingEnabled) { - this.jdbcPingEnabled = jdbcPingEnabled; - return this; - } - - public int getJdbcPingConnectionNotUsedFor() { - return jdbcPingConnectionNotUsedFor; - } - - public AbstractEngineConfiguration setJdbcPingConnectionNotUsedFor(int jdbcPingConnectionNotUsedFor) { - this.jdbcPingConnectionNotUsedFor = jdbcPingConnectionNotUsedFor; - return this; - } - - public int getJdbcDefaultTransactionIsolationLevel() { - return jdbcDefaultTransactionIsolationLevel; - } - - public AbstractEngineConfiguration setJdbcDefaultTransactionIsolationLevel(int jdbcDefaultTransactionIsolationLevel) { - this.jdbcDefaultTransactionIsolationLevel = jdbcDefaultTransactionIsolationLevel; - return this; - } - - public String getJdbcPingQuery() { - return jdbcPingQuery; - } - - public AbstractEngineConfiguration setJdbcPingQuery(String jdbcPingQuery) { - this.jdbcPingQuery = jdbcPingQuery; - return this; - } - - public String getDataSourceJndiName() { - return dataSourceJndiName; - } - - public AbstractEngineConfiguration setDataSourceJndiName(String dataSourceJndiName) { - this.dataSourceJndiName = dataSourceJndiName; - return this; - } - - public CommandConfig getSchemaCommandConfig() { - return schemaCommandConfig; - } - - public AbstractEngineConfiguration setSchemaCommandConfig(CommandConfig schemaCommandConfig) { - this.schemaCommandConfig = schemaCommandConfig; - return this; - } - - public boolean isTransactionsExternallyManaged() { - return transactionsExternallyManaged; - } - - public AbstractEngineConfiguration setTransactionsExternallyManaged(boolean transactionsExternallyManaged) { - this.transactionsExternallyManaged = transactionsExternallyManaged; - return this; - } - - public Map getBeans() { - return beans; - } - - public AbstractEngineConfiguration setBeans(Map beans) { - this.beans = beans; - return this; - } - - public IdGenerator getIdGenerator() { - return idGenerator; - } - - public AbstractEngineConfiguration setIdGenerator(IdGenerator idGenerator) { - this.idGenerator = idGenerator; - return this; - } - - public boolean isUsePrefixId() { - return usePrefixId; - } - - public AbstractEngineConfiguration setUsePrefixId(boolean usePrefixId) { - this.usePrefixId = usePrefixId; - return this; - } - - public String getXmlEncoding() { - return xmlEncoding; - } - - public AbstractEngineConfiguration setXmlEncoding(String xmlEncoding) { - this.xmlEncoding = xmlEncoding; - return this; - } - - public CommandConfig getDefaultCommandConfig() { - return defaultCommandConfig; - } - - public AbstractEngineConfiguration setDefaultCommandConfig(CommandConfig defaultCommandConfig) { - this.defaultCommandConfig = defaultCommandConfig; - return this; - } - - public CommandExecutor getCommandExecutor() { - return commandExecutor; - } - - public AbstractEngineConfiguration setCommandExecutor(CommandExecutor commandExecutor) { - this.commandExecutor = commandExecutor; - return this; - } - - public CommandContextFactory getCommandContextFactory() { - return commandContextFactory; - } - - public AbstractEngineConfiguration setCommandContextFactory(CommandContextFactory commandContextFactory) { - this.commandContextFactory = commandContextFactory; - return this; - } - - public CommandInterceptor getCommandInvoker() { - return commandInvoker; - } - - public AbstractEngineConfiguration setCommandInvoker(CommandInterceptor commandInvoker) { - this.commandInvoker = commandInvoker; - return this; - } - - public AgendaOperationRunner getAgendaOperationRunner() { - return agendaOperationRunner; - } - - public AbstractEngineConfiguration setAgendaOperationRunner(AgendaOperationRunner agendaOperationRunner) { - this.agendaOperationRunner = agendaOperationRunner; - return this; - } - - public Collection getAgendaOperationExecutionListeners() { - return agendaOperationExecutionListeners; - } - - public AbstractEngineConfiguration addAgendaOperationExecutionListener(AgendaOperationExecutionListener listener) { - if (this.agendaOperationExecutionListeners == null) { - this.agendaOperationExecutionListeners = new ArrayList<>(); - } - this.agendaOperationExecutionListeners.add(listener); - return this; - } - - public AbstractEngineConfiguration setAgendaOperationExecutionListeners(Collection agendaOperationExecutionListeners) { - this.agendaOperationExecutionListeners = agendaOperationExecutionListeners; - return this; - } - - public List getCustomPreCommandInterceptors() { - return customPreCommandInterceptors; - } - - public AbstractEngineConfiguration addCustomPreCommandInterceptor(CommandInterceptor commandInterceptor) { - if (this.customPreCommandInterceptors == null) { - this.customPreCommandInterceptors = new ArrayList<>(); - } - this.customPreCommandInterceptors.add(commandInterceptor); - return this; - } - - public AbstractEngineConfiguration setCustomPreCommandInterceptors(List customPreCommandInterceptors) { - this.customPreCommandInterceptors = customPreCommandInterceptors; - return this; - } - - public List getCustomPostCommandInterceptors() { - return customPostCommandInterceptors; - } - - public AbstractEngineConfiguration addCustomPostCommandInterceptor(CommandInterceptor commandInterceptor) { - if (this.customPostCommandInterceptors == null) { - this.customPostCommandInterceptors = new ArrayList<>(); - } - this.customPostCommandInterceptors.add(commandInterceptor); - return this; - } - - public AbstractEngineConfiguration setCustomPostCommandInterceptors(List customPostCommandInterceptors) { - this.customPostCommandInterceptors = customPostCommandInterceptors; - return this; - } - - public List getCommandInterceptors() { - return commandInterceptors; - } - - public AbstractEngineConfiguration setCommandInterceptors(List commandInterceptors) { - this.commandInterceptors = commandInterceptors; - return this; - } - - public Map getEngineConfigurations() { - return engineConfigurations; - } - - public AbstractEngineConfiguration setEngineConfigurations(Map engineConfigurations) { - this.engineConfigurations = engineConfigurations; - return this; - } - - public void addEngineConfiguration(String key, String scopeType, AbstractEngineConfiguration engineConfiguration) { - if (engineConfigurations == null) { - engineConfigurations = new HashMap<>(); - } - engineConfigurations.put(key, engineConfiguration); - engineConfigurations.put(scopeType, engineConfiguration); - } - - public Map getServiceConfigurations() { - return serviceConfigurations; - } - - public AbstractEngineConfiguration setServiceConfigurations(Map serviceConfigurations) { - this.serviceConfigurations = serviceConfigurations; - return this; - } - - public void addServiceConfiguration(String key, AbstractServiceConfiguration serviceConfiguration) { - if (serviceConfigurations == null) { - serviceConfigurations = new HashMap<>(); - } - serviceConfigurations.put(key, serviceConfiguration); - } - - public Map getEventRegistryEventConsumers() { - return eventRegistryEventConsumers; - } - - public AbstractEngineConfiguration setEventRegistryEventConsumers(Map eventRegistryEventConsumers) { - this.eventRegistryEventConsumers = eventRegistryEventConsumers; - return this; - } - - public void addEventRegistryEventConsumer(String key, EventRegistryEventConsumer eventRegistryEventConsumer) { - if (eventRegistryEventConsumers == null) { - eventRegistryEventConsumers = new HashMap<>(); - } - eventRegistryEventConsumers.put(key, eventRegistryEventConsumer); - } - - public AbstractEngineConfiguration setDefaultCommandInterceptors(Collection defaultCommandInterceptors) { - this.defaultCommandInterceptors = defaultCommandInterceptors; - return this; - } - - public SqlSessionFactory getSqlSessionFactory() { - return sqlSessionFactory; - } - - public AbstractEngineConfiguration setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { - this.sqlSessionFactory = sqlSessionFactory; - return this; - } - - public boolean isDbHistoryUsed() { - return isDbHistoryUsed; - } - - public AbstractEngineConfiguration setDbHistoryUsed(boolean isDbHistoryUsed) { - this.isDbHistoryUsed = isDbHistoryUsed; - return this; - } - - public DbSqlSessionFactory getDbSqlSessionFactory() { - return dbSqlSessionFactory; - } - - public AbstractEngineConfiguration setDbSqlSessionFactory(DbSqlSessionFactory dbSqlSessionFactory) { - this.dbSqlSessionFactory = dbSqlSessionFactory; - return this; - } - - public TransactionFactory getTransactionFactory() { - return transactionFactory; - } - - public AbstractEngineConfiguration setTransactionFactory(TransactionFactory transactionFactory) { - this.transactionFactory = transactionFactory; - return this; - } - - public TransactionContextFactory getTransactionContextFactory() { - return transactionContextFactory; - } - - public AbstractEngineConfiguration setTransactionContextFactory(TransactionContextFactory transactionContextFactory) { - this.transactionContextFactory = transactionContextFactory; - return this; - } - - public int getMaxNrOfStatementsInBulkInsert() { - return maxNrOfStatementsInBulkInsert; - } - - public AbstractEngineConfiguration setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) { - this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert; - return this; - } - - public boolean isBulkInsertEnabled() { - return isBulkInsertEnabled; - } - - public AbstractEngineConfiguration setBulkInsertEnabled(boolean isBulkInsertEnabled) { - this.isBulkInsertEnabled = isBulkInsertEnabled; - return this; - } - - public Set> getCustomMybatisMappers() { - return customMybatisMappers; - } - - public AbstractEngineConfiguration setCustomMybatisMappers(Set> customMybatisMappers) { - this.customMybatisMappers = customMybatisMappers; - return this; - } - - public Set getCustomMybatisXMLMappers() { - return customMybatisXMLMappers; - } - - public AbstractEngineConfiguration setCustomMybatisXMLMappers(Set customMybatisXMLMappers) { - this.customMybatisXMLMappers = customMybatisXMLMappers; - return this; - } - - public Set getDependentEngineMyBatisXmlMappers() { - return dependentEngineMyBatisXmlMappers; - } - - public AbstractEngineConfiguration setCustomMybatisInterceptors(List customMybatisInterceptors) { - this.customMybatisInterceptors = customMybatisInterceptors; - return this; - } - - public List getCustomMybatisInterceptors() { - return customMybatisInterceptors; - } - - public AbstractEngineConfiguration setDependentEngineMyBatisXmlMappers(Set dependentEngineMyBatisXmlMappers) { - this.dependentEngineMyBatisXmlMappers = dependentEngineMyBatisXmlMappers; - return this; - } - - public List getDependentEngineMybatisTypeAliasConfigs() { - return dependentEngineMybatisTypeAliasConfigs; - } - - public AbstractEngineConfiguration setDependentEngineMybatisTypeAliasConfigs(List dependentEngineMybatisTypeAliasConfigs) { - this.dependentEngineMybatisTypeAliasConfigs = dependentEngineMybatisTypeAliasConfigs; - return this; - } - - public List getDependentEngineMybatisTypeHandlerConfigs() { - return dependentEngineMybatisTypeHandlerConfigs; - } - - public AbstractEngineConfiguration setDependentEngineMybatisTypeHandlerConfigs(List dependentEngineMybatisTypeHandlerConfigs) { - this.dependentEngineMybatisTypeHandlerConfigs = dependentEngineMybatisTypeHandlerConfigs; - return this; - } - - public List getCustomSessionFactories() { - return customSessionFactories; - } - - public AbstractEngineConfiguration addCustomSessionFactory(SessionFactory sessionFactory) { - if (customSessionFactories == null) { - customSessionFactories = new ArrayList<>(); - } - customSessionFactories.add(sessionFactory); - return this; - } - - public AbstractEngineConfiguration setCustomSessionFactories(List customSessionFactories) { - this.customSessionFactories = customSessionFactories; - return this; - } - - public boolean isUsingRelationalDatabase() { - return usingRelationalDatabase; - } - - public AbstractEngineConfiguration setUsingRelationalDatabase(boolean usingRelationalDatabase) { - this.usingRelationalDatabase = usingRelationalDatabase; - return this; - } - - public boolean isUsingSchemaMgmt() { - return usingSchemaMgmt; - } - - public AbstractEngineConfiguration setUsingSchemaMgmt(boolean usingSchema) { - this.usingSchemaMgmt = usingSchema; - return this; - } - - public String getDatabaseTablePrefix() { - return databaseTablePrefix; - } - - public AbstractEngineConfiguration setDatabaseTablePrefix(String databaseTablePrefix) { - this.databaseTablePrefix = databaseTablePrefix; - return this; - } - - public String getDatabaseWildcardEscapeCharacter() { - return databaseWildcardEscapeCharacter; - } - - public AbstractEngineConfiguration setDatabaseWildcardEscapeCharacter(String databaseWildcardEscapeCharacter) { - this.databaseWildcardEscapeCharacter = databaseWildcardEscapeCharacter; - return this; - } - - public String getDatabaseCatalog() { - return databaseCatalog; - } - - public AbstractEngineConfiguration setDatabaseCatalog(String databaseCatalog) { - this.databaseCatalog = databaseCatalog; - return this; - } - - public String getDatabaseSchema() { - return databaseSchema; - } - - public AbstractEngineConfiguration setDatabaseSchema(String databaseSchema) { - this.databaseSchema = databaseSchema; - return this; - } - - public boolean isTablePrefixIsSchema() { - return tablePrefixIsSchema; - } - - public AbstractEngineConfiguration setTablePrefixIsSchema(boolean tablePrefixIsSchema) { - this.tablePrefixIsSchema = tablePrefixIsSchema; - return this; - } - - public boolean isAlwaysLookupLatestDefinitionVersion() { - return alwaysLookupLatestDefinitionVersion; - } - - public AbstractEngineConfiguration setAlwaysLookupLatestDefinitionVersion(boolean alwaysLookupLatestDefinitionVersion) { - this.alwaysLookupLatestDefinitionVersion = alwaysLookupLatestDefinitionVersion; - return this; - } - - public boolean isFallbackToDefaultTenant() { - return fallbackToDefaultTenant; - } - - public AbstractEngineConfiguration setFallbackToDefaultTenant(boolean fallbackToDefaultTenant) { - this.fallbackToDefaultTenant = fallbackToDefaultTenant; - return this; - } - - public AbstractEngineConfiguration setDefaultTenantValue(String defaultTenantValue) { - this.defaultTenantProvider = (tenantId, scope, scopeKey) -> defaultTenantValue; - return this; - } - - public DefaultTenantProvider getDefaultTenantProvider() { - return defaultTenantProvider; - } - - public AbstractEngineConfiguration setDefaultTenantProvider(DefaultTenantProvider defaultTenantProvider) { - this.defaultTenantProvider = defaultTenantProvider; - return this; - } - - public boolean isEnableLogSqlExecutionTime() { - return enableLogSqlExecutionTime; - } - - public void setEnableLogSqlExecutionTime(boolean enableLogSqlExecutionTime) { - this.enableLogSqlExecutionTime = enableLogSqlExecutionTime; - } - - public Map, SessionFactory> getSessionFactories() { - return sessionFactories; - } - - public AbstractEngineConfiguration setSessionFactories(Map, SessionFactory> sessionFactories) { - this.sessionFactories = sessionFactories; - return this; - } - - public String getDatabaseSchemaUpdate() { - return databaseSchemaUpdate; - } - - public AbstractEngineConfiguration setDatabaseSchemaUpdate(String databaseSchemaUpdate) { - this.databaseSchemaUpdate = databaseSchemaUpdate; - return this; - } - - public boolean isUseLockForDatabaseSchemaUpdate() { - return useLockForDatabaseSchemaUpdate; - } - - public AbstractEngineConfiguration setUseLockForDatabaseSchemaUpdate(boolean useLockForDatabaseSchemaUpdate) { - this.useLockForDatabaseSchemaUpdate = useLockForDatabaseSchemaUpdate; - return this; - } - - public boolean isEnableEventDispatcher() { - return enableEventDispatcher; - } - - public AbstractEngineConfiguration setEnableEventDispatcher(boolean enableEventDispatcher) { - this.enableEventDispatcher = enableEventDispatcher; - return this; - } - - public FlowableEventDispatcher getEventDispatcher() { - return eventDispatcher; - } - - public AbstractEngineConfiguration setEventDispatcher(FlowableEventDispatcher eventDispatcher) { - this.eventDispatcher = eventDispatcher; - return this; - } - - public List getEventListeners() { - return eventListeners; - } - - public AbstractEngineConfiguration setEventListeners(List eventListeners) { - this.eventListeners = eventListeners; - return this; - } - - public Map> getTypedEventListeners() { - return typedEventListeners; - } - - public AbstractEngineConfiguration setTypedEventListeners(Map> typedEventListeners) { - this.typedEventListeners = typedEventListeners; - return this; - } - - public List getAdditionalEventDispatchActions() { - return additionalEventDispatchActions; - } - - public AbstractEngineConfiguration setAdditionalEventDispatchActions(List additionalEventDispatchActions) { - this.additionalEventDispatchActions = additionalEventDispatchActions; - return this; - } - - public void initEventDispatcher() { - if (this.eventDispatcher == null) { - this.eventDispatcher = new FlowableEventDispatcherImpl(); - } - - initAdditionalEventDispatchActions(); - - this.eventDispatcher.setEnabled(enableEventDispatcher); - - initEventListeners(); - initTypedEventListeners(); - } - - protected void initEventListeners() { - if (eventListeners != null) { - for (FlowableEventListener listenerToAdd : eventListeners) { - this.eventDispatcher.addEventListener(listenerToAdd); - } - } - } - - protected void initAdditionalEventDispatchActions() { - if (this.additionalEventDispatchActions == null) { - this.additionalEventDispatchActions = new ArrayList<>(); - } - } - - protected void initTypedEventListeners() { - if (typedEventListeners != null) { - for (Map.Entry> listenersToAdd : typedEventListeners.entrySet()) { - // Extract types from the given string - FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(listenersToAdd.getKey()); - - for (FlowableEventListener listenerToAdd : listenersToAdd.getValue()) { - this.eventDispatcher.addEventListener(listenerToAdd, types); - } - } - } - } - - public boolean isLoggingSessionEnabled() { - return loggingListener != null; - } - - public LoggingListener getLoggingListener() { - return loggingListener; - } - - public void setLoggingListener(LoggingListener loggingListener) { - this.loggingListener = loggingListener; - } - - public Clock getClock() { - return clock; - } - - public AbstractEngineConfiguration setClock(Clock clock) { - this.clock = clock; - return this; - } - - public ObjectMapper getObjectMapper() { - return objectMapper; - } - - public AbstractEngineConfiguration setObjectMapper(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; - return this; - } - - public int getMaxLengthString() { - if (maxLengthStringVariableType == -1) { - if ("oracle".equalsIgnoreCase(databaseType)) { - return DEFAULT_ORACLE_MAX_LENGTH_STRING; - } else { - return DEFAULT_GENERIC_MAX_LENGTH_STRING; - } - } else { - return maxLengthStringVariableType; - } - } - - public int getMaxLengthStringVariableType() { - return maxLengthStringVariableType; - } - - public AbstractEngineConfiguration setMaxLengthStringVariableType(int maxLengthStringVariableType) { - this.maxLengthStringVariableType = maxLengthStringVariableType; - return this; - } - - public PropertyDataManager getPropertyDataManager() { - return propertyDataManager; - } - - public Duration getLockPollRate() { - return lockPollRate; - } - - public AbstractEngineConfiguration setLockPollRate(Duration lockPollRate) { - this.lockPollRate = lockPollRate; - return this; - } - - public Duration getSchemaLockWaitTime() { - return schemaLockWaitTime; - } - - public void setSchemaLockWaitTime(Duration schemaLockWaitTime) { - this.schemaLockWaitTime = schemaLockWaitTime; - } - - public AbstractEngineConfiguration setPropertyDataManager(PropertyDataManager propertyDataManager) { - this.propertyDataManager = propertyDataManager; - return this; - } - - public PropertyEntityManager getPropertyEntityManager() { - return propertyEntityManager; - } - - public AbstractEngineConfiguration setPropertyEntityManager(PropertyEntityManager propertyEntityManager) { - this.propertyEntityManager = propertyEntityManager; - return this; - } - - public ByteArrayDataManager getByteArrayDataManager() { - return byteArrayDataManager; - } - - public AbstractEngineConfiguration setByteArrayDataManager(ByteArrayDataManager byteArrayDataManager) { - this.byteArrayDataManager = byteArrayDataManager; - return this; - } - - public ByteArrayEntityManager getByteArrayEntityManager() { - return byteArrayEntityManager; - } - - public AbstractEngineConfiguration setByteArrayEntityManager(ByteArrayEntityManager byteArrayEntityManager) { - this.byteArrayEntityManager = byteArrayEntityManager; - return this; - } - - public TableDataManager getTableDataManager() { - return tableDataManager; - } - - public AbstractEngineConfiguration setTableDataManager(TableDataManager tableDataManager) { - this.tableDataManager = tableDataManager; - return this; - } - - public List getDeployers() { - return deployers; - } - - public AbstractEngineConfiguration setDeployers(List deployers) { - this.deployers = deployers; - return this; - } - - public List getCustomPreDeployers() { - return customPreDeployers; - } - - public AbstractEngineConfiguration setCustomPreDeployers(List customPreDeployers) { - this.customPreDeployers = customPreDeployers; - return this; - } - - public List getCustomPostDeployers() { - return customPostDeployers; - } - - public AbstractEngineConfiguration setCustomPostDeployers(List customPostDeployers) { - this.customPostDeployers = customPostDeployers; - return this; - } - - public boolean isEnableConfiguratorServiceLoader() { - return enableConfiguratorServiceLoader; - } - - public AbstractEngineConfiguration setEnableConfiguratorServiceLoader(boolean enableConfiguratorServiceLoader) { - this.enableConfiguratorServiceLoader = enableConfiguratorServiceLoader; - return this; - } - - public List getConfigurators() { - return configurators; - } - - public AbstractEngineConfiguration addConfigurator(EngineConfigurator configurator) { - if (configurators == null) { - configurators = new ArrayList<>(); - } - configurators.add(configurator); - return this; - } - - /** - * @return All {@link EngineConfigurator} instances. Will only contain values after init of the engine. - * Use the {@link #getConfigurators()} or {@link #addConfigurator(EngineConfigurator)} methods otherwise. - */ - public List getAllConfigurators() { - return allConfigurators; - } - - public AbstractEngineConfiguration setConfigurators(List configurators) { - this.configurators = configurators; - return this; - } - - public EngineConfigurator getIdmEngineConfigurator() { - return idmEngineConfigurator; - } - - public AbstractEngineConfiguration setIdmEngineConfigurator(EngineConfigurator idmEngineConfigurator) { - this.idmEngineConfigurator = idmEngineConfigurator; - return this; - } - - public EngineConfigurator getEventRegistryConfigurator() { - return eventRegistryConfigurator; - } - - public AbstractEngineConfiguration setEventRegistryConfigurator(EngineConfigurator eventRegistryConfigurator) { - this.eventRegistryConfigurator = eventRegistryConfigurator; - return this; - } - - public AbstractEngineConfiguration setForceCloseMybatisConnectionPool(boolean forceCloseMybatisConnectionPool) { - this.forceCloseMybatisConnectionPool = forceCloseMybatisConnectionPool; - return this; - } - - public boolean isForceCloseMybatisConnectionPool() { - return forceCloseMybatisConnectionPool; - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java deleted file mode 100644 index ed2f0c9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java +++ /dev/null @@ -1,354 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.flowable.common.engine.impl.db; - -import org.apache.ibatis.session.SqlSessionFactory; -import org.flowable.common.engine.api.FlowableException; -import org.flowable.common.engine.impl.context.Context; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.common.engine.impl.interceptor.Session; -import org.flowable.common.engine.impl.interceptor.SessionFactory; -import org.flowable.common.engine.impl.persistence.cache.EntityCache; -import org.flowable.common.engine.impl.persistence.entity.Entity; - -import java.sql.SQLException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author Tom Baeyens - * @author Joram Barrez - */ -public class DbSqlSessionFactory implements SessionFactory { - - protected Map> databaseSpecificStatements = new HashMap<>(); - - protected String databaseType; - protected String databaseTablePrefix = ""; - protected boolean tablePrefixIsSchema; - - protected String databaseCatalog; - protected String databaseSchema; - protected SqlSessionFactory sqlSessionFactory; - protected Map statementMappings; - - protected Map, String> insertStatements = new ConcurrentHashMap<>(); - protected Map, String> updateStatements = new ConcurrentHashMap<>(); - protected Map, String> deleteStatements = new ConcurrentHashMap<>(); - protected Map, String> selectStatements = new ConcurrentHashMap<>(); - - protected List> insertionOrder = new ArrayList<>(); - protected List> deletionOrder = new ArrayList<>(); - - protected boolean isDbHistoryUsed = true; - - protected Set> bulkInserteableEntityClasses = new HashSet<>(); - protected Map, String> bulkInsertStatements = new ConcurrentHashMap<>(); - - protected int maxNrOfStatementsInBulkInsert = 100; - - protected Map> logicalNameToClassMapping = new ConcurrentHashMap<>(); - - protected boolean usePrefixId; - - public DbSqlSessionFactory(boolean usePrefixId) { - this.usePrefixId = usePrefixId; - } - - @Override - public Class getSessionType() { - return DbSqlSession.class; - } - - @Override - public Session openSession(CommandContext commandContext) { - DbSqlSession dbSqlSession = createDbSqlSession(); - // 当å‰ç³»ç»Ÿé€‚é… dm,如果存在 schema 为空的情况,从 connection èŽ·å– - try { - if (getDatabaseSchema() == null || getDatabaseSchema().length() == 0){ - setDatabaseSchema(dbSqlSession.getSqlSession().getConnection().getSchema()); - } - dbSqlSession.getSqlSession().getConnection().getSchema(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - if (getDatabaseSchema() != null && getDatabaseSchema().length() > 0) { - try { - dbSqlSession.getSqlSession().getConnection().setSchema(getDatabaseSchema()); - } catch (SQLException e) { - throw new FlowableException("Could not set database schema on connection", e); - } - } - if (getDatabaseCatalog() != null && getDatabaseCatalog().length() > 0) { - try { - dbSqlSession.getSqlSession().getConnection().setCatalog(getDatabaseCatalog()); - } catch (SQLException e) { - throw new FlowableException("Could not set database catalog on connection", e); - } - } - if (dbSqlSession.getSqlSession().getConnection() == null) { - throw new FlowableException("Invalid dbSqlSession: no active connection found"); - } - return dbSqlSession; - } - - protected DbSqlSession createDbSqlSession() { - return new DbSqlSession(this, Context.getCommandContext().getSession(EntityCache.class)); - } - - // insert, update and delete statements - // ///////////////////////////////////// - - public String getInsertStatement(Entity object) { - return getStatement(object.getClass(), insertStatements, "insert"); - } - - public String getInsertStatement(Class clazz) { - return getStatement(clazz, insertStatements, "insert"); - } - - public String getUpdateStatement(Entity object) { - return getStatement(object.getClass(), updateStatements, "update"); - } - - public String getDeleteStatement(Class entityClass) { - return getStatement(entityClass, deleteStatements, "delete"); - } - - public String getSelectStatement(Class entityClass) { - return getStatement(entityClass, selectStatements, "select"); - } - - protected String getStatement(Class entityClass, Map, String> cachedStatements, String prefix) { - String statement = cachedStatements.get(entityClass); - if (statement != null) { - return statement; - } - statement = prefix + entityClass.getSimpleName(); - if (statement.endsWith("Impl")) { - statement = statement.substring(0, statement.length() - 10); // removing 'entityImpl' - } else { - statement = statement.substring(0, statement.length() - 6); // removing 'entity' - } - cachedStatements.put(entityClass, statement); - return statement; - } - - // db specific mappings - // ///////////////////////////////////////////////////// - - protected void addDatabaseSpecificStatement(String databaseType, String activitiStatement, String ibatisStatement) { - Map specificStatements = databaseSpecificStatements.get(databaseType); - if (specificStatements == null) { - specificStatements = new HashMap<>(); - databaseSpecificStatements.put(databaseType, specificStatements); - } - specificStatements.put(activitiStatement, ibatisStatement); - } - - public String mapStatement(String statement) { - if (statementMappings == null) { - return statement; - } - String mappedStatement = statementMappings.get(statement); - return (mappedStatement != null ? mappedStatement : statement); - } - - // customized getters and setters - // /////////////////////////////////////////// - - public void setDatabaseType(String databaseType) { - this.databaseType = databaseType; - this.statementMappings = databaseSpecificStatements.get(databaseType); - } - - public boolean isMysql() { - return "mysql".equals(getDatabaseType()); - } - - public boolean isOracle() { - return "oracle".equals(getDatabaseType()); - } - - public Boolean isBulkInsertable(Class entityClass) { - return bulkInserteableEntityClasses != null && bulkInserteableEntityClasses.contains(entityClass); - } - - @SuppressWarnings("rawtypes") - public String getBulkInsertStatement(Class clazz) { - return getStatement(clazz, bulkInsertStatements, "bulkInsert"); - } - - public Set> getBulkInserteableEntityClasses() { - return bulkInserteableEntityClasses; - } - - public void setBulkInserteableEntityClasses(Set> bulkInserteableEntityClasses) { - this.bulkInserteableEntityClasses = bulkInserteableEntityClasses; - } - - public int getMaxNrOfStatementsInBulkInsert() { - return maxNrOfStatementsInBulkInsert; - } - - public void setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) { - this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert; - } - - public Map, String> getBulkInsertStatements() { - return bulkInsertStatements; - } - - public void setBulkInsertStatements(Map, String> bulkInsertStatements) { - this.bulkInsertStatements = bulkInsertStatements; - } - - // getters and setters ////////////////////////////////////////////////////// - - public SqlSessionFactory getSqlSessionFactory() { - return sqlSessionFactory; - } - - public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { - this.sqlSessionFactory = sqlSessionFactory; - } - - public String getDatabaseType() { - return databaseType; - } - - public Map> getDatabaseSpecificStatements() { - return databaseSpecificStatements; - } - - public void setDatabaseSpecificStatements(Map> databaseSpecificStatements) { - this.databaseSpecificStatements = databaseSpecificStatements; - } - - public Map getStatementMappings() { - return statementMappings; - } - - public void setStatementMappings(Map statementMappings) { - this.statementMappings = statementMappings; - } - - public Map, String> getInsertStatements() { - return insertStatements; - } - - public void setInsertStatements(Map, String> insertStatements) { - this.insertStatements = insertStatements; - } - - public Map, String> getUpdateStatements() { - return updateStatements; - } - - public void setUpdateStatements(Map, String> updateStatements) { - this.updateStatements = updateStatements; - } - - public Map, String> getDeleteStatements() { - return deleteStatements; - } - - public void setDeleteStatements(Map, String> deleteStatements) { - this.deleteStatements = deleteStatements; - } - - public Map, String> getSelectStatements() { - return selectStatements; - } - - public void setSelectStatements(Map, String> selectStatements) { - this.selectStatements = selectStatements; - } - - public boolean isDbHistoryUsed() { - return isDbHistoryUsed; - } - - public void setDbHistoryUsed(boolean isDbHistoryUsed) { - this.isDbHistoryUsed = isDbHistoryUsed; - } - - public void setDatabaseTablePrefix(String databaseTablePrefix) { - this.databaseTablePrefix = databaseTablePrefix; - } - - public String getDatabaseTablePrefix() { - return databaseTablePrefix; - } - - public String getDatabaseCatalog() { - return databaseCatalog; - } - - public void setDatabaseCatalog(String databaseCatalog) { - this.databaseCatalog = databaseCatalog; - } - - public String getDatabaseSchema() { - return databaseSchema; - } - - public void setDatabaseSchema(String databaseSchema) { - this.databaseSchema = databaseSchema; - } - - public void setTablePrefixIsSchema(boolean tablePrefixIsSchema) { - this.tablePrefixIsSchema = tablePrefixIsSchema; - } - - public boolean isTablePrefixIsSchema() { - return tablePrefixIsSchema; - } - - public List> getInsertionOrder() { - return insertionOrder; - } - - public void setInsertionOrder(List> insertionOrder) { - this.insertionOrder = insertionOrder; - } - - public List> getDeletionOrder() { - return deletionOrder; - } - - public void setDeletionOrder(List> deletionOrder) { - this.deletionOrder = deletionOrder; - } - public void addLogicalEntityClassMapping(String logicalName, Class entityClass) { - logicalNameToClassMapping.put(logicalName, entityClass); - } - - public Map> getLogicalNameToClassMapping() { - return logicalNameToClassMapping; - } - - public void setLogicalNameToClassMapping(Map> logicalNameToClassMapping) { - this.logicalNameToClassMapping = logicalNameToClassMapping; - } - - public boolean isUsePrefixId() { - return usePrefixId; - } - - public void setUsePrefixId(boolean usePrefixId) { - this.usePrefixId = usePrefixId; - } -} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/package-info.md b/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/package-info.md deleted file mode 100644 index 1932c7a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/package-info.md +++ /dev/null @@ -1 +0,0 @@ -防止IDEAå°†`.`å’Œ`/`混为一谈 \ No newline at end of file diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.database.Database b/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.database.Database deleted file mode 100644 index 765e41a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.database.Database +++ /dev/null @@ -1,21 +0,0 @@ -liquibase.database.core.CockroachDatabase -liquibase.database.core.DB2Database -liquibase.database.core.Db2zDatabase -liquibase.database.core.DerbyDatabase -#liquibase.database.core.Firebird3Database -liquibase.database.core.FirebirdDatabase -liquibase.database.core.H2Database -liquibase.database.core.HsqlDatabase -liquibase.database.core.InformixDatabase -liquibase.database.core.Ingres9Database -liquibase.database.core.MSSQLDatabase -liquibase.database.core.MariaDBDatabase -liquibase.database.core.MockDatabase -liquibase.database.core.MySQLDatabase -liquibase.database.core.OracleDatabase -liquibase.database.core.DmDatabase -liquibase.database.core.PostgresDatabase -liquibase.database.core.SQLiteDatabase -liquibase.database.core.SybaseASADatabase -liquibase.database.core.SybaseDatabase -liquibase.database.core.UnsupportedDatabase diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.datatype.LiquibaseDataType b/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.datatype.LiquibaseDataType deleted file mode 100644 index 5be88a3..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/META-INF/services/liquibase.datatype.LiquibaseDataType +++ /dev/null @@ -1 +0,0 @@ -liquibase.datatype.core.DmBooleanType diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/create/flowable.oracle.create.batch.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/create/flowable.oracle.create.batch.sql deleted file mode 100644 index 19dca82..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/create/flowable.oracle.create.batch.sql +++ /dev/null @@ -1,41 +0,0 @@ -create table FLW_RU_BATCH ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - TYPE_ VARCHAR2(64) not null, - SEARCH_KEY_ VARCHAR2(255), - SEARCH_KEY2_ VARCHAR2(255), - CREATE_TIME_ TIMESTAMP(6) not null, - COMPLETE_TIME_ TIMESTAMP(6), - STATUS_ VARCHAR2(255), - BATCH_DOC_ID_ VARCHAR2(64), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create table FLW_RU_BATCH_PART ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - BATCH_ID_ VARCHAR2(64), - TYPE_ VARCHAR2(64) not null, - SCOPE_ID_ VARCHAR2(64), - SUB_SCOPE_ID_ VARCHAR2(64), - SCOPE_TYPE_ VARCHAR2(64), - SEARCH_KEY_ VARCHAR2(255), - SEARCH_KEY2_ VARCHAR2(255), - CREATE_TIME_ TIMESTAMP(6) not null, - COMPLETE_TIME_ TIMESTAMP(6), - STATUS_ VARCHAR2(255), - RESULT_DOC_ID_ VARCHAR2(64), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create index FLW_IDX_BATCH_PART on FLW_RU_BATCH_PART(BATCH_ID_); - -alter table FLW_RU_BATCH_PART - add constraint FLW_FK_BATCH_PART_PARENT - foreign key (BATCH_ID_) - references FLW_RU_BATCH (ID_); - -insert into ACT_GE_PROPERTY values ('batch.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/drop/flowable.oracle.drop.batch.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/drop/flowable.oracle.drop.batch.sql deleted file mode 100644 index d16ba1c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/batch/service/db/drop/flowable.oracle.drop.batch.sql +++ /dev/null @@ -1,4 +0,0 @@ -drop index FLW_IDX_BATCH_PART; - -drop table FLW_RU_BATCH_PART; -drop table FLW_RU_BATCH; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/create/flowable.oracle.create.common.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/create/flowable.oracle.create.common.sql deleted file mode 100644 index 4ef0d2e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/create/flowable.oracle.create.common.sql +++ /dev/null @@ -1,23 +0,0 @@ -create table ACT_GE_PROPERTY ( - NAME_ VARCHAR2(64), - VALUE_ VARCHAR2(300), - REV_ INTEGER, - primary key (NAME_) -); - -create table ACT_GE_BYTEARRAY ( - ID_ VARCHAR2(64), - REV_ INTEGER, - NAME_ VARCHAR2(255), - DEPLOYMENT_ID_ VARCHAR2(64), - BYTES_ BLOB, - GENERATED_ NUMBER(1) CHECK (GENERATED_ IN (1,0)), - primary key (ID_) -); - -insert into ACT_GE_PROPERTY -values ('common.schema.version', '7.0.1.1', 1); - -insert into ACT_GE_PROPERTY -values ('next.dbid', '1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/drop/flowable.oracle.drop.common.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/drop/flowable.oracle.drop.common.sql deleted file mode 100644 index 9019cb9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/common/db/drop/flowable.oracle.drop.common.sql +++ /dev/null @@ -1,2 +0,0 @@ -drop table ACT_GE_BYTEARRAY; -drop table ACT_GE_PROPERTY; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.engine.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.engine.sql deleted file mode 100644 index d0139b7..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.engine.sql +++ /dev/null @@ -1,355 +0,0 @@ -create table ACT_RE_DEPLOYMENT ( - ID_ VARCHAR2(64), - NAME_ VARCHAR2(255), - CATEGORY_ VARCHAR2(255), - KEY_ VARCHAR2(255), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - DEPLOY_TIME_ TIMESTAMP(6), - DERIVED_FROM_ VARCHAR2(64), - DERIVED_FROM_ROOT_ VARCHAR2(64), - PARENT_DEPLOYMENT_ID_ VARCHAR2(255), - ENGINE_VERSION_ VARCHAR2(255), - primary key (ID_) -); - -create table ACT_RE_MODEL ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - NAME_ VARCHAR2(255), - KEY_ VARCHAR2(255), - CATEGORY_ VARCHAR2(255), - CREATE_TIME_ TIMESTAMP(6), - LAST_UPDATE_TIME_ TIMESTAMP(6), - VERSION_ INTEGER, - META_INFO_ VARCHAR2(2000), - DEPLOYMENT_ID_ VARCHAR2(64), - EDITOR_SOURCE_VALUE_ID_ VARCHAR2(64), - EDITOR_SOURCE_EXTRA_VALUE_ID_ VARCHAR2(64), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_EXECUTION ( - ID_ VARCHAR2(64), - REV_ INTEGER, - PROC_INST_ID_ VARCHAR2(64), - BUSINESS_KEY_ VARCHAR2(255), - PARENT_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - SUPER_EXEC_ VARCHAR2(64), - ROOT_PROC_INST_ID_ VARCHAR2(64), - ACT_ID_ VARCHAR2(255), - IS_ACTIVE_ NUMBER(1) CHECK (IS_ACTIVE_ IN (1,0)), - IS_CONCURRENT_ NUMBER(1) CHECK (IS_CONCURRENT_ IN (1,0)), - IS_SCOPE_ NUMBER(1) CHECK (IS_SCOPE_ IN (1,0)), - IS_EVENT_SCOPE_ NUMBER(1) CHECK (IS_EVENT_SCOPE_ IN (1,0)), - IS_MI_ROOT_ NUMBER(1) CHECK (IS_MI_ROOT_ IN (1,0)), - SUSPENSION_STATE_ INTEGER, - CACHED_ENT_STATE_ INTEGER, - TENANT_ID_ VARCHAR2(255) DEFAULT '', - NAME_ VARCHAR2(255), - START_ACT_ID_ VARCHAR2(255), - START_TIME_ TIMESTAMP(6), - START_USER_ID_ VARCHAR2(255), - LOCK_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - IS_COUNT_ENABLED_ NUMBER(1) CHECK (IS_COUNT_ENABLED_ IN (1,0)), - EVT_SUBSCR_COUNT_ INTEGER, - TASK_COUNT_ INTEGER, - JOB_COUNT_ INTEGER, - TIMER_JOB_COUNT_ INTEGER, - SUSP_JOB_COUNT_ INTEGER, - DEADLETTER_JOB_COUNT_ INTEGER, - EXTERNAL_WORKER_JOB_COUNT_ INTEGER, - VAR_COUNT_ INTEGER, - ID_LINK_COUNT_ INTEGER, - CALLBACK_ID_ VARCHAR2(255), - CALLBACK_TYPE_ VARCHAR2(255), - REFERENCE_ID_ VARCHAR2(255), - REFERENCE_TYPE_ VARCHAR2(255), - PROPAGATED_STAGE_INST_ID_ VARCHAR2(255), - BUSINESS_STATUS_ VARCHAR2(255), - primary key (ID_) -); - -create table ACT_RE_PROCDEF ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - NAME_ VARCHAR2(255), - KEY_ VARCHAR2(255) NOT NULL, - VERSION_ INTEGER NOT NULL, - DEPLOYMENT_ID_ VARCHAR2(64), - RESOURCE_NAME_ VARCHAR2(2000), - DGRM_RESOURCE_NAME_ VARCHAR2(4000), - DESCRIPTION_ VARCHAR2(2000), - HAS_START_FORM_KEY_ NUMBER(1) CHECK (HAS_START_FORM_KEY_ IN (1,0)), - HAS_GRAPHICAL_NOTATION_ NUMBER(1) CHECK (HAS_GRAPHICAL_NOTATION_ IN (1,0)), - SUSPENSION_STATE_ INTEGER, - TENANT_ID_ VARCHAR2(255) DEFAULT '', - DERIVED_FROM_ VARCHAR2(64), - DERIVED_FROM_ROOT_ VARCHAR2(64), - DERIVED_VERSION_ INTEGER DEFAULT 0 NOT NULL, - ENGINE_VERSION_ VARCHAR2(255), - primary key (ID_) -); - -create table ACT_EVT_LOG ( - LOG_NR_ NUMBER(19), - TYPE_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - EXECUTION_ID_ VARCHAR2(64), - TASK_ID_ VARCHAR2(64), - TIME_STAMP_ TIMESTAMP(6) not null, - USER_ID_ VARCHAR2(255), - DATA_ BLOB, - LOCK_OWNER_ VARCHAR2(255), - LOCK_TIME_ TIMESTAMP(6) null, - IS_PROCESSED_ NUMBER(3) default 0, - primary key (LOG_NR_) -); - -create sequence act_evt_log_seq; - -create table ACT_PROCDEF_INFO ( - ID_ VARCHAR2(64) not null, - PROC_DEF_ID_ VARCHAR2(64) not null, - REV_ integer, - INFO_JSON_ID_ VARCHAR2(64), - primary key (ID_) -); - -create table ACT_RU_ACTINST ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER default 1, - PROC_DEF_ID_ VARCHAR2(64) not null, - PROC_INST_ID_ VARCHAR2(64) not null, - EXECUTION_ID_ VARCHAR2(64) not null, - ACT_ID_ VARCHAR2(255) not null, - TASK_ID_ VARCHAR2(64), - CALL_PROC_INST_ID_ VARCHAR2(64), - ACT_NAME_ VARCHAR2(255), - ACT_TYPE_ VARCHAR2(255) not null, - ASSIGNEE_ VARCHAR2(255), - START_TIME_ TIMESTAMP(6) not null, - END_TIME_ TIMESTAMP(6), - DURATION_ NUMBER(19,0), - TRANSACTION_ORDER_ INTEGER, - DELETE_REASON_ VARCHAR2(2000), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create index ACT_IDX_EXEC_BUSKEY on ACT_RU_EXECUTION(BUSINESS_KEY_); -create index ACT_IDX_EXEC_ROOT on ACT_RU_EXECUTION(ROOT_PROC_INST_ID_); -create index ACT_IDX_EXEC_REF_ID_ on ACT_RU_EXECUTION(REFERENCE_ID_); -create index ACT_IDX_VARIABLE_TASK_ID on ACT_RU_VARIABLE(TASK_ID_); - -create index ACT_IDX_RU_ACTI_START on ACT_RU_ACTINST(START_TIME_); -create index ACT_IDX_RU_ACTI_END on ACT_RU_ACTINST(END_TIME_); -create index ACT_IDX_RU_ACTI_PROC on ACT_RU_ACTINST(PROC_INST_ID_); -create index ACT_IDX_RU_ACTI_PROC_ACT on ACT_RU_ACTINST(PROC_INST_ID_, ACT_ID_); -create index ACT_IDX_RU_ACTI_EXEC on ACT_RU_ACTINST(EXECUTION_ID_); -create index ACT_IDX_RU_ACTI_EXEC_ACT on ACT_RU_ACTINST(EXECUTION_ID_, ACT_ID_); -create index ACT_IDX_RU_ACTI_TASK on ACT_RU_ACTINST(TASK_ID_); - -create index ACT_IDX_BYTEAR_DEPL on ACT_GE_BYTEARRAY(DEPLOYMENT_ID_); -alter table ACT_GE_BYTEARRAY - add constraint ACT_FK_BYTEARR_DEPL - foreign key (DEPLOYMENT_ID_) - references ACT_RE_DEPLOYMENT (ID_); - -alter table ACT_RE_PROCDEF - add constraint ACT_UNIQ_PROCDEF - unique (KEY_,VERSION_, DERIVED_VERSION_, TENANT_ID_); - -create index ACT_IDX_EXE_PROCINST on ACT_RU_EXECUTION(PROC_INST_ID_); -alter table ACT_RU_EXECUTION - add constraint ACT_FK_EXE_PROCINST - foreign key (PROC_INST_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_EXE_PARENT on ACT_RU_EXECUTION(PARENT_ID_); -alter table ACT_RU_EXECUTION - add constraint ACT_FK_EXE_PARENT - foreign key (PARENT_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_EXE_SUPER on ACT_RU_EXECUTION(SUPER_EXEC_); -alter table ACT_RU_EXECUTION - add constraint ACT_FK_EXE_SUPER - foreign key (SUPER_EXEC_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_EXE_PROCDEF on ACT_RU_EXECUTION(PROC_DEF_ID_); -alter table ACT_RU_EXECUTION - add constraint ACT_FK_EXE_PROCDEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_TSKASS_TASK on ACT_RU_IDENTITYLINK(TASK_ID_); -alter table ACT_RU_IDENTITYLINK - add constraint ACT_FK_TSKASS_TASK - foreign key (TASK_ID_) - references ACT_RU_TASK (ID_); - -create index ACT_IDX_ATHRZ_PROCEDEF on ACT_RU_IDENTITYLINK(PROC_DEF_ID_); -alter table ACT_RU_IDENTITYLINK - add constraint ACT_FK_ATHRZ_PROCEDEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_IDL_PROCINST on ACT_RU_IDENTITYLINK(PROC_INST_ID_); -alter table ACT_RU_IDENTITYLINK - add constraint ACT_FK_IDL_PROCINST - foreign key (PROC_INST_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_TASK_EXEC on ACT_RU_TASK(EXECUTION_ID_); -alter table ACT_RU_TASK - add constraint ACT_FK_TASK_EXE - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_TASK_PROCINST on ACT_RU_TASK(PROC_INST_ID_); -alter table ACT_RU_TASK - add constraint ACT_FK_TASK_PROCINST - foreign key (PROC_INST_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_TASK_PROCDEF on ACT_RU_TASK(PROC_DEF_ID_); -alter table ACT_RU_TASK - add constraint ACT_FK_TASK_PROCDEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_VAR_EXE on ACT_RU_VARIABLE(EXECUTION_ID_); -alter table ACT_RU_VARIABLE - add constraint ACT_FK_VAR_EXE - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_VAR_PROCINST on ACT_RU_VARIABLE(PROC_INST_ID_); -alter table ACT_RU_VARIABLE - add constraint ACT_FK_VAR_PROCINST - foreign key (PROC_INST_ID_) - references ACT_RU_EXECUTION(ID_); - -create index ACT_IDX_JOB_EXECUTION_ID on ACT_RU_JOB(EXECUTION_ID_); -alter table ACT_RU_JOB - add constraint ACT_FK_JOB_EXECUTION - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_JOB_PROC_INST_ID on ACT_RU_JOB(PROCESS_INSTANCE_ID_); -alter table ACT_RU_JOB - add constraint ACT_FK_JOB_PROCESS_INSTANCE - foreign key (PROCESS_INSTANCE_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_JOB_PROC_DEF_ID on ACT_RU_JOB(PROC_DEF_ID_); -alter table ACT_RU_JOB - add constraint ACT_FK_JOB_PROC_DEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_TJOB_EXECUTION_ID on ACT_RU_TIMER_JOB(EXECUTION_ID_); -alter table ACT_RU_TIMER_JOB - add constraint ACT_FK_TJOB_EXECUTION - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_TJOB_PROC_INST_ID on ACT_RU_TIMER_JOB(PROCESS_INSTANCE_ID_); -alter table ACT_RU_TIMER_JOB - add constraint ACT_FK_TJOB_PROCESS_INSTANCE - foreign key (PROCESS_INSTANCE_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_TJOB_PROC_DEF_ID on ACT_RU_TIMER_JOB(PROC_DEF_ID_); -alter table ACT_RU_TIMER_JOB - add constraint ACT_FK_TJOB_PROC_DEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_SJOB_EXECUTION_ID on ACT_RU_SUSPENDED_JOB(EXECUTION_ID_); -alter table ACT_RU_SUSPENDED_JOB - add constraint ACT_FK_SJOB_EXECUTION - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_SJOB_PROC_INST_ID on ACT_RU_SUSPENDED_JOB(PROCESS_INSTANCE_ID_); -alter table ACT_RU_SUSPENDED_JOB - add constraint ACT_FK_SJOB_PROCESS_INSTANCE - foreign key (PROCESS_INSTANCE_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_SJOB_PROC_DEF_ID on ACT_RU_SUSPENDED_JOB(PROC_DEF_ID_); -alter table ACT_RU_SUSPENDED_JOB - add constraint ACT_FK_SJOB_PROC_DEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -create index ACT_IDX_DJOB_EXECUTION_ID on ACT_RU_DEADLETTER_JOB(EXECUTION_ID_); -alter table ACT_RU_DEADLETTER_JOB - add constraint ACT_FK_DJOB_EXECUTION - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_DJOB_PROC_INST_ID on ACT_RU_DEADLETTER_JOB(PROCESS_INSTANCE_ID_); -alter table ACT_RU_DEADLETTER_JOB - add constraint ACT_FK_DJOB_PROCESS_INSTANCE - foreign key (PROCESS_INSTANCE_ID_) - references ACT_RU_EXECUTION (ID_); - -create index ACT_IDX_DJOB_PROC_DEF_ID on ACT_RU_DEADLETTER_JOB(PROC_DEF_ID_); -alter table ACT_RU_DEADLETTER_JOB - add constraint ACT_FK_DJOB_PROC_DEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -alter table ACT_RU_EVENT_SUBSCR - add constraint ACT_FK_EVENT_EXEC - foreign key (EXECUTION_ID_) - references ACT_RU_EXECUTION(ID_); - -create index ACT_IDX_MODEL_SOURCE on ACT_RE_MODEL(EDITOR_SOURCE_VALUE_ID_); -alter table ACT_RE_MODEL - add constraint ACT_FK_MODEL_SOURCE - foreign key (EDITOR_SOURCE_VALUE_ID_) - references ACT_GE_BYTEARRAY (ID_); - -create index ACT_IDX_MODEL_SOURCE_EXTRA on ACT_RE_MODEL(EDITOR_SOURCE_EXTRA_VALUE_ID_); -alter table ACT_RE_MODEL - add constraint ACT_FK_MODEL_SOURCE_EXTRA - foreign key (EDITOR_SOURCE_EXTRA_VALUE_ID_) - references ACT_GE_BYTEARRAY (ID_); - -create index ACT_IDX_MODEL_DEPLOYMENT on ACT_RE_MODEL(DEPLOYMENT_ID_); -alter table ACT_RE_MODEL - add constraint ACT_FK_MODEL_DEPLOYMENT - foreign key (DEPLOYMENT_ID_) - references ACT_RE_DEPLOYMENT (ID_); - -create index ACT_IDX_PROCDEF_INFO_JSON on ACT_PROCDEF_INFO(INFO_JSON_ID_); -alter table ACT_PROCDEF_INFO - add constraint ACT_FK_INFO_JSON_BA - foreign key (INFO_JSON_ID_) - references ACT_GE_BYTEARRAY (ID_); - -create index ACT_IDX_PROCDEF_INFO_PROC on ACT_PROCDEF_INFO(PROC_DEF_ID_); -alter table ACT_PROCDEF_INFO - add constraint ACT_FK_INFO_PROCDEF - foreign key (PROC_DEF_ID_) - references ACT_RE_PROCDEF (ID_); - -alter table ACT_PROCDEF_INFO - add constraint ACT_UNIQ_INFO_PROCDEF - unique (PROC_DEF_ID_); - -insert into ACT_GE_PROPERTY -values ('schema.version', '7.0.1.1', 1); - -insert into ACT_GE_PROPERTY -values ('schema.history', 'create(7.0.1.1)', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.history.sql deleted file mode 100644 index 75782f4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/create/flowable.oracle.create.history.sql +++ /dev/null @@ -1,114 +0,0 @@ -create table ACT_HI_PROCINST ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER default 1, - PROC_INST_ID_ VARCHAR2(64) not null, - BUSINESS_KEY_ VARCHAR2(255), - PROC_DEF_ID_ VARCHAR2(64) not null, - START_TIME_ TIMESTAMP(6) not null, - END_TIME_ TIMESTAMP(6), - DURATION_ NUMBER(19,0), - START_USER_ID_ VARCHAR2(255), - START_ACT_ID_ VARCHAR2(255), - END_ACT_ID_ VARCHAR2(255), - SUPER_PROCESS_INSTANCE_ID_ VARCHAR2(64), - DELETE_REASON_ VARCHAR2(2000), - TENANT_ID_ VARCHAR2(255) default '', - NAME_ VARCHAR2(255), - CALLBACK_ID_ VARCHAR2(255), - CALLBACK_TYPE_ VARCHAR2(255), - REFERENCE_ID_ VARCHAR2(255), - REFERENCE_TYPE_ VARCHAR2(255), - PROPAGATED_STAGE_INST_ID_ VARCHAR2(255), - BUSINESS_STATUS_ VARCHAR2(255), - primary key (ID_), - unique (PROC_INST_ID_) -); - -create table ACT_HI_ACTINST ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER default 1, - PROC_DEF_ID_ VARCHAR2(64) not null, - PROC_INST_ID_ VARCHAR2(64) not null, - EXECUTION_ID_ VARCHAR2(64) not null, - ACT_ID_ VARCHAR2(255) not null, - TASK_ID_ VARCHAR2(64), - CALL_PROC_INST_ID_ VARCHAR2(64), - ACT_NAME_ VARCHAR2(255), - ACT_TYPE_ VARCHAR2(255) not null, - ASSIGNEE_ VARCHAR2(255), - START_TIME_ TIMESTAMP(6) not null, - END_TIME_ TIMESTAMP(6), - TRANSACTION_ORDER_ INTEGER, - DURATION_ NUMBER(19,0), - DELETE_REASON_ VARCHAR2(2000), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create table ACT_HI_DETAIL ( - ID_ VARCHAR2(64) not null, - TYPE_ VARCHAR2(255) not null, - PROC_INST_ID_ VARCHAR2(64), - EXECUTION_ID_ VARCHAR2(64), - TASK_ID_ VARCHAR2(64), - ACT_INST_ID_ VARCHAR2(64), - NAME_ VARCHAR2(255) not null, - VAR_TYPE_ VARCHAR2(64), - REV_ INTEGER, - TIME_ TIMESTAMP(6) not null, - BYTEARRAY_ID_ VARCHAR2(64), - DOUBLE_ NUMBER(38,10), - LONG_ NUMBER(19,0), - TEXT_ VARCHAR2(2000), - TEXT2_ VARCHAR2(2000), - primary key (ID_) -); - -create table ACT_HI_COMMENT ( - ID_ VARCHAR2(64) not null, - TYPE_ VARCHAR2(255), - TIME_ TIMESTAMP(6) not null, - USER_ID_ VARCHAR2(255), - TASK_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - ACTION_ VARCHAR2(255), - MESSAGE_ VARCHAR2(2000), - FULL_MSG_ BLOB, - primary key (ID_) -); - -create table ACT_HI_ATTACHMENT ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - USER_ID_ VARCHAR2(255), - NAME_ VARCHAR2(255), - DESCRIPTION_ VARCHAR2(2000), - TYPE_ VARCHAR2(255), - TASK_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - URL_ VARCHAR2(2000), - CONTENT_ID_ VARCHAR2(64), - TIME_ TIMESTAMP(6), - primary key (ID_) -); - -create index ACT_IDX_HI_PRO_INST_END on ACT_HI_PROCINST(END_TIME_); -create index ACT_IDX_HI_PRO_I_BUSKEY on ACT_HI_PROCINST(BUSINESS_KEY_); -create index ACT_IDX_HI_PRO_SUPER_PROCINST on ACT_HI_PROCINST(SUPER_PROCESS_INSTANCE_ID_); -create index ACT_IDX_HI_ACT_INST_START on ACT_HI_ACTINST(START_TIME_); -create index ACT_IDX_HI_ACT_INST_END on ACT_HI_ACTINST(END_TIME_); -create index ACT_IDX_HI_DETAIL_PROC_INST on ACT_HI_DETAIL(PROC_INST_ID_); -create index ACT_IDX_HI_DETAIL_ACT_INST on ACT_HI_DETAIL(ACT_INST_ID_); -create index ACT_IDX_HI_DETAIL_TIME on ACT_HI_DETAIL(TIME_); -create index ACT_IDX_HI_DETAIL_NAME on ACT_HI_DETAIL(NAME_); -create index ACT_IDX_HI_DETAIL_TASK_ID on ACT_HI_DETAIL(TASK_ID_); -create index ACT_IDX_HI_PROCVAR_PROC_INST on ACT_HI_VARINST(PROC_INST_ID_); -create index ACT_IDX_HI_PROCVAR_TASK_ID on ACT_HI_VARINST(TASK_ID_); -create index ACT_IDX_HI_PROCVAR_EXE on ACT_HI_VARINST(EXECUTION_ID_); -create index ACT_IDX_HI_IDENT_LNK_TASK on ACT_HI_IDENTITYLINK(TASK_ID_); -create index ACT_IDX_HI_IDENT_LNK_PROCINST on ACT_HI_IDENTITYLINK(PROC_INST_ID_); - -create index ACT_IDX_HI_ACT_INST_PROCINST on ACT_HI_ACTINST(PROC_INST_ID_, ACT_ID_); -create index ACT_IDX_HI_ACT_INST_EXEC on ACT_HI_ACTINST(EXECUTION_ID_, ACT_ID_); -create index ACT_IDX_HI_TASK_INST_PROCINST on ACT_HI_TASKINST(PROC_INST_ID_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.engine.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.engine.sql deleted file mode 100644 index 58537ba..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.engine.sql +++ /dev/null @@ -1,148 +0,0 @@ -drop index ACT_IDX_BYTEAR_DEPL; -drop index ACT_IDX_EXE_PROCINST; -drop index ACT_IDX_EXE_PARENT; -drop index ACT_IDX_EXE_SUPER; -drop index ACT_IDX_TSKASS_TASK; -drop index ACT_IDX_TASK_EXEC; -drop index ACT_IDX_TASK_PROCINST; -drop index ACT_IDX_TASK_PROCDEF; -drop index ACT_IDX_VAR_EXE; -drop index ACT_IDX_VAR_PROCINST; -drop index ACT_IDX_JOB_EXECUTION_ID; -drop index ACT_IDX_JOB_PROC_INST_ID; -drop index ACT_IDX_JOB_PROC_DEF_ID; -drop index ACT_IDX_TJOB_EXECUTION_ID; -drop index ACT_IDX_TJOB_PROC_INST_ID; -drop index ACT_IDX_TJOB_PROC_DEF_ID; -drop index ACT_IDX_SJOB_EXECUTION_ID; -drop index ACT_IDX_SJOB_PROC_INST_ID; -drop index ACT_IDX_SJOB_PROC_DEF_ID; -drop index ACT_IDX_DJOB_EXECUTION_ID; -drop index ACT_IDX_DJOB_PROC_INST_ID; -drop index ACT_IDX_DJOB_PROC_DEF_ID; -drop index ACT_IDX_MODEL_SOURCE; -drop index ACT_IDX_MODEL_SOURCE_EXTRA; -drop index ACT_IDX_MODEL_DEPLOYMENT; -drop index ACT_IDX_PROCDEF_INFO_JSON; - -drop index ACT_IDX_EXEC_BUSKEY; -drop index ACT_IDX_VARIABLE_TASK_ID; - -drop index ACT_IDX_RU_ACTI_START; -drop index ACT_IDX_RU_ACTI_END; -drop index ACT_IDX_RU_ACTI_PROC; -drop index ACT_IDX_RU_ACTI_PROC_ACT; -drop index ACT_IDX_RU_ACTI_EXEC; -drop index ACT_IDX_RU_ACTI_EXEC_ACT; - -alter table ACT_GE_BYTEARRAY - drop CONSTRAINT ACT_FK_BYTEARR_DEPL; - -alter table ACT_RU_EXECUTION - drop CONSTRAINT ACT_FK_EXE_PROCINST; - -alter table ACT_RU_EXECUTION - drop CONSTRAINT ACT_FK_EXE_PARENT; - -alter table ACT_RU_EXECUTION - drop CONSTRAINT ACT_FK_EXE_SUPER; - -alter table ACT_RU_EXECUTION - drop CONSTRAINT ACT_FK_EXE_PROCDEF; - -alter table ACT_RU_IDENTITYLINK - drop CONSTRAINT ACT_FK_TSKASS_TASK; - -alter table ACT_RU_IDENTITYLINK - drop CONSTRAINT ACT_FK_IDL_PROCINST; - -alter table ACT_RU_IDENTITYLINK - drop CONSTRAINT ACT_FK_ATHRZ_PROCEDEF; - -alter table ACT_RU_TASK - drop CONSTRAINT ACT_FK_TASK_EXE; - -alter table ACT_RU_TASK - drop CONSTRAINT ACT_FK_TASK_PROCINST; - -alter table ACT_RU_TASK - drop CONSTRAINT ACT_FK_TASK_PROCDEF; - -alter table ACT_RU_VARIABLE - drop CONSTRAINT ACT_FK_VAR_EXE; - -alter table ACT_RU_VARIABLE - drop CONSTRAINT ACT_FK_VAR_PROCINST; - -alter table ACT_RU_JOB - drop CONSTRAINT ACT_FK_JOB_EXECUTION; - -alter table ACT_RU_JOB - drop CONSTRAINT ACT_FK_JOB_PROCESS_INSTANCE; - -alter table ACT_RU_JOB - drop CONSTRAINT ACT_FK_JOB_PROC_DEF; - -alter table ACT_RU_TIMER_JOB - drop CONSTRAINT ACT_FK_TJOB_EXECUTION; - -alter table ACT_RU_TIMER_JOB - drop CONSTRAINT ACT_FK_TJOB_PROCESS_INSTANCE; - -alter table ACT_RU_TIMER_JOB - drop CONSTRAINT ACT_FK_TJOB_PROC_DEF; - -alter table ACT_RU_SUSPENDED_JOB - drop CONSTRAINT ACT_FK_SJOB_EXECUTION; - -alter table ACT_RU_SUSPENDED_JOB - drop CONSTRAINT ACT_FK_SJOB_PROCESS_INSTANCE; - -alter table ACT_RU_SUSPENDED_JOB - drop CONSTRAINT ACT_FK_SJOB_PROC_DEF; - -alter table ACT_RU_DEADLETTER_JOB - drop CONSTRAINT ACT_FK_DJOB_EXECUTION; - -alter table ACT_RU_DEADLETTER_JOB - drop CONSTRAINT ACT_FK_DJOB_PROCESS_INSTANCE; - -alter table ACT_RU_DEADLETTER_JOB - drop CONSTRAINT ACT_FK_DJOB_PROC_DEF; - -alter table ACT_RU_EVENT_SUBSCR - drop CONSTRAINT ACT_FK_EVENT_EXEC; - -alter table ACT_RE_PROCDEF - drop CONSTRAINT ACT_UNIQ_PROCDEF; - -alter table ACT_RE_MODEL - drop CONSTRAINT ACT_FK_MODEL_SOURCE; - -alter table ACT_RE_MODEL - drop CONSTRAINT ACT_FK_MODEL_SOURCE_EXTRA; - -alter table ACT_RE_MODEL - drop CONSTRAINT ACT_FK_MODEL_DEPLOYMENT; - -alter table ACT_PROCDEF_INFO - drop CONSTRAINT ACT_UNIQ_INFO_PROCDEF; - -alter table ACT_PROCDEF_INFO - drop CONSTRAINT ACT_FK_INFO_JSON_BA; - -alter table ACT_PROCDEF_INFO - drop CONSTRAINT ACT_FK_INFO_PROCDEF; - -drop index ACT_IDX_ATHRZ_PROCEDEF; -drop index ACT_IDX_PROCDEF_INFO_PROC; - -drop table ACT_RU_ACTINST; -drop table ACT_RE_DEPLOYMENT; -drop table ACT_RE_MODEL; -drop table ACT_RE_PROCDEF; -drop table ACT_RU_EXECUTION; - -drop sequence act_evt_log_seq; -drop table ACT_EVT_LOG; -drop table ACT_PROCDEF_INFO; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.history.sql deleted file mode 100644 index 2a31cc4..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/db/drop/flowable.oracle.drop.history.sql +++ /dev/null @@ -1,23 +0,0 @@ -drop index ACT_IDX_HI_PRO_INST_END; -drop index ACT_IDX_HI_PRO_I_BUSKEY; -drop index ACT_IDX_HI_ACT_INST_START; -drop index ACT_IDX_HI_ACT_INST_END; -drop index ACT_IDX_HI_DETAIL_PROC_INST; -drop index ACT_IDX_HI_DETAIL_ACT_INST; -drop index ACT_IDX_HI_DETAIL_TIME; -drop index ACT_IDX_HI_DETAIL_NAME; -drop index ACT_IDX_HI_DETAIL_TASK_ID; -drop index ACT_IDX_HI_PROCVAR_PROC_INST; -drop index ACT_IDX_HI_PROCVAR_TASK_ID; -drop index ACT_IDX_HI_PROCVAR_EXE; -drop index ACT_IDX_HI_ACT_INST_PROCINST; -drop index ACT_IDX_HI_IDENT_LNK_TASK; -drop index ACT_IDX_HI_IDENT_LNK_PROCINST; -drop index ACT_IDX_HI_TASK_INST_PROCINST; - -drop table ACT_HI_PROCINST; -drop table ACT_HI_ACTINST; -drop table ACT_HI_DETAIL; -drop table ACT_HI_COMMENT; -drop table ACT_HI_ATTACHMENT; - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.history.sql deleted file mode 100644 index 55c5dbe..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.history.sql +++ /dev/null @@ -1,23 +0,0 @@ -create table ACT_HI_ENTITYLINK ( - ID_ VARCHAR2(64), - LINK_TYPE_ VARCHAR2(255), - CREATE_TIME_ TIMESTAMP(6), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - PARENT_ELEMENT_ID_ VARCHAR2(255), - REF_SCOPE_ID_ VARCHAR2(255), - REF_SCOPE_TYPE_ VARCHAR2(255), - REF_SCOPE_DEFINITION_ID_ VARCHAR2(255), - ROOT_SCOPE_ID_ VARCHAR2(255), - ROOT_SCOPE_TYPE_ VARCHAR2(255), - HIERARCHY_TYPE_ VARCHAR2(255), - primary key (ID_) -); - -create index ACT_IDX_HI_ENT_LNK_SCOPE on ACT_HI_ENTITYLINK(SCOPE_ID_, SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_HI_ENT_LNK_REF_SCOPE on ACT_HI_ENTITYLINK(REF_SCOPE_ID_, REF_SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_HI_ENT_LNK_ROOT_SCOPE on ACT_HI_ENTITYLINK(ROOT_SCOPE_ID_, ROOT_SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_HI_ENT_LNK_SCOPE_DEF on ACT_HI_ENTITYLINK(SCOPE_DEFINITION_ID_, SCOPE_TYPE_, LINK_TYPE_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.sql deleted file mode 100644 index de08451..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/create/flowable.oracle.create.entitylink.sql +++ /dev/null @@ -1,26 +0,0 @@ -create table ACT_RU_ENTITYLINK ( - ID_ VARCHAR2(64), - REV_ INTEGER, - CREATE_TIME_ TIMESTAMP(6), - LINK_TYPE_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - PARENT_ELEMENT_ID_ VARCHAR2(255), - REF_SCOPE_ID_ VARCHAR2(255), - REF_SCOPE_TYPE_ VARCHAR2(255), - REF_SCOPE_DEFINITION_ID_ VARCHAR2(255), - ROOT_SCOPE_ID_ VARCHAR2(255), - ROOT_SCOPE_TYPE_ VARCHAR2(255), - HIERARCHY_TYPE_ VARCHAR2(255), - primary key (ID_) -); - -create index ACT_IDX_ENT_LNK_SCOPE on ACT_RU_ENTITYLINK(SCOPE_ID_, SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_ENT_LNK_REF_SCOPE on ACT_RU_ENTITYLINK(REF_SCOPE_ID_, REF_SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_ENT_LNK_ROOT_SCOPE on ACT_RU_ENTITYLINK(ROOT_SCOPE_ID_, ROOT_SCOPE_TYPE_, LINK_TYPE_); -create index ACT_IDX_ENT_LNK_SCOPE_DEF on ACT_RU_ENTITYLINK(SCOPE_DEFINITION_ID_, SCOPE_TYPE_, LINK_TYPE_); - -insert into ACT_GE_PROPERTY values ('entitylink.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.history.sql deleted file mode 100644 index a908877..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.history.sql +++ /dev/null @@ -1,4 +0,0 @@ -drop index ACT_IDX_HI_ENT_LNK_SCOPE; -drop index ACT_IDX_HI_ENT_LNK_SCOPE_DEF; - -drop table ACT_HI_ENTITYLINK; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.sql deleted file mode 100644 index aedbacd..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/entitylink/service/db/drop/flowable.oracle.drop.entitylink.sql +++ /dev/null @@ -1,4 +0,0 @@ -drop index ACT_IDX_ENT_LNK_SCOPE; -drop index ACT_IDX_ENT_LNK_SCOPE_DEF; - -drop table ACT_RU_ENTITYLINK; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/create/flowable.oracle.create.eventsubscription.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/create/flowable.oracle.create.eventsubscription.sql deleted file mode 100644 index eb22164..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/create/flowable.oracle.create.eventsubscription.sql +++ /dev/null @@ -1,28 +0,0 @@ -create table ACT_RU_EVENT_SUBSCR ( - ID_ VARCHAR2(64) not null, - REV_ integer, - EVENT_TYPE_ VARCHAR2(255) not null, - EVENT_NAME_ VARCHAR2(255), - EXECUTION_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - ACTIVITY_ID_ VARCHAR2(64), - CONFIGURATION_ VARCHAR2(255), - CREATED_ TIMESTAMP(6) not null, - PROC_DEF_ID_ VARCHAR2(64), - SUB_SCOPE_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(64), - SCOPE_DEFINITION_ID_ VARCHAR2(64), - SCOPE_DEFINITION_KEY_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(64), - LOCK_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create index ACT_IDX_EVENT_SUBSCR_CONFIG_ on ACT_RU_EVENT_SUBSCR(CONFIGURATION_); -create index ACT_IDX_EVENT_SUBSCR on ACT_RU_EVENT_SUBSCR(EXECUTION_ID_); -create index ACT_IDX_EVENT_SUBSCR_SCOPEREF_ on ACT_RU_EVENT_SUBSCR(SCOPE_ID_, SCOPE_TYPE_); - -insert into ACT_GE_PROPERTY values ('eventsubscription.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/drop/flowable.oracle.drop.eventsubscription.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/drop/flowable.oracle.drop.eventsubscription.sql deleted file mode 100644 index c85ad74..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/eventsubscription/service/db/drop/flowable.oracle.drop.eventsubscription.sql +++ /dev/null @@ -1,5 +0,0 @@ -drop index ACT_IDX_EVENT_SUBSCR_CONFIG_; -drop index ACT_IDX_EVENT_SUBSCR; -drop index ACT_IDX_EVENT_SUBSCR_SCOPEREF_; - -drop table ACT_RU_EVENT_SUBSCR; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.history.sql deleted file mode 100644 index 2305f0a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.history.sql +++ /dev/null @@ -1,20 +0,0 @@ -create table ACT_HI_IDENTITYLINK ( - ID_ VARCHAR2(64), - GROUP_ID_ VARCHAR2(255), - TYPE_ VARCHAR2(255), - USER_ID_ VARCHAR2(255), - TASK_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - PROC_INST_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - primary key (ID_) -); - -create index ACT_IDX_HI_IDENT_LNK_USER on ACT_HI_IDENTITYLINK(USER_ID_); -create index ACT_IDX_HI_IDENT_LNK_SCOPE on ACT_HI_IDENTITYLINK(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_HI_IDENT_LNK_SUB_SCOPE on ACT_HI_IDENTITYLINK(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_HI_IDENT_LNK_SCOPE_DEF on ACT_HI_IDENTITYLINK(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.sql deleted file mode 100644 index e290879..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/create/flowable.oracle.create.identitylink.sql +++ /dev/null @@ -1,24 +0,0 @@ -create table ACT_RU_IDENTITYLINK ( - ID_ VARCHAR2(64), - REV_ INTEGER, - GROUP_ID_ VARCHAR2(255), - TYPE_ VARCHAR2(255), - USER_ID_ VARCHAR2(255), - TASK_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - primary key (ID_) -); - -create index ACT_IDX_IDENT_LNK_USER on ACT_RU_IDENTITYLINK(USER_ID_); -create index ACT_IDX_IDENT_LNK_GROUP on ACT_RU_IDENTITYLINK(GROUP_ID_); -create index ACT_IDX_IDENT_LNK_SCOPE on ACT_RU_IDENTITYLINK(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_IDENT_LNK_SUB_SCOPE on ACT_RU_IDENTITYLINK(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_IDENT_LNK_SCOPE_DEF on ACT_RU_IDENTITYLINK(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -insert into ACT_GE_PROPERTY values ('identitylink.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.history.sql deleted file mode 100644 index 7cff665..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.history.sql +++ /dev/null @@ -1,6 +0,0 @@ -drop index ACT_IDX_HI_IDENT_LNK_USER; -drop index ACT_IDX_HI_IDENT_LNK_SCOPE; -drop index ACT_IDX_HI_IDENT_LNK_SUB_SCOPE; -drop index ACT_IDX_HI_IDENT_LNK_SCOPE_DEF; - -drop table ACT_HI_IDENTITYLINK; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.sql deleted file mode 100644 index 485344a..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/identitylink/service/db/drop/flowable.oracle.drop.identitylink.sql +++ /dev/null @@ -1,7 +0,0 @@ -drop index ACT_IDX_IDENT_LNK_USER; -drop index ACT_IDX_IDENT_LNK_GROUP; -drop index ACT_IDX_IDENT_LNK_SCOPE; -drop index ACT_IDX_IDENT_LNK_SUB_SCOPE; -drop index ACT_IDX_IDENT_LNK_SCOPE_DEF; - -drop table ACT_RU_IDENTITYLINK; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/create/flowable.oracle.create.identity.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/create/flowable.oracle.create.identity.sql deleted file mode 100644 index 562f45e..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/create/flowable.oracle.create.identity.sql +++ /dev/null @@ -1,108 +0,0 @@ -create table ACT_ID_PROPERTY ( - NAME_ VARCHAR2(64), - VALUE_ VARCHAR2(300), - REV_ INTEGER, - primary key (NAME_) -); - -insert into ACT_ID_PROPERTY -values ('schema.version', '7.0.1.1', 1); - -create table ACT_ID_BYTEARRAY ( - ID_ VARCHAR2(64), - REV_ INTEGER, - NAME_ VARCHAR2(255), - BYTES_ BLOB, - primary key (ID_) -); - -create table ACT_ID_GROUP ( - ID_ VARCHAR2(64), - REV_ INTEGER, - NAME_ VARCHAR2(255), - TYPE_ VARCHAR2(255), - primary key (ID_) -); - -create table ACT_ID_MEMBERSHIP ( - USER_ID_ VARCHAR2(64), - GROUP_ID_ VARCHAR2(64), - primary key (USER_ID_, GROUP_ID_) -); - -create table ACT_ID_USER ( - ID_ VARCHAR2(64), - REV_ INTEGER, - FIRST_ VARCHAR2(255), - LAST_ VARCHAR2(255), - DISPLAY_NAME_ VARCHAR2(255), - EMAIL_ VARCHAR2(255), - PWD_ VARCHAR2(255), - PICTURE_ID_ VARCHAR2(64), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create table ACT_ID_INFO ( - ID_ VARCHAR2(64), - REV_ INTEGER, - USER_ID_ VARCHAR2(64), - TYPE_ VARCHAR2(64), - KEY_ VARCHAR2(255), - VALUE_ VARCHAR2(255), - PASSWORD_ BLOB, - PARENT_ID_ VARCHAR2(255), - primary key (ID_) -); - -create table ACT_ID_TOKEN ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - TOKEN_VALUE_ VARCHAR2(255), - TOKEN_DATE_ TIMESTAMP(6), - IP_ADDRESS_ VARCHAR2(255), - USER_AGENT_ VARCHAR2(255), - USER_ID_ VARCHAR2(255), - TOKEN_DATA_ VARCHAR2(2000), - primary key (ID_) -); - -create table ACT_ID_PRIV ( - ID_ VARCHAR2(64) not null, - NAME_ VARCHAR2(255) not null, - primary key (ID_) -); - -create table ACT_ID_PRIV_MAPPING ( - ID_ VARCHAR2(64) not null, - PRIV_ID_ VARCHAR2(64) not null, - USER_ID_ VARCHAR2(255), - GROUP_ID_ VARCHAR2(255), - primary key (ID_) -); - -create index ACT_IDX_MEMB_GROUP on ACT_ID_MEMBERSHIP(GROUP_ID_); -alter table ACT_ID_MEMBERSHIP - add constraint ACT_FK_MEMB_GROUP - foreign key (GROUP_ID_) - references ACT_ID_GROUP (ID_); - -create index ACT_IDX_MEMB_USER on ACT_ID_MEMBERSHIP(USER_ID_); -alter table ACT_ID_MEMBERSHIP - add constraint ACT_FK_MEMB_USER - foreign key (USER_ID_) - references ACT_ID_USER (ID_); - -create index ACT_IDX_PRIV_MAPPING on ACT_ID_PRIV_MAPPING(PRIV_ID_); -alter table ACT_ID_PRIV_MAPPING - add constraint ACT_FK_PRIV_MAPPING - foreign key (PRIV_ID_) - references ACT_ID_PRIV (ID_); - -create index ACT_IDX_PRIV_USER on ACT_ID_PRIV_MAPPING(USER_ID_); -create index ACT_IDX_PRIV_GROUP on ACT_ID_PRIV_MAPPING(GROUP_ID_); - -alter table ACT_ID_PRIV - add constraint ACT_UNIQ_PRIV_NAME - unique (NAME_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/drop/flowable.oracle.drop.identity.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/drop/flowable.oracle.drop.identity.sql deleted file mode 100644 index 5cac418..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/idm/db/drop/flowable.oracle.drop.identity.sql +++ /dev/null @@ -1,22 +0,0 @@ -alter table ACT_ID_MEMBERSHIP - drop CONSTRAINT ACT_FK_MEMB_GROUP; - -alter table ACT_ID_MEMBERSHIP - drop CONSTRAINT ACT_FK_MEMB_USER; - -alter table ACT_ID_PRIV_MAPPING - drop CONSTRAINT ACT_FK_PRIV_MAPPING; - -drop index ACT_IDX_MEMB_GROUP; -drop index ACT_IDX_MEMB_USER; -drop index ACT_IDX_PRIV_MAPPING; - -drop table ACT_ID_PROPERTY; -drop table ACT_ID_BYTEARRAY; -drop table ACT_ID_INFO; -drop table ACT_ID_MEMBERSHIP; -drop table ACT_ID_GROUP; -drop table ACT_ID_USER; -drop table ACT_ID_TOKEN; -drop table ACT_ID_PRIV; -drop table ACT_ID_PRIV_MAPPING; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/create/flowable.oracle.create.job.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/create/flowable.oracle.create.job.sql deleted file mode 100644 index 8b3e79b..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/create/flowable.oracle.create.job.sql +++ /dev/null @@ -1,261 +0,0 @@ -create table ACT_RU_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - TYPE_ VARCHAR2(255) NOT NULL, - LOCK_EXP_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - EXCLUSIVE_ NUMBER(1) CHECK (EXCLUSIVE_ IN (1,0)), - EXECUTION_ID_ VARCHAR2(64), - PROCESS_INSTANCE_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - ELEMENT_ID_ VARCHAR2(255), - ELEMENT_NAME_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - CORRELATION_ID_ VARCHAR2(255), - RETRIES_ INTEGER, - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - DUEDATE_ TIMESTAMP(6), - REPEAT_ VARCHAR2(255), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_TIMER_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - TYPE_ VARCHAR2(255) NOT NULL, - LOCK_EXP_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - EXCLUSIVE_ NUMBER(1) CHECK (EXCLUSIVE_ IN (1,0)), - EXECUTION_ID_ VARCHAR2(64), - PROCESS_INSTANCE_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - ELEMENT_ID_ VARCHAR2(255), - ELEMENT_NAME_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - CORRELATION_ID_ VARCHAR2(255), - RETRIES_ INTEGER, - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - DUEDATE_ TIMESTAMP(6), - REPEAT_ VARCHAR2(255), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_SUSPENDED_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - TYPE_ VARCHAR2(255) NOT NULL, - EXCLUSIVE_ NUMBER(1) CHECK (EXCLUSIVE_ IN (1,0)), - EXECUTION_ID_ VARCHAR2(64), - PROCESS_INSTANCE_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - ELEMENT_ID_ VARCHAR2(255), - ELEMENT_NAME_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - CORRELATION_ID_ VARCHAR2(255), - RETRIES_ INTEGER, - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - DUEDATE_ TIMESTAMP(6), - REPEAT_ VARCHAR2(255), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_DEADLETTER_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - TYPE_ VARCHAR2(255) NOT NULL, - EXCLUSIVE_ NUMBER(1) CHECK (EXCLUSIVE_ IN (1,0)), - EXECUTION_ID_ VARCHAR2(64), - PROCESS_INSTANCE_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - ELEMENT_ID_ VARCHAR2(255), - ELEMENT_NAME_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - CORRELATION_ID_ VARCHAR2(255), - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - DUEDATE_ TIMESTAMP(6), - REPEAT_ VARCHAR2(255), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_HISTORY_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - LOCK_EXP_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - RETRIES_ INTEGER, - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - ADV_HANDLER_CFG_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - SCOPE_TYPE_ VARCHAR2(255), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create table ACT_RU_EXTERNAL_JOB ( - ID_ VARCHAR2(64) NOT NULL, - REV_ INTEGER, - CATEGORY_ VARCHAR2(255), - TYPE_ VARCHAR2(255) NOT NULL, - LOCK_EXP_TIME_ TIMESTAMP(6), - LOCK_OWNER_ VARCHAR2(255), - EXCLUSIVE_ NUMBER(1) CHECK (EXCLUSIVE_ IN (1,0)), - EXECUTION_ID_ VARCHAR2(64), - PROCESS_INSTANCE_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - ELEMENT_ID_ VARCHAR2(255), - ELEMENT_NAME_ VARCHAR2(255), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - CORRELATION_ID_ VARCHAR2(255), - RETRIES_ INTEGER, - EXCEPTION_STACK_ID_ VARCHAR2(64), - EXCEPTION_MSG_ VARCHAR2(2000), - DUEDATE_ TIMESTAMP(6), - REPEAT_ VARCHAR2(255), - HANDLER_TYPE_ VARCHAR2(255), - HANDLER_CFG_ VARCHAR2(2000), - CUSTOM_VALUES_ID_ VARCHAR2(64), - CREATE_TIME_ TIMESTAMP(6), - TENANT_ID_ VARCHAR2(255) DEFAULT '', - primary key (ID_) -); - -create index ACT_IDX_JOB_EXCEPTION on ACT_RU_JOB(EXCEPTION_STACK_ID_); -create index ACT_IDX_JOB_CUSTOM_VAL_ID on ACT_RU_JOB(CUSTOM_VALUES_ID_); -create index ACT_IDX_JOB_CORRELATION_ID on ACT_RU_JOB(CORRELATION_ID_); - -create index ACT_IDX_TJOB_EXCEPTION on ACT_RU_TIMER_JOB(EXCEPTION_STACK_ID_); -create index ACT_IDX_TJOB_CUSTOM_VAL_ID on ACT_RU_TIMER_JOB(CUSTOM_VALUES_ID_); -create index ACT_IDX_TJOB_CORRELATION_ID on ACT_RU_TIMER_JOB(CORRELATION_ID_); -create index ACT_IDX_TJOB_DUEDATE on ACT_RU_TIMER_JOB(DUEDATE_); - -create index ACT_IDX_SJOB_EXCEPTION on ACT_RU_SUSPENDED_JOB(EXCEPTION_STACK_ID_); -create index ACT_IDX_SJOB_CUSTOM_VAL_ID on ACT_RU_SUSPENDED_JOB(CUSTOM_VALUES_ID_); -create index ACT_IDX_SJOB_CORRELATION_ID on ACT_RU_SUSPENDED_JOB(CORRELATION_ID_); - -create index ACT_IDX_DJOB_EXCEPTION on ACT_RU_DEADLETTER_JOB(EXCEPTION_STACK_ID_); -create index ACT_IDX_DJOB_CUSTOM_VAL_ID on ACT_RU_DEADLETTER_JOB(CUSTOM_VALUES_ID_); -create index ACT_IDX_DJOB_CORRELATION_ID on ACT_RU_DEADLETTER_JOB(CORRELATION_ID_); - -create index ACT_IDX_EJOB_EXCEPTION on ACT_RU_EXTERNAL_JOB(EXCEPTION_STACK_ID_); -create index ACT_IDX_EJOB_CUSTOM_VAL_ID on ACT_RU_EXTERNAL_JOB(CUSTOM_VALUES_ID_); -create index ACT_IDX_EJOB_CORRELATION_ID on ACT_RU_EXTERNAL_JOB(CORRELATION_ID_); - -alter table ACT_RU_JOB - add constraint ACT_FK_JOB_EXCEPTION - foreign key (EXCEPTION_STACK_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_JOB - add constraint ACT_FK_JOB_CUSTOM_VAL - foreign key (CUSTOM_VALUES_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_TIMER_JOB - add constraint ACT_FK_TJOB_EXCEPTION - foreign key (EXCEPTION_STACK_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_TIMER_JOB - add constraint ACT_FK_TJOB_CUSTOM_VAL - foreign key (CUSTOM_VALUES_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_SUSPENDED_JOB - add constraint ACT_FK_SJOB_EXCEPTION - foreign key (EXCEPTION_STACK_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_SUSPENDED_JOB - add constraint ACT_FK_SJOB_CUSTOM_VAL - foreign key (CUSTOM_VALUES_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_DEADLETTER_JOB - add constraint ACT_FK_DJOB_EXCEPTION - foreign key (EXCEPTION_STACK_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_DEADLETTER_JOB - add constraint ACT_FK_DJOB_CUSTOM_VAL - foreign key (CUSTOM_VALUES_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_EXTERNAL_JOB - add constraint ACT_FK_EJOB_EXCEPTION - foreign key (EXCEPTION_STACK_ID_) - references ACT_GE_BYTEARRAY (ID_); - -alter table ACT_RU_EXTERNAL_JOB - add constraint ACT_FK_EJOB_CUSTOM_VAL - foreign key (CUSTOM_VALUES_ID_) - references ACT_GE_BYTEARRAY (ID_); - -create index ACT_IDX_JOB_SCOPE on ACT_RU_JOB(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_JOB_SUB_SCOPE on ACT_RU_JOB(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_JOB_SCOPE_DEF on ACT_RU_JOB(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -create index ACT_IDX_TJOB_SCOPE on ACT_RU_TIMER_JOB(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_TJOB_SUB_SCOPE on ACT_RU_TIMER_JOB(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_TJOB_SCOPE_DEF on ACT_RU_TIMER_JOB(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -create index ACT_IDX_SJOB_SCOPE on ACT_RU_SUSPENDED_JOB(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_SJOB_SUB_SCOPE on ACT_RU_SUSPENDED_JOB(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_SJOB_SCOPE_DEF on ACT_RU_SUSPENDED_JOB(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -create index ACT_IDX_DJOB_SCOPE on ACT_RU_DEADLETTER_JOB(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_DJOB_SUB_SCOPE on ACT_RU_DEADLETTER_JOB(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_DJOB_SCOPE_DEF on ACT_RU_DEADLETTER_JOB(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -create index ACT_IDX_EJOB_SCOPE on ACT_RU_EXTERNAL_JOB(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_EJOB_SUB_SCOPE on ACT_RU_EXTERNAL_JOB(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_EJOB_SCOPE_DEF on ACT_RU_EXTERNAL_JOB(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -insert into ACT_GE_PROPERTY values ('job.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/drop/flowable.oracle.drop.job.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/drop/flowable.oracle.drop.job.sql deleted file mode 100644 index a219e97..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/job/service/db/drop/flowable.oracle.drop.job.sql +++ /dev/null @@ -1,74 +0,0 @@ -drop index ACT_IDX_JOB_SCOPE; -drop index ACT_IDX_JOB_SUB_SCOPE; -drop index ACT_IDX_JOB_SCOPE_DEF; -drop index ACT_IDX_TJOB_SCOPE; -drop index ACT_IDX_TJOB_SUB_SCOPE; -drop index ACT_IDX_TJOB_SCOPE_DEF; -drop index ACT_IDX_SJOB_SCOPE; -drop index ACT_IDX_SJOB_SUB_SCOPE; -drop index ACT_IDX_SJOB_SCOPE_DEF; -drop index ACT_IDX_DJOB_SCOPE; -drop index ACT_IDX_DJOB_SUB_SCOPE; -drop index ACT_IDX_DJOB_SCOPE_DEF; -drop index ACT_IDX_EJOB_SCOPE; -drop index ACT_IDX_EJOB_SUB_SCOPE; -drop index ACT_IDX_EJOB_SCOPE_DEF; - -drop index ACT_IDX_JOB_EXCEPTION; -drop index ACT_IDX_JOB_CUSTOM_VAL_ID; -drop index ACT_IDX_JOB_CORRELATION_ID; - -drop index ACT_IDX_TJOB_EXCEPTION; -drop index ACT_IDX_TJOB_CUSTOM_VAL_ID; -drop index ACT_IDX_TJOB_CORRELATION_ID; -drop index ACT_IDX_TJOB_DUEDATE; - -drop index ACT_IDX_SJOB_EXCEPTION; -drop index ACT_IDX_SJOB_CUSTOM_VAL_ID; -drop index ACT_IDX_SJOB_CORRELATION_ID; - -drop index ACT_IDX_DJOB_EXCEPTION; -drop index ACT_IDX_DJOB_CUSTOM_VAL_ID; -drop index ACT_IDX_DJOB_CORRELATION_ID; - -drop index ACT_IDX_EJOB_EXCEPTION; -drop index ACT_IDX_EJOB_CUSTOM_VAL_ID; -drop index ACT_IDX_EJOB_CORRELATION_ID; - -alter table ACT_RU_JOB - drop CONSTRAINT ACT_FK_JOB_EXCEPTION; - -alter table ACT_RU_JOB - drop CONSTRAINT ACT_FK_JOB_CUSTOM_VAL; - -alter table ACT_RU_TIMER_JOB - drop CONSTRAINT ACT_FK_TJOB_EXCEPTION; - -alter table ACT_RU_TIMER_JOB - drop CONSTRAINT ACT_FK_TJOB_CUSTOM_VAL; - -alter table ACT_RU_SUSPENDED_JOB - drop CONSTRAINT ACT_FK_SJOB_EXCEPTION; - -alter table ACT_RU_SUSPENDED_JOB - drop CONSTRAINT ACT_FK_SJOB_CUSTOM_VAL; - -alter table ACT_RU_DEADLETTER_JOB - drop CONSTRAINT ACT_FK_DJOB_EXCEPTION; - -alter table ACT_RU_DEADLETTER_JOB - drop CONSTRAINT ACT_FK_DJOB_CUSTOM_VAL; - -alter table ACT_RU_EXTERNAL_JOB - drop CONSTRAINT ACT_FK_DJOB_EXCEPTION; - -alter table ACT_RU_EXTERNAL_JOB - drop CONSTRAINT ACT_FK_DJOB_CUSTOM_VAL; - -drop table ACT_RU_JOB; -drop table ACT_RU_TIMER_JOB; -drop table ACT_RU_SUSPENDED_JOB; -drop table ACT_RU_DEADLETTER_JOB; -drop table ACT_RU_HISTORY_JOB; -drop table ACT_RU_EXTERNAL_JOB; - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.history.sql deleted file mode 100644 index 1651c0c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.history.sql +++ /dev/null @@ -1,64 +0,0 @@ -create table ACT_HI_TASKINST ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER default 1, - PROC_DEF_ID_ VARCHAR2(64), - TASK_DEF_ID_ VARCHAR2(64), - TASK_DEF_KEY_ VARCHAR2(255), - PROC_INST_ID_ VARCHAR2(64), - EXECUTION_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - PROPAGATED_STAGE_INST_ID_ VARCHAR2(255), - PARENT_TASK_ID_ VARCHAR2(64), - STATE_ VARCHAR2(255), - NAME_ VARCHAR2(255), - DESCRIPTION_ VARCHAR2(2000), - OWNER_ VARCHAR2(255), - ASSIGNEE_ VARCHAR2(255), - START_TIME_ TIMESTAMP(6) not null, - IN_PROGRESS_TIME_ TIMESTAMP(6), - IN_PROGRESS_STARTED_BY_ VARCHAR2(255), - CLAIM_TIME_ TIMESTAMP(6), - CLAIMED_BY_ VARCHAR2(255), - SUSPENDED_TIME_ TIMESTAMP(6), - SUSPENDED_BY_ VARCHAR2(255), - END_TIME_ TIMESTAMP(6), - COMPLETED_BY_ VARCHAR2(255), - DURATION_ NUMBER(19,0), - DELETE_REASON_ VARCHAR2(2000), - PRIORITY_ INTEGER, - IN_PROGRESS_DUE_DATE_ TIMESTAMP(6), - DUE_DATE_ TIMESTAMP(6), - FORM_KEY_ VARCHAR2(255), - CATEGORY_ VARCHAR2(255), - TENANT_ID_ VARCHAR2(255) default '', - LAST_UPDATED_TIME_ TIMESTAMP(6), - primary key (ID_) -); - -create table ACT_HI_TSK_LOG ( - ID_ NUMBER(19), - TYPE_ VARCHAR2(64), - TASK_ID_ VARCHAR2(64) not null, - TIME_STAMP_ TIMESTAMP(6) not null, - USER_ID_ VARCHAR2(255), - DATA_ VARCHAR2(2000), - EXECUTION_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - TENANT_ID_ VARCHAR2(255) default '', - primary key (ID_) -); - -create sequence act_hi_task_evt_log_seq start with 1 increment by 1; - -create index ACT_IDX_HI_TASK_SCOPE on ACT_HI_TASKINST(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_HI_TASK_SUB_SCOPE on ACT_HI_TASKINST(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_HI_TASK_SCOPE_DEF on ACT_HI_TASKINST(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.sql deleted file mode 100644 index 9430a1c..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/create/flowable.oracle.create.task.sql +++ /dev/null @@ -1,48 +0,0 @@ -create table ACT_RU_TASK ( - ID_ VARCHAR2(64), - REV_ INTEGER, - EXECUTION_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - PROC_DEF_ID_ VARCHAR2(64), - TASK_DEF_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - SCOPE_DEFINITION_ID_ VARCHAR2(255), - PROPAGATED_STAGE_INST_ID_ VARCHAR2(255), - STATE_ VARCHAR2(255), - NAME_ VARCHAR2(255), - PARENT_TASK_ID_ VARCHAR2(64), - DESCRIPTION_ VARCHAR2(2000), - TASK_DEF_KEY_ VARCHAR2(255), - OWNER_ VARCHAR2(255), - ASSIGNEE_ VARCHAR2(255), - DELEGATION_ VARCHAR2(64), - PRIORITY_ INTEGER, - CREATE_TIME_ TIMESTAMP(6), - IN_PROGRESS_TIME_ TIMESTAMP(6), - IN_PROGRESS_STARTED_BY_ VARCHAR2(255), - CLAIM_TIME_ TIMESTAMP(6), - CLAIMED_BY_ VARCHAR2(255), - SUSPENDED_TIME_ TIMESTAMP(6), - SUSPENDED_BY_ VARCHAR2(255), - IN_PROGRESS_DUE_DATE_ TIMESTAMP(6), - DUE_DATE_ TIMESTAMP(6), - CATEGORY_ VARCHAR2(255), - SUSPENSION_STATE_ INTEGER, - TENANT_ID_ VARCHAR2(255) DEFAULT '', - FORM_KEY_ VARCHAR2(255), - IS_COUNT_ENABLED_ NUMBER(1) CHECK (IS_COUNT_ENABLED_ IN (1,0)), - VAR_COUNT_ INTEGER, - ID_LINK_COUNT_ INTEGER, - SUB_TASK_COUNT_ INTEGER, - primary key (ID_) -); - -create index ACT_IDX_TASK_CREATE on ACT_RU_TASK(CREATE_TIME_); -create index ACT_IDX_TASK_SCOPE on ACT_RU_TASK(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_TASK_SUB_SCOPE on ACT_RU_TASK(SUB_SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_TASK_SCOPE_DEF on ACT_RU_TASK(SCOPE_DEFINITION_ID_, SCOPE_TYPE_); - -insert into ACT_GE_PROPERTY values ('task.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.history.sql deleted file mode 100644 index c5ce7bb..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.history.sql +++ /dev/null @@ -1,8 +0,0 @@ -drop index ACT_IDX_HI_TASK_SCOPE; -drop index ACT_IDX_HI_TASK_SUB_SCOPE; -drop index ACT_IDX_HI_TASK_SCOPE_DEF; - -drop sequence act_hi_task_evt_log_seq; - -drop table ACT_HI_TASKINST; -drop table ACT_HI_TSK_LOG; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.sql deleted file mode 100644 index 9ecd1e9..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/task/service/db/drop/flowable.oracle.drop.task.sql +++ /dev/null @@ -1,6 +0,0 @@ -drop index ACT_IDX_TASK_CREATE; -drop index ACT_IDX_TASK_SCOPE; -drop index ACT_IDX_TASK_SUB_SCOPE; -drop index ACT_IDX_TASK_SCOPE_DEF; - -drop table ACT_RU_TASK; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.history.sql deleted file mode 100644 index 3d9b50f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.history.sql +++ /dev/null @@ -1,26 +0,0 @@ -create table ACT_HI_VARINST ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER default 1, - PROC_INST_ID_ VARCHAR2(64), - EXECUTION_ID_ VARCHAR2(64), - TASK_ID_ VARCHAR2(64), - NAME_ VARCHAR2(255) not null, - VAR_TYPE_ VARCHAR2(100), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - BYTEARRAY_ID_ VARCHAR2(64), - DOUBLE_ NUMBER(38,10), - LONG_ NUMBER(19,0), - TEXT_ VARCHAR2(2000), - TEXT2_ VARCHAR2(2000), - META_INFO_ VARCHAR2(2000), - CREATE_TIME_ TIMESTAMP(6), - LAST_UPDATED_TIME_ TIMESTAMP(6), - primary key (ID_) -); - -create index ACT_IDX_HI_PROCVAR_NAME_TYPE on ACT_HI_VARINST(NAME_, VAR_TYPE_); -create index ACT_IDX_HI_VAR_SCOPE_ID_TYPE on ACT_HI_VARINST(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_HI_VAR_SUB_ID_TYPE on ACT_HI_VARINST(SUB_SCOPE_ID_, SCOPE_TYPE_); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.sql deleted file mode 100644 index 7c02f7f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/create/flowable.oracle.create.variable.sql +++ /dev/null @@ -1,31 +0,0 @@ -create table ACT_RU_VARIABLE ( - ID_ VARCHAR2(64) not null, - REV_ INTEGER, - TYPE_ VARCHAR2(255) not null, - NAME_ VARCHAR2(255) not null, - EXECUTION_ID_ VARCHAR2(64), - PROC_INST_ID_ VARCHAR2(64), - TASK_ID_ VARCHAR2(64), - SCOPE_ID_ VARCHAR2(255), - SUB_SCOPE_ID_ VARCHAR2(255), - SCOPE_TYPE_ VARCHAR2(255), - BYTEARRAY_ID_ VARCHAR2(64), - DOUBLE_ NUMBER(38,10), - LONG_ NUMBER(19,0), - TEXT_ VARCHAR2(2000), - TEXT2_ VARCHAR2(2000), - META_INFO_ VARCHAR2(2000), - primary key (ID_) -); - -create index ACT_IDX_RU_VAR_SCOPE_ID_TYPE on ACT_RU_VARIABLE(SCOPE_ID_, SCOPE_TYPE_); -create index ACT_IDX_RU_VAR_SUB_ID_TYPE on ACT_RU_VARIABLE(SUB_SCOPE_ID_, SCOPE_TYPE_); - -create index ACT_IDX_VAR_BYTEARRAY on ACT_RU_VARIABLE(BYTEARRAY_ID_); -alter table ACT_RU_VARIABLE - add constraint ACT_FK_VAR_BYTEARRAY - foreign key (BYTEARRAY_ID_) - references ACT_GE_BYTEARRAY (ID_); - -insert into ACT_GE_PROPERTY values ('variable.schema.version', '7.0.1.1', 1); - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.history.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.history.sql deleted file mode 100644 index efcc68d..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.history.sql +++ /dev/null @@ -1,6 +0,0 @@ -drop index ACT_IDX_HI_PROCVAR_NAME_TYPE; -drop index ACT_IDX_HI_VAR_SCOPE_ID_TYPE; -drop index ACT_IDX_HI_VAR_SUB_ID_TYPE; - -drop table ACT_HI_VARINST; - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.sql b/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.sql deleted file mode 100644 index 0d0a95f..0000000 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/org/flowable/variable/service/db/drop/flowable.oracle.drop.variable.sql +++ /dev/null @@ -1,9 +0,0 @@ -drop index ACT_IDX_VAR_BYTEARRAY; -drop index ACT_IDX_RU_VAR_SCOPE_ID_TYPE; -drop index ACT_IDX_RU_VAR_SUB_ID_TYPE; - -alter table ACT_RU_VARIABLE - drop CONSTRAINT ACT_FK_VAR_BYTEARRAY; - -drop table ACT_RU_VARIABLE; - From 809c7eabd4bd4c1c155762a3d8d4ae3f6f027df4 Mon Sep 17 00:00:00 2001 From: ranke <213539@qq.com> Date: Fri, 30 Jan 2026 14:19:28 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9maven=E7=A7=81=E6=9C=8D?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 6e7f004..92f3597 100644 --- a/pom.xml +++ b/pom.xml @@ -194,7 +194,7 @@ ZT 中铜 ZStack ç§æœ - http://172.16.46.63:30708/repository/prod/ + http://172.16.46.63:30708/repository/zt-cloud/ always warn @@ -210,13 +210,13 @@ ZT 中铜 ZStack ç§æœ - http://172.16.46.63:30708/repository/prod/ + http://172.16.46.63:30708/repository/test/ - - - - - + + ZT-snap + 中铜 ZStack ç§æœ + http://172.16.46.63:30708/repository/test-snap/ + From f0df2ceec7efcb385b697fd67a44d41606119bb3 Mon Sep 17 00:00:00 2001 From: ranke <213539@qq.com> Date: Fri, 30 Jan 2026 14:26:59 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zt-module-bpm/zt-module-bpm-server/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zt-module-bpm/zt-module-bpm-server/Dockerfile b/zt-module-bpm/zt-module-bpm-server/Dockerfile index bdad078..15dcc95 100644 --- a/zt-module-bpm/zt-module-bpm-server/Dockerfile +++ b/zt-module-bpm/zt-module-bpm-server/Dockerfile @@ -1,12 +1,12 @@ ## AdoptOpenJDK åœæ­¢å‘布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,æä¾›æ›´å¥½çš„稳定性 -FROM 172.17.19.16:10043/zt-cloud-base-service/eclipse-temurin:21-jre +FROM 172.16.46.66:10043/base-service/eclipse-temurin:21-jre ## 创建目录,并使用它作为工作目录 RUN mkdir -p /zt-module-bpm-server WORKDIR /zt-module-bpm-server ## å°†åŽç«¯é¡¹ç›®çš„ Jar 文件,å¤åˆ¶åˆ°é•œåƒä¸­ -COPY ./target/zt-module-bpm-server.jar app.jar +COPY ./target/zt-module-bpm-server-dsc.jar app.jar ## 设置 TZ 时区 ## 设置 JAVA_OPTS 环境å˜é‡ï¼Œå¯é€šè¿‡ docker run -e "JAVA_OPTS=" 进行覆盖 From d1cd1817a124b9822f11073e8a450a868eeda15e Mon Sep 17 00:00:00 2001 From: ranke <213539@qq.com> Date: Fri, 30 Jan 2026 14:43:08 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deployment.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment.yaml b/deployment.yaml index 5e7c7ba..f007301 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -2,7 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - namespace: ns-766b45fbd7464ccb86d5fd046054cf0a + namespace: ns-f16a3067ca7b434aad127d15eac82503 name: zt-module-bpm labels: app: zt-module-bpm @@ -22,7 +22,7 @@ spec: spec: containers: - name: zt-module-bpm - image: 172.17.19.16:10043/zt-jygk/dsc-bpm:VERSION_PLACEHOLDER + image: 172.16.46.66:10043/zt/dsc-bpm:VERSION_PLACEHOLDER imagePullPolicy: Always env: - name: TZ @@ -65,7 +65,7 @@ spec: apiVersion: v1 kind: Service metadata: - namespace: ns-766b45fbd7464ccb86d5fd046054cf0a + namespace: ns-f16a3067ca7b434aad127d15eac82503 name: zt-module-bpm spec: type: NodePort From 667ee852dac79c88662922894e02629ef6ef2117 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Fri, 30 Jan 2026 17:45:14 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zt-module-bpm/zt-module-bpm-server/pom.xml | 84 ---------------------- 1 file changed, 84 deletions(-) diff --git a/zt-module-bpm/zt-module-bpm-server/pom.xml b/zt-module-bpm/zt-module-bpm-server/pom.xml index cebf709..50a159d 100644 --- a/zt-module-bpm/zt-module-bpm-server/pom.xml +++ b/zt-module-bpm/zt-module-bpm-server/pom.xml @@ -60,90 +60,6 @@ zt-module-qms-api ${business.qms.version} - - - com.zt.plat - zt-spring-boot-starter-biz-data-permission - - - com.zt.plat - zt-spring-boot-starter-biz-tenant - - - - - com.zt.plat - zt-spring-boot-starter-security - - - - - com.zt.plat - zt-spring-boot-starter-mybatis - - - - com.zt.plat - zt-spring-boot-starter-redis - - - - - com.zt.plat - zt-spring-boot-starter-rpc - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - - - - - - - - com.zt.plat - zt-spring-boot-starter-test - - - - - com.zt.plat - zt-spring-boot-starter-monitor - - - - - com.zt.plat - zt-spring-boot-starter-excel - - - - - org.flowable - flowable-spring-boot-starter-process - - - org.flowable - flowable-spring-boot-starter-actuator - - - com.zt.plat - zt-spring-boot-starter-biz-business - ${revision} - compile - From 82ceb1f18b757aa7c1591970195d2fdd4f07f847 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Tue, 3 Feb 2026 10:36:45 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=9D=E7=95=99=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E7=9A=84=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zt-module-bpm/zt-module-bpm-server/pom.xml | 12 + .../druid/pool/DruidPooledStatement.java | 7 +- .../rpc/config/RpcConfiguration.java | 8 +- .../liquibase/datatype/core/BooleanType.java | 1 + .../datatype/core/DmBooleanType.java | 32 + .../snapshot/JdbcDatabaseSnapshot.java | 1957 +++++++++++++++++ .../impl/AbstractEngineConfiguration.java | 84 +- .../engine/impl/db/DbSqlSessionFactory.java | 394 ++++ 8 files changed, 2478 insertions(+), 17 deletions(-) create mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java create mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java create mode 100644 zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java diff --git a/zt-module-bpm/zt-module-bpm-server/pom.xml b/zt-module-bpm/zt-module-bpm-server/pom.xml index a897263..e1928c0 100644 --- a/zt-module-bpm/zt-module-bpm-server/pom.xml +++ b/zt-module-bpm/zt-module-bpm-server/pom.xml @@ -123,6 +123,18 @@ ${revision} compile + + com.zt.plat + zt-module-qms-api + ${revision} + compile + + + com.zt.plat + zt-module-product-api + ${revision} + compile + diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java index fe4cc83..1c86d9e 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java @@ -11,9 +11,12 @@ import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.JdbcUtils; import com.alibaba.druid.util.MySqlUtils; - import java.net.SocketTimeoutException; -import java.sql.*; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java index 28a1b0f..d4dff89 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/rpc/config/RpcConfiguration.java @@ -1,6 +1,11 @@ package com.zt.plat.module.bpm.framework.rpc.config; +import com.zt.plat.module.capital.api.splyAmountRequest.AmountRequestApi; import com.zt.plat.module.capital.api.splyAmtCrdtAppl.AmountCreditApplyApi; +import com.zt.plat.module.product.api.MesProcessRoutApi; +import com.zt.plat.module.product.api.plan.MesCompanyPlanApi; +import com.zt.plat.module.product.api.plan.MesFactoryPlanApi; +import com.zt.plat.module.qms.api.task.QmsApi; import com.zt.plat.module.system.api.dept.DeptApi; import com.zt.plat.module.system.api.dept.PostApi; import com.zt.plat.module.system.api.dict.DictDataApi; @@ -13,6 +18,7 @@ import org.springframework.context.annotation.Configuration; @Configuration(value = "bpmRpcConfiguration", proxyBeanMethods = false) @EnableFeignClients(clients = {RoleApi.class, DeptApi.class, PostApi.class, AdminUserApi.class, SmsSendApi.class, DictDataApi.class, - PermissionApi.class, AmountCreditApplyApi.class}) + PermissionApi.class, AmountCreditApplyApi.class, MesCompanyPlanApi.class, MesFactoryPlanApi.class, MesProcessRoutApi.class, + QmsApi.class, AmountRequestApi.class}) public class RpcConfiguration { } diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java index b2c55f0..6f57410 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/BooleanType.java @@ -11,6 +11,7 @@ import liquibase.statement.DatabaseFunction; import liquibase.util.StringUtil; import java.util.Locale; +import java.util.regex.Pattern; @DataTypeInfo(name = "boolean", aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"}, minParameters = 0, maxParameters = 0, priority = LiquibaseDataType.PRIORITY_DEFAULT) public class BooleanType extends LiquibaseDataType { diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java new file mode 100644 index 0000000..7f66250 --- /dev/null +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/datatype/core/DmBooleanType.java @@ -0,0 +1,32 @@ +package liquibase.datatype.core; + +import liquibase.database.Database; +import liquibase.database.core.DmDatabase; +import liquibase.datatype.DataTypeInfo; +import liquibase.datatype.DatabaseDataType; + +@DataTypeInfo( + name = "boolean", + aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"}, + minParameters = 0, + maxParameters = 0, + priority = 2 +) +public class DmBooleanType extends BooleanType { + + @Override + public boolean supports(Database database) { + if (database instanceof DmDatabase) { + return true; + } + return super.supports(database); + } + + @Override + public DatabaseDataType toDatabaseDataType(Database database) { + if (database instanceof DmDatabase) { + return new DatabaseDataType("NUMBER", 1); + } + return super.toDatabaseDataType(database); + } +} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java new file mode 100644 index 0000000..1e0a40e --- /dev/null +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java @@ -0,0 +1,1957 @@ +package liquibase.snapshot; + +import liquibase.CatalogAndSchema; +import liquibase.Scope; +import liquibase.database.AbstractJdbcDatabase; +import liquibase.database.Database; +import liquibase.database.DatabaseConnection; +import liquibase.database.LiquibaseTableNamesFactory; +import liquibase.database.core.*; +import liquibase.database.jvm.JdbcConnection; +import liquibase.exception.DatabaseException; +import liquibase.executor.jvm.ColumnMapRowMapper; +import liquibase.executor.jvm.RowMapperNotNullConstraintsResultSetExtractor; +import liquibase.structure.DatabaseObject; +import liquibase.structure.core.Catalog; +import liquibase.structure.core.Schema; +import liquibase.structure.core.Table; +import liquibase.structure.core.View; +import liquibase.util.JdbcUtil; +import liquibase.util.StringUtil; + +import java.sql.*; +import java.util.*; + +public class JdbcDatabaseSnapshot extends DatabaseSnapshot { + + private boolean warnedAboutDbaRecycleBin; + private static final boolean ignoreWarnAboutDbaRecycleBin = Boolean.getBoolean("liquibase.ignoreRecycleBinWarning"); + + private CachingDatabaseMetaData cachingDatabaseMetaData; + + private Map cachedExpressionMap = null; + + private Set userDefinedTypes; + + public JdbcDatabaseSnapshot(DatabaseObject[] examples, Database database, SnapshotControl snapshotControl) throws DatabaseException, InvalidExampleException { + super(examples, database, snapshotControl); + } + + public JdbcDatabaseSnapshot(DatabaseObject[] examples, Database database) throws DatabaseException, InvalidExampleException { + super(examples, database); + } + + public CachingDatabaseMetaData getMetaDataFromCache() throws SQLException { + if (cachingDatabaseMetaData == null) { + DatabaseMetaData databaseMetaData = null; + if (getDatabase().getConnection() != null) { + databaseMetaData = ((JdbcConnection) getDatabase().getConnection()).getUnderlyingConnection().getMetaData(); + } + + cachingDatabaseMetaData = new CachingDatabaseMetaData(this.getDatabase(), databaseMetaData); + } + return cachingDatabaseMetaData; + } + + public class CachingDatabaseMetaData { + private static final String SQL_FILTER_MATCH_ALL = "%"; + private final DatabaseMetaData databaseMetaData; + private final Database database; + + public CachingDatabaseMetaData(Database database, DatabaseMetaData metaData) { + this.databaseMetaData = metaData; + this.database = database; + } + + public java.sql.DatabaseMetaData getDatabaseMetaData() { + return databaseMetaData; + } + + public List getForeignKeys(final String catalogName, final String schemaName, final String tableName, + final String fkName) throws DatabaseException { + ForeignKeysResultSetCache foreignKeysResultSetCache = new ForeignKeysResultSetCache(database, catalogName, schemaName, tableName, fkName); + ResultSetCache importedKeys = getResultSetCache("getImportedKeys"); + importedKeys.setBulkTracking(!(database instanceof MSSQLDatabase)); + + return importedKeys.get(foreignKeysResultSetCache); + } + + public List getIndexInfo(final String catalogName, final String schemaName, final String tableName, final String indexName) throws DatabaseException, SQLException { + + return getResultSetCache("getIndexInfo").get(new ResultSetCache.UnionResultSetExtractor(database) { + + public boolean isBulkFetchMode; + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME"), row.getString("INDEX_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, indexName); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return getAllCatalogsStringScratchData() != null && database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEM"); + } + + @Override + public List fastFetch() throws SQLException, DatabaseException { + List returnList = new ArrayList<>(); + + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + if (database instanceof OracleDatabase) { + warnAboutDbaRecycleBin(); + + //oracle getIndexInfo is buggy and slow. See Issue 1824548 and http://forums.oracle.com/forums/thread.jspa?messageID=578383򍍏 + String sql = + "SELECT " + + "c.INDEX_NAME, " + + "3 AS TYPE, " + + "c.TABLE_OWNER AS TABLE_SCHEM, " + + "c.TABLE_NAME, " + + "c.COLUMN_NAME, " + + "c.COLUMN_POSITION AS ORDINAL_POSITION, " + + "NULL AS FILTER_CONDITION, " + + "c.INDEX_OWNER, " + + "CASE I.UNIQUENESS WHEN 'UNIQUE' THEN 0 ELSE 1 END AS NON_UNIQUE, " + + "CASE c.DESCEND WHEN 'Y' THEN 'D' WHEN 'DESC' THEN 'D' WHEN 'N' THEN 'A' WHEN 'ASC' THEN 'A' END AS ASC_OR_DESC, " + + "CASE WHEN tablespace_name = (SELECT default_tablespace FROM user_users) " + + "THEN NULL ELSE tablespace_name END AS tablespace_name " + + "FROM ALL_IND_COLUMNS c " + + "JOIN ALL_INDEXES i ON i.owner=c.index_owner AND i.index_name = c.index_name and i.table_owner = c.table_owner " + + "LEFT OUTER JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=c.table_name "; + if (!isBulkFetchMode || getAllCatalogsStringScratchData() == null) { + sql += "WHERE c.TABLE_OWNER = '" + database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class) + "' "; + } else { + sql += "WHERE c.TABLE_OWNER IN ('" + database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class) + "', " + getAllCatalogsStringScratchData() + ")"; + } + sql += "AND i.OWNER = c.TABLE_OWNER " + + "AND d.object_name IS NULL "; + + + if (!isBulkFetchMode && (tableName != null)) { + sql += " AND c.TABLE_NAME='" + tableName + "'"; + } + + if (!isBulkFetchMode && (indexName != null)) { + sql += " AND c.INDEX_NAME='" + indexName + "'"; + } + + sql += " ORDER BY c.INDEX_NAME, ORDINAL_POSITION"; + + returnList.addAll(setIndexExpressions(executeAndExtract(sql, database))); + } else if (database instanceof MSSQLDatabase) { + String tableCat = "original_db_name()"; + + if (9 <= database.getDatabaseMajorVersion()) { + tableCat = "db_name()"; + } + //fetch additional index info + String sql = "SELECT " + + tableCat + " as TABLE_CAT, " + + "object_schema_name(i.object_id) as TABLE_SCHEM, " + + "object_name(i.object_id) as TABLE_NAME, " + + "CASE is_unique WHEN 1 then 0 else 1 end as NON_UNIQUE, " + + "object_name(i.object_id) as INDEX_QUALIFIER, " + + "i.name as INDEX_NAME, " + + "case i.type when 1 then 1 ELSE 3 end as TYPE, " + + "key_ordinal as ORDINAL_POSITION, " + + "COL_NAME(c.object_id,c.column_id) AS COLUMN_NAME, " + + "case is_descending_key when 0 then 'A' else 'D' end as ASC_OR_DESC, " + + "null as CARDINALITY, " + + "null as PAGES, " + + "i.filter_definition as FILTER_CONDITION, " + + "o.type AS INTERNAL_OBJECT_TYPE, " + + "i.*, " + + "c.*, " + + "s.* " + + "FROM sys.indexes i " + + "join sys.index_columns c on i.object_id=c.object_id and i.index_id=c.index_id " + + "join sys.stats s on i.object_id=s.object_id and i.name=s.name " + + "join sys.objects o on i.object_id=o.object_id " + + "WHERE object_schema_name(i.object_id)='" + database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class) + "'"; + + if (!isBulkFetchMode && (tableName != null)) { + sql += " AND object_name(i.object_id)='" + database.escapeStringForDatabase(tableName) + "'"; + } + + if (!isBulkFetchMode && (indexName != null)) { + sql += " AND i.name='" + database.escapeStringForDatabase(indexName) + "'"; + } + + sql += "ORDER BY i.object_id, i.index_id, c.key_ordinal"; + + returnList.addAll(executeAndExtract(sql, database)); + + } else if (database instanceof Db2zDatabase) { + List parameters = new ArrayList<>(3); + String sql = "SELECT i.CREATOR AS TABLE_SCHEM, " + + "i.TBNAME AS TABLE_NAME, " + + "i.NAME AS INDEX_NAME, " + + "3 AS TYPE, " + + "k.COLNAME AS COLUMN_NAME, " + + "k.COLSEQ AS ORDINAL_POSITION, " + + "CASE UNIQUERULE WHEN 'D' then 1 else 0 end as NON_UNIQUE, " + + "k.ORDERING AS ORDER, " + + "i.CREATOR AS INDEX_QUALIFIER " + + "FROM SYSIBM.SYSKEYS k " + + "JOIN SYSIBM.SYSINDEXES i " + + "ON k.IXNAME = i.NAME " + + "AND k.IXCREATOR = i.CREATOR " + + "WHERE i.CREATOR = ?"; + parameters.add(database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class)); + if (!isBulkFetchMode && tableName != null) { + sql += " AND i.TBNAME = ?"; + parameters.add(database.escapeStringForDatabase(tableName)); + } + + if (!isBulkFetchMode && indexName != null) { + sql += " AND i.NAME = ?"; + parameters.add(database.escapeStringForDatabase(indexName)); + } + + sql += "ORDER BY i.NAME, k.COLSEQ"; + + returnList.addAll(executeAndExtract(database, sql, parameters.toArray())); + } else if (!(database instanceof MariaDBDatabase) && database instanceof MySQLDatabase) { + + //mysql 8.0.13 introduced support for indexes on `lower(first_name)` which comes back in an "expression" column + String filterConditionValue = "NULL"; + if (database.getDatabaseMajorVersion() > 8 || (database.getDatabaseMajorVersion() == 8 && ((MySQLDatabase) database).getDatabasePatchVersion() >= 13)) { + filterConditionValue = "EXPRESSION"; + } + + StringBuilder sql = new StringBuilder("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM,"); + sql.append(" TABLE_NAME, NON_UNIQUE, NULL AS INDEX_QUALIFIER, INDEX_NAME,"); + sql.append(DatabaseMetaData.tableIndexOther); + sql.append(" AS TYPE, SEQ_IN_INDEX AS ORDINAL_POSITION, COLUMN_NAME,"); + sql.append("COLLATION AS ASC_OR_DESC, CARDINALITY, 0 AS PAGES, " + filterConditionValue + " AS FILTER_CONDITION FROM INFORMATION_SCHEMA.STATISTICS WHERE"); + sql.append(" TABLE_SCHEMA = '").append(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)).append("'"); + + if (!isBulkFetchMode && tableName != null) { + sql.append(" AND TABLE_NAME = '").append(database.escapeStringForDatabase(tableName)).append("'"); + } + + if (!isBulkFetchMode && indexName != null) { + sql.append(" AND INDEX_NAME='").append(database.escapeStringForDatabase(indexName)).append("'"); + } + + sql.append("ORDER BY NON_UNIQUE, INDEX_NAME, SEQ_IN_INDEX"); + + returnList.addAll(executeAndExtract(sql.toString(), database)); + } else { + /* + * If we do not know in which table to look for the index, things get a little bit ugly. + * First, we get a collection of all tables within the catalogAndSchema, then iterate through + * them until we (hopefully) find the index we are looking for. + */ + List tables = new ArrayList<>(); + if (tableName == null) { + // Build a list of all candidate tables in the catalog/schema that might contain the index + for (CachedRow row : getTables(((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), null)) { + tables.add(row.getString("TABLE_NAME")); + } + } else { + tables.add(tableName); + } + + // Iterate through all the candidate tables and try to find the index. + for (String tableName1 : tables) { + ResultSet rs = databaseMetaData.getIndexInfo( + ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), + tableName1, + false, + true); + List rows = extract(rs, (database instanceof InformixDatabase)); + returnList.addAll(rows); + } + } + + return returnList; + } + + private List setIndexExpressions(List c) throws DatabaseException, SQLException { + Map expressionMap = getCachedExpressionMap(); + c.forEach(row -> { + row.set("FILTER_CONDITION", null); + String key = row.getString("INDEX_OWNER") + "::" + row.getString("INDEX_NAME") + "::" + + row.getInt("ORDINAL_POSITION"); + CachedRow fromMap = expressionMap.get(key); + if (fromMap != null) { + row.set("FILTER_CONDITION", fromMap.get("COLUMN_EXPRESSION")); + } + }); + return c; + } + + private Map getCachedExpressionMap() throws DatabaseException, SQLException { + if (cachedExpressionMap != null) { + return cachedExpressionMap; + } + String expSql = "SELECT e.column_expression, e.index_owner, e.index_name, e.column_position FROM all_ind_expressions e"; + List ec = executeAndExtract(expSql, database); + cachedExpressionMap = new HashMap<>(); + ec.forEach(row -> { + String key = row.getString("INDEX_OWNER") + "::" + row.getString("INDEX_NAME") + "::" + + row.getInt("COLUMN_POSITION"); + cachedExpressionMap.put(key, row); + }); + return cachedExpressionMap; + } + + @Override + public List bulkFetch() throws SQLException, DatabaseException { + this.isBulkFetchMode = true; + return fastFetch(); + } + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + if (database instanceof OracleDatabase || database instanceof MSSQLDatabase) { + return JdbcDatabaseSnapshot.this.getAllCatalogsStringScratchData() != null || (tableName == null && indexName == null) || super.shouldBulkSelect(schemaKey, resultSetCache); + } + return false; + } + }); + } + + + protected void warnAboutDbaRecycleBin() { + if (!ignoreWarnAboutDbaRecycleBin && !warnedAboutDbaRecycleBin && !(((OracleDatabase) database).canAccessDbaRecycleBin())) { + Scope.getCurrentScope().getLog(getClass()).warning(((OracleDatabase) database).getDbaRecycleBinWarning()); + warnedAboutDbaRecycleBin = true; + } + } + + /** + * Return the columns for the given catalog, schema, table, and column. + */ + public List getColumns(final String catalogName, final String schemaName, final String tableName, final String columnName) throws SQLException, DatabaseException { + + if ((database instanceof MSSQLDatabase) && (userDefinedTypes == null)) { + userDefinedTypes = new HashSet<>(); + DatabaseConnection databaseConnection = database.getConnection(); + if (databaseConnection instanceof JdbcConnection) { + Statement stmt = null; + ResultSet resultSet = null; + try { + stmt = ((JdbcConnection) databaseConnection).getUnderlyingConnection().createStatement(); + resultSet = stmt.executeQuery("select name from " + (catalogName == null ? "" : "[" + catalogName + "].") + "sys.types where is_user_defined=1"); + while (resultSet.next()) { + userDefinedTypes.add(resultSet.getString("name").toLowerCase()); + } + } finally { + JdbcUtil.close(resultSet, stmt); + } + } + } + GetColumnResultSetCache getColumnResultSetCache = new GetColumnResultSetCache(database, catalogName, + schemaName, tableName, columnName); + return getResultSetCache("getColumns").get(getColumnResultSetCache); + } + + /** + * Return the NotNullConstraints for the given catalog, schema, table, and column. + */ + public List getNotNullConst(final String catalogName, final String schemaName, + final String tableName) throws DatabaseException { + if (!(database instanceof OracleDatabase)) { + return Collections.emptyList(); + } + GetNotNullConstraintsResultSetCache getNotNullConstraintsResultSetCache = new GetNotNullConstraintsResultSetCache(database, catalogName, + schemaName, tableName); + return getResultSetCache("getNotNullConst").get(getNotNullConstraintsResultSetCache); + } + + private class GetColumnResultSetCache extends ResultSetCache.SingleResultSetExtractor { + final String catalogName; + final String schemaName; + final String tableName; + final String columnName; + + private GetColumnResultSetCache(Database database, String catalogName, String schemaName, String tableName, String columnName) { + super(database); + this.catalogName = catalogName; + this.schemaName = schemaName; + this.tableName = tableName; + this.columnName = columnName; + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME"), row.getString("COLUMN_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, columnName); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + String catalogs = getAllCatalogsStringScratchData(); + return catalogs != null && schemaKey != null + && catalogs.contains("'" + schemaKey.toUpperCase() + "'") + && database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEM"); + } + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + LiquibaseTableNamesFactory liquibaseTableNamesFactory = Scope.getCurrentScope().getSingleton(LiquibaseTableNamesFactory.class); + List liquibaseTableNames = liquibaseTableNamesFactory.getLiquibaseTableNames(database); + return liquibaseTableNames.stream().noneMatch(tableName::equalsIgnoreCase); + } + + @Override + public List fastFetchQuery() throws SQLException, DatabaseException { + if (database instanceof OracleDatabase) { + return oracleQuery(false); + } else if (database instanceof MSSQLDatabase) { + return mssqlQuery(false); + } + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + try { + List returnList = + extract( + databaseMetaData.getColumns( + ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), + escapeForLike(((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), database), + escapeForLike(tableName, database), + SQL_FILTER_MATCH_ALL) + ); + // + // IF MARIADB OR SQL ANYWHERE + // Query to get actual data types and then map each column to its CachedRow + // + determineActualDataTypes(returnList, tableName); + return returnList; + } catch (SQLException e) { + if (shouldReturnEmptyColumns(e)) { //view with table already dropped. Act like it has no columns. + return new ArrayList<>(); + } else { + throw e; + } + } + } + + @Override + public List bulkFetchQuery() throws SQLException, DatabaseException { + if (database instanceof OracleDatabase) { + return oracleQuery(true); + } else if (database instanceof MSSQLDatabase) { + return mssqlQuery(true); + } + + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + try { + List returnList = + extract(databaseMetaData.getColumns(((AbstractJdbcDatabase) database) + .getJdbcCatalogName(catalogAndSchema), + escapeForLike(((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), database), + SQL_FILTER_MATCH_ALL, SQL_FILTER_MATCH_ALL)); + // + // IF MARIADB OR SQL ANYWHERE + // Query to get actual data types and then map each column to its CachedRow + // + determineActualDataTypes(returnList, null); + return returnList; + } catch (SQLException e) { + if (shouldReturnEmptyColumns(e)) { + return new ArrayList<>(); + } else { + throw e; + } + } + } + + // + // For MariaDB, query for the data type column so that we can correctly + // set the DATETIME(6) type if specified + // + // For SQL Anywhere, query for the scale column so we can correctly + // set the size unit + // + private void determineActualDataTypes(List returnList, String tableName) throws SQLException { + // + // If not MariaDB / SQL Anywhere then just return + // + if (!(database instanceof MariaDBDatabase || database instanceof SybaseASADatabase)) { + return; + } + + if (database instanceof SybaseASADatabase) { + // + // Query for actual data type for column. The actual SYSTABCOL.scale column value is + // not reported by the DatabaseMetadata.getColumns() query for CHAR-limited (in contrast + // to BYTE-limited) columns, and it is needed to capture the kind if limitation. + // The actual SYSTABCOL.column_type is not reported by the DatabaseMetadata.getColumns() + // query as the IS_GENERATEDCOLUMN columns is missing in the result set, and it is needed to + // capture the kind of column (regular or computed). + // + // See https://help.sap.com/docs/SAP_SQL_Anywhere/93079d4ba8e44920ae63ffb4def91f5b/3beaa3956c5f1014883cb0c3e3559cc9.html. + // + String selectStatement = + "SELECT table_name, column_name, scale, column_type FROM SYSTABCOL KEY JOIN SYSTAB KEY JOIN SYSUSER " + + "WHERE user_name = ? AND ? IS NULL OR table_name = ?"; + Connection underlyingConnection = ((JdbcConnection) database.getConnection()).getUnderlyingConnection(); + try (PreparedStatement stmt = underlyingConnection.prepareStatement(selectStatement)) { + stmt.setString(1, schemaName); + stmt.setString(2, tableName); + stmt.setString(3, tableName); + try (ResultSet columnSelectRS = stmt.executeQuery()) { + while (columnSelectRS.next()) { + String selectedTableName = columnSelectRS.getString("table_name"); + String selectedColumnName = columnSelectRS.getString("column_name"); + int selectedScale = columnSelectRS.getInt("scale"); + String selectedColumnType = columnSelectRS.getString("column_type"); + for (CachedRow row : returnList) { + String rowTableName = row.getString("TABLE_NAME"); + String rowColumnName = row.getString("COLUMN_NAME"); + if (rowTableName.equalsIgnoreCase(selectedTableName) && + rowColumnName.equalsIgnoreCase(selectedColumnName)) { + int rowDataType = row.getInt("DATA_TYPE"); + if (rowDataType == Types.VARCHAR || rowDataType == Types.CHAR) { + row.set("scale", selectedScale); + } + row.set("IS_GENERATEDCOLUMN", "C".equals(selectedColumnType) ? "YES" : "NO"); + break; + } + } + } + } + } catch (SQLException sqle) { + throw new RuntimeException(sqle); + // + // Do not stop + // + } + return; + } + + // + // Query for actual data type for column. The actual DATA_TYPE column string is + // not returned by the DatabaseMetadata.getColumns() query, and it is needed + // to capture DATETIME() data types. + // + StringBuilder selectStatement = new StringBuilder( + "SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ?"); + if(tableName != null) { + selectStatement.append(" AND TABLE_NAME = ?"); + } + Connection underlyingConnection = ((JdbcConnection) database.getConnection()).getUnderlyingConnection(); + PreparedStatement statement = underlyingConnection.prepareStatement(selectStatement.toString()); + statement.setString(1, schemaName); + if (tableName != null) { + statement.setString(2, tableName); + } + try { + ResultSet columnSelectRS = statement.executeQuery(selectStatement.toString()); + // + // Iterate the result set from the query and match the rows + // to the rows that were returned by getColumns() in order + // to assign the actual DATA_TYPE string to the appropriate row. + // + while (columnSelectRS.next()) { + String selectedTableName = columnSelectRS.getString("TABLE_NAME"); + String selectedColumnName = columnSelectRS.getString("COLUMN_NAME"); + String actualDataType = columnSelectRS.getString("DATA_TYPE"); + for (CachedRow row : returnList) { + String rowTableName = row.getString("TABLE_NAME"); + String rowColumnName = row.getString("COLUMN_NAME"); + String rowTypeName = row.getString("TYPE_NAME"); + int rowDataType = row.getInt("DATA_TYPE"); + if (rowTableName.equalsIgnoreCase(selectedTableName) && + rowColumnName.equalsIgnoreCase(selectedColumnName) && + rowTypeName.equalsIgnoreCase("datetime") && + rowDataType == Types.OTHER && + !rowTypeName.equalsIgnoreCase(actualDataType)) { + row.set("TYPE_NAME", actualDataType); + row.set("DATA_TYPE", Types.TIMESTAMP); + break; + } + } + } + } catch (SQLException sqle) { + // + // Do not stop + // + } + finally { + JdbcUtil.closeStatement(statement); + } + } + + protected boolean shouldReturnEmptyColumns(SQLException e) { + return e.getMessage().contains("references invalid table"); //view with table already dropped. Act like it has no columns. + } + + protected List oracleQuery(boolean bulk) throws DatabaseException, SQLException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + boolean collectIdentityData = database.getDatabaseMajorVersion() >= OracleDatabase.ORACLE_12C_MAJOR_VERSION; + + String sql = "select NULL AS TABLE_CAT, OWNER AS TABLE_SCHEM, 'NO' as IS_AUTOINCREMENT, cc.COMMENTS AS REMARKS," + + "OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE AS DATA_TYPE_NAME, DATA_TYPE_MOD, DATA_TYPE_OWNER, " + + // note: oracle reports DATA_LENGTH=4*CHAR_LENGTH when using VARCHAR( CHAR ), thus BYTEs + "DECODE (c.data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3, 'LONG', -1, 'DATE', " + "93" + ", 'RAW', -3, 'LONG RAW', -4, 'BLOB', 2004, 'CLOB', 2005, 'BFILE', -13, 'FLOAT', 6, 'TIMESTAMP(6)', 93, 'TIMESTAMP(6) WITH TIME ZONE', -101, 'TIMESTAMP(6) WITH LOCAL TIME ZONE', -102, 'INTERVAL YEAR(2) TO MONTH', -103, 'INTERVAL DAY(2) TO SECOND(6)', -104, 'BINARY_FLOAT', 100, 'BINARY_DOUBLE', 101, 'XMLTYPE', 2009, 1111) AS data_type, " + + "DECODE( CHAR_USED, 'C',CHAR_LENGTH, DATA_LENGTH ) as DATA_LENGTH, " + + "DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID as ORDINAL_POSITION, DEFAULT_LENGTH, " + + "DATA_DEFAULT, " + + "NUM_BUCKETS, CHARACTER_SET_NAME, " + + "CHAR_COL_DECL_LENGTH, CHAR_LENGTH, " + + "CHAR_USED, VIRTUAL_COLUMN "; + if (collectIdentityData) { + sql += ", DEFAULT_ON_NULL, IDENTITY_COLUMN, ic.GENERATION_TYPE "; + } + sql += "FROM ALL_TAB_COLS c " + + "JOIN ALL_COL_COMMENTS cc USING ( OWNER, TABLE_NAME, COLUMN_NAME ) "; + if (collectIdentityData) { + sql += "LEFT JOIN ALL_TAB_IDENTITY_COLS ic USING (OWNER, TABLE_NAME, COLUMN_NAME ) "; + } + if (!bulk || getAllCatalogsStringScratchData() == null) { + sql += "WHERE OWNER='" + jdbcSchemaName + "' AND hidden_column='NO'"; + } else { + sql += "WHERE OWNER IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") AND hidden_column='NO'"; + } + + if (!bulk) { + if (tableName != null) { + sql += " AND TABLE_NAME='" + database.escapeStringForDatabase(tableName) + "'"; + } + if (columnName != null) { + sql += " AND COLUMN_NAME='" + database.escapeStringForDatabase(columnName) + "'"; + } + } + sql += " AND " + ((OracleDatabase) database).getSystemTableWhereClause("TABLE_NAME"); + sql += " ORDER BY OWNER, TABLE_NAME, c.COLUMN_ID"; + + return this.executeAndExtract(sql, database); + } + + + protected List mssqlQuery(boolean bulk) throws DatabaseException, SQLException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); + String dbIdParam; + String databasePrefix; + if (databaseName == null) { + databasePrefix = ""; + dbIdParam = ""; + } else { + dbIdParam = ", db_id('" + databaseName + "')"; + databasePrefix = "[" + databaseName + "]."; + } + + String sql = "select " + + "db_name(" + (databaseName == null ? "" : "db_id('" + databaseName + "')") + ") AS TABLE_CAT, " + + "object_schema_name(c.object_id" + dbIdParam + ") AS TABLE_SCHEM, " + + "object_name(c.object_id" + dbIdParam + ") AS TABLE_NAME, " + + "c.name AS COLUMN_NAME, " + + "is_filestream AS IS_FILESTREAM, " + + "is_rowguidcol AS IS_ROWGUIDCOL, " + + "CASE WHEN c.is_identity = 'true' THEN 'YES' ELSE 'NO' END as IS_AUTOINCREMENT, " + + "{REMARKS_COLUMN_PLACEHOLDER}" + + "t.name AS TYPE_NAME, " + + "dc.name as COLUMN_DEF_NAME, " + + "dc.definition as COLUMN_DEF, " + + // data type mapping from https://msdn.microsoft.com/en-us/library/ms378878(v=sql.110).aspx + "CASE t.name " + + "WHEN 'bigint' THEN " + java.sql.Types.BIGINT + " " + + "WHEN 'binary' THEN " + java.sql.Types.BINARY + " " + + "WHEN 'bit' THEN " + java.sql.Types.BIT + " " + + "WHEN 'char' THEN " + java.sql.Types.CHAR + " " + + "WHEN 'date' THEN " + java.sql.Types.DATE + " " + + "WHEN 'datetime' THEN " + java.sql.Types.TIMESTAMP + " " + + "WHEN 'datetime2' THEN " + java.sql.Types.TIMESTAMP + " " + + "WHEN 'datetimeoffset' THEN -155 " + + "WHEN 'decimal' THEN " + java.sql.Types.DECIMAL + " " + + "WHEN 'float' THEN " + java.sql.Types.DOUBLE + " " + + "WHEN 'image' THEN " + java.sql.Types.LONGVARBINARY + " " + + "WHEN 'int' THEN " + java.sql.Types.INTEGER + " " + + "WHEN 'money' THEN " + java.sql.Types.DECIMAL + " " + + "WHEN 'nchar' THEN " + java.sql.Types.NCHAR + " " + + "WHEN 'ntext' THEN " + java.sql.Types.LONGNVARCHAR + " " + + "WHEN 'numeric' THEN " + java.sql.Types.NUMERIC + " " + + "WHEN 'nvarchar' THEN " + java.sql.Types.NVARCHAR + " " + + "WHEN 'real' THEN " + Types.REAL + " " + + "WHEN 'smalldatetime' THEN " + java.sql.Types.TIMESTAMP + " " + + "WHEN 'smallint' THEN " + java.sql.Types.SMALLINT + " " + + "WHEN 'smallmoney' THEN " + java.sql.Types.DECIMAL + " " + + "WHEN 'text' THEN " + java.sql.Types.LONGVARCHAR + " " + + "WHEN 'time' THEN " + java.sql.Types.TIME + " " + + "WHEN 'timestamp' THEN " + java.sql.Types.BINARY + " " + + "WHEN 'tinyint' THEN " + java.sql.Types.TINYINT + " " + + "WHEN 'udt' THEN " + java.sql.Types.VARBINARY + " " + + "WHEN 'uniqueidentifier' THEN " + java.sql.Types.CHAR + " " + + "WHEN 'varbinary' THEN " + java.sql.Types.VARBINARY + " " + + "WHEN 'varbinary(max)' THEN " + java.sql.Types.VARBINARY + " " + + "WHEN 'varchar' THEN " + java.sql.Types.VARCHAR + " " + + "WHEN 'varchar(max)' THEN " + java.sql.Types.VARCHAR + " " + + "WHEN 'xml' THEN " + java.sql.Types.LONGVARCHAR + " " + + "WHEN 'LONGNVARCHAR' THEN " + java.sql.Types.SQLXML + " " + + "ELSE " + Types.OTHER + " END AS DATA_TYPE, " + + "CASE WHEN c.is_nullable = 'true' THEN 1 ELSE 0 END AS NULLABLE, " + + "10 as NUM_PREC_RADIX, " + + "c.column_id as ORDINAL_POSITION, " + + "c.scale as DECIMAL_DIGITS, " + + "c.max_length as COLUMN_SIZE, " + + "c.precision as DATA_PRECISION, " + + "c.is_computed as IS_COMPUTED " + + "FROM " + databasePrefix + "sys.columns c " + + "inner join " + databasePrefix + "sys.types t on c.user_type_id=t.user_type_id " + + "{REMARKS_JOIN_PLACEHOLDER}" + + "left outer join " + databasePrefix + "sys.default_constraints dc on dc.parent_column_id = c.column_id AND dc.parent_object_id=c.object_id AND type_desc='DEFAULT_CONSTRAINT' " + + "WHERE object_schema_name(c.object_id" + dbIdParam + ")='" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "'"; + + + if (!bulk) { + if (tableName != null) { + sql += " and object_name(c.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(tableName) + "'"; + } + if (columnName != null) { + sql += " and c.name='" + database.escapeStringForDatabase(columnName) + "'"; + } + } + sql += "order by object_schema_name(c.object_id" + dbIdParam + "), object_name(c.object_id" + dbIdParam + "), c.column_id"; + + + // sys.extended_properties is added to Azure on V12: https://feedback.azure.com/forums/217321-sql-database/suggestions/6549815-add-sys-extended-properties-for-meta-data-support + if ((!((MSSQLDatabase) database).isAzureDb()) // Either NOT AzureDB (=SQL Server 2008 or higher) + || (database.getDatabaseMajorVersion() >= 12)) { // or at least AzureDB v12 + // SQL Server 2005 or later + // https://technet.microsoft.com/en-us/library/ms177541.aspx + sql = sql.replace("{REMARKS_COLUMN_PLACEHOLDER}", "CAST([ep].[value] AS [nvarchar](MAX)) AS [REMARKS], "); + sql = sql.replace("{REMARKS_JOIN_PLACEHOLDER}", "left outer join " + databasePrefix + "[sys].[extended_properties] AS [ep] ON [ep].[class] = 1 " + + "AND [ep].[major_id] = c.object_id " + + "AND [ep].[minor_id] = column_id " + + "AND [ep].[name] = 'MS_Description' "); + } else { + sql = sql.replace("{REMARKS_COLUMN_PLACEHOLDER}", ""); + sql = sql.replace("{REMARKS_JOIN_PLACEHOLDER}", ""); + } + + List rows = this.executeAndExtract(sql, database); + + for (CachedRow row : rows) { + String typeName = row.getString("TYPE_NAME"); + if ("nvarchar".equals(typeName) || "nchar".equals(typeName)) { + Integer size = row.getInt("COLUMN_SIZE"); + if (size > 0) { + row.set("COLUMN_SIZE", size / 2); + } + } else if ((row.getInt("DATA_PRECISION") != null) && (row.getInt("DATA_PRECISION") > 0)) { + row.set("COLUMN_SIZE", row.getInt("DATA_PRECISION")); + } + } + + return rows; + } + + @Override + protected List extract(ResultSet resultSet, boolean informixIndexTrimHint) throws SQLException { + List rows = super.extract(resultSet, informixIndexTrimHint); + if ((database instanceof MSSQLDatabase) && !userDefinedTypes.isEmpty()) { //UDT types in MSSQL don't take parameters + for (CachedRow row : rows) { + String dataType = (String) row.get("TYPE_NAME"); + if (userDefinedTypes.contains(dataType.toLowerCase())) { + row.set("COLUMN_SIZE", null); + row.set("DECIMAL_DIGITS ", null); + } + } + } + return rows; + } + } + + private class ForeignKeysResultSetCache extends ResultSetCache.UnionResultSetExtractor { + final String catalogName; + final String schemaName; + final String tableName; + final String fkName; + + private ForeignKeysResultSetCache(Database database, String catalogName, String schemaName, String tableName, String fkName) { + super(database); + this.catalogName = catalogName; + this.schemaName = schemaName; + this.tableName = tableName; + this.fkName = fkName; + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("FKTABLE_CAT"), row.getString("FKTABLE_SCHEM"), database, row.getString("FKTABLE_NAME"), row.getString("FK_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, tableName, fkName); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("FKTABLE_SCHEM"); + } + + @Override + public List fastFetch() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + String jdbcCatalogName = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + + if (database instanceof DB2Database) { + if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { + return executeAndExtract(getDB2ForAs400Sql(jdbcSchemaName, tableName), database); + } + return querytDB2Luw(jdbcSchemaName, tableName); + } else if (database instanceof Db2zDatabase) { + return queryDb2Zos(catalogAndSchema, tableName); + } else { + List tables = new ArrayList<>(); + if (tableName == null) { + for (CachedRow row : getTables(jdbcCatalogName, jdbcSchemaName, null)) { + tables.add(row.getString("TABLE_NAME")); + } + } else { + tables.add(tableName); + } + + List returnList = new ArrayList<>(); + for (String foundTable : tables) { + if (database instanceof OracleDatabase) { + throw new RuntimeException("Should have bulk selected"); + } else { + returnList.addAll(extract(databaseMetaData.getImportedKeys(jdbcCatalogName, jdbcSchemaName, foundTable))); + } + } + + return returnList; + } + } + + @Override + public List bulkFetch() throws SQLException, DatabaseException { + if (database instanceof OracleDatabase) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + String sql = getOracleSql(jdbcSchemaName); + return executeAndExtract(sql, database); + } else if (database instanceof DB2Database) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { + return executeAndExtract(getDB2ForAs400Sql(jdbcSchemaName, null), database); + } + return querytDB2Luw(jdbcSchemaName, null); + } else if (database instanceof Db2zDatabase) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + return queryDb2Zos(catalogAndSchema, null); + } else if (database instanceof MSSQLDatabase) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + String sql = getMSSQLSql(jdbcSchemaName, tableName); + return executeAndExtract(sql, database); + } else { + throw new RuntimeException("Cannot bulk select"); + } + } + + protected String getOracleSql(String jdbcSchemaName) { + String sql = "SELECT /*+rule*/" + + " NULL AS pktable_cat, " + + " p.owner as pktable_schem, " + + " p.table_name as pktable_name, " + + " pc.column_name as pkcolumn_name, " + + " NULL as fktable_cat, " + + " f.owner as fktable_schem, " + + " f.table_name as fktable_name, " + + " fc.column_name as fkcolumn_name, " + + " fc.position as key_seq, " + + " NULL as update_rule, " + + " decode (f.delete_rule, 'CASCADE', 0, 'SET NULL', 2, 1) as delete_rule, " + + " f.constraint_name as fk_name, " + + " p.constraint_name as pk_name, " + + " decode(f.deferrable, 'DEFERRABLE', 5, 'NOT DEFERRABLE', 7, 'DEFERRED', 6) deferrability, " + + " f.validated as fk_validate " + + "FROM " + + "all_cons_columns pc " + + "INNER JOIN all_constraints p " + + "ON pc.owner = p.owner " + + "AND pc.constraint_name = p.constraint_name " + + "INNER JOIN all_constraints f " + + "ON pc.owner = f.r_owner " + + "AND pc.constraint_name = f.r_constraint_name " + + "INNER JOIN all_cons_columns fc " + + "ON fc.owner = f.owner " + + "AND fc.constraint_name = f.constraint_name " + + "AND fc.position = pc.position "; + if (getAllCatalogsStringScratchData() == null) { + sql += "WHERE f.owner = '" + jdbcSchemaName + "' "; + } else { + sql += "WHERE f.owner IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") "; + } + sql += "AND p.constraint_type in ('P', 'U') " + + "AND f.constraint_type = 'R' " + + "AND p.table_name NOT LIKE 'BIN$%' " + + "ORDER BY fktable_schem, fktable_name, key_seq"; + return sql; + } + + protected String getMSSQLSql(String jdbcSchemaName, String tableName) { + //comes from select object_definition(object_id('sp_fkeys')) + return "select " + + "convert(sysname,db_name()) AS PKTABLE_CAT, " + + "convert(sysname,schema_name(o1.schema_id)) AS PKTABLE_SCHEM, " + + "convert(sysname,o1.name) AS PKTABLE_NAME, " + + "convert(sysname,c1.name) AS PKCOLUMN_NAME, " + + "convert(sysname,db_name()) AS FKTABLE_CAT, " + + "convert(sysname,schema_name(o2.schema_id)) AS FKTABLE_SCHEM, " + + "convert(sysname,o2.name) AS FKTABLE_NAME, " + + "convert(sysname,c2.name) AS FKCOLUMN_NAME, " + + "isnull(convert(smallint,k.constraint_column_id), convert(smallint,0)) AS KEY_SEQ, " + + "convert(smallint, case ObjectProperty(f.object_id, 'CnstIsUpdateCascade') when 1 then 0 else 1 end) AS UPDATE_RULE, " + + "convert(smallint, case ObjectProperty(f.object_id, 'CnstIsDeleteCascade') when 1 then 0 else 1 end) AS DELETE_RULE, " + + "convert(sysname,object_name(f.object_id)) AS FK_NAME, " + + "convert(sysname,i.name) AS PK_NAME, " + + "convert(smallint, 7) AS DEFERRABILITY " + + "from " + + "sys.objects o1, " + + "sys.objects o2, " + + "sys.columns c1, " + + "sys.columns c2, " + + "sys.foreign_keys f inner join " + + "sys.foreign_key_columns k on (k.constraint_object_id = f.object_id) inner join " + + "sys.indexes i on (f.referenced_object_id = i.object_id and f.key_index_id = i.index_id) " + + "where " + + "o1.object_id = f.referenced_object_id and " + + "o2.object_id = f.parent_object_id and " + + "c1.object_id = f.referenced_object_id and " + + "c2.object_id = f.parent_object_id and " + + "c1.column_id = k.referenced_column_id and " + + "c2.column_id = k.parent_column_id and " + + "((object_schema_name(o1.object_id)='" + jdbcSchemaName + "'" + + " and convert(sysname,schema_name(o2.schema_id))='" + jdbcSchemaName + "' and " + + "convert(sysname,o2.name)='" + tableName + "' ) or ( convert(sysname,schema_name" + + "(o2.schema_id))='" + jdbcSchemaName + "' and convert(sysname,o2.name)='" + tableName + + "' )) order by 5, 6, 7, 9, 8"; + } + + private List querytDB2Luw(String jdbcSchemaName, String tableName) throws DatabaseException, SQLException { + List parameters = new ArrayList<>(2); + StringBuilder sql = new StringBuilder ("SELECT " + + " pk_col.tabschema AS pktable_cat, " + + " pk_col.tabname as pktable_name, " + + " pk_col.colname as pkcolumn_name, " + + " fk_col.tabschema as fktable_cat, " + + " fk_col.tabname as fktable_name, " + + " fk_col.colname as fkcolumn_name, " + + " fk_col.colseq as key_seq, " + + " decode (ref.updaterule, 'A', 3, 'R', 1, 1) as update_rule, " + + " decode (ref.deleterule, 'A', 3, 'C', 0, 'N', 2, 'R', 1, 1) as delete_rule, " + + " ref.constname as fk_name, " + + " ref.refkeyname as pk_name, " + + " 7 as deferrability " + + "FROM " + + "syscat.references ref " + + "join syscat.keycoluse fk_col on ref.constname=fk_col.constname and ref.tabschema=fk_col.tabschema and ref.tabname=fk_col.tabname " + + "join syscat.keycoluse pk_col on ref.refkeyname=pk_col.constname and ref.reftabschema=pk_col.tabschema and ref.reftabname=pk_col.tabname and pk_col.colseq=fk_col.colseq " + + "WHERE ref.tabschema = ? "); + parameters.add(jdbcSchemaName); + if (tableName != null) { + sql.append("and fk_col.tabname = ? "); + parameters.add(tableName); + } + sql.append("ORDER BY fk_col.colseq"); + return executeAndExtract(database, sql.toString(), parameters.toArray()); + } + + private String getDB2ForAs400Sql(String jdbcSchemaName, String tableName) { + return "SELECT " + + "pktable_cat, " + + "pktable_name, " + + "pkcolumn_name, " + + "fktable_cat, " + + "fktable_name, " + + "fkcolumn_name, " + + "key_seq, " + + "update_rule, " + + "delete_rule, " + + "fk_name, " + + "pk_name, " + + "deferrability " + + "FROM " + + "sysibm.SQLFORKEYS " + + "WHERE " + + "FKTABLE_SCHEM = '" + jdbcSchemaName + "' " + + "AND FKTABLE_NAME = '" + tableName + "'"; + } + + protected List queryDb2Zos(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { + + List parameters = new ArrayList<>(2); + StringBuilder sql = new StringBuilder("SELECT " + + " ref.REFTBCREATOR AS pktable_cat, " + + " ref.REFTBNAME as pktable_name, " + + " pk_col.colname as pkcolumn_name, " + + " ref.CREATOR as fktable_cat, " + + " ref.TBNAME as fktable_name, " + + " fk_col.colname as fkcolumn_name, " + + " fk_col.colseq as key_seq, " + + " decode (ref.deleterule, 'A', 3, 'C', 0, 'N', 2, 'R', 1, 1) as delete_rule, " + + " ref.relname as fk_name, " + + " pk_col.colname as pk_name, " + + " 7 as deferrability " + + "FROM " + + "SYSIBM.SYSRELS ref " + + "join SYSIBM.SYSFOREIGNKEYS fk_col " + + "on ref.relname = fk_col.RELNAME " + + "and ref.CREATOR = fk_col.CREATOR " + + "and ref.TBNAME = fk_col.TBNAME " + + "join SYSIBM.SYSKEYCOLUSE pk_col " + + "on ref.REFTBCREATOR = pk_col.TBCREATOR " + + "and ref.REFTBNAME = pk_col.TBNAME " + + "and pk_col.colseq=fk_col.colseq " + + "WHERE ref.CREATOR = ? "); + parameters.add(((AbstractJdbcDatabase) CachingDatabaseMetaData.this.database).getJdbcSchemaName(catalogAndSchema)); + if (tableName != null) { + sql.append("AND ref.TBNAME = ? "); + parameters.add(tableName); + } + sql.append("ORDER BY fk_col.colseq"); + + return executeAndExtract(CachingDatabaseMetaData.this.database, sql.toString(), parameters.toArray()); + } + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + if (database instanceof AbstractDb2Database || database instanceof MSSQLDatabase) { + return super.shouldBulkSelect(schemaKey, resultSetCache); //can bulk and fast fetch + } else { + return database instanceof OracleDatabase; //oracle is slow, always bulk select while you are at it. Other databases need to go through all tables. + } + } + } + + private class GetNotNullConstraintsResultSetCache extends ResultSetCache.SingleResultSetExtractor { + final String catalogName; + final String schemaName; + final String tableName; + + private GetNotNullConstraintsResultSetCache(Database database, String catalogName, String schemaName, String tableName) { + super(database); + this.catalogName = catalogName; + this.schemaName = schemaName; + this.tableName = tableName; + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEMA"), + database, row.getString("TABLE_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, tableName); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEMA"); + } + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + LiquibaseTableNamesFactory liquibaseTableNamesFactory = Scope.getCurrentScope().getSingleton(LiquibaseTableNamesFactory.class); + List liquibaseTableNames = liquibaseTableNamesFactory.getLiquibaseTableNames(database); + return liquibaseTableNames.stream().noneMatch(tableName::equalsIgnoreCase); + } + + @Override + public List fastFetchQuery() throws SQLException, DatabaseException { + if (database instanceof OracleDatabase) { + return oracleQuery(false); + } + return Collections.emptyList(); + } + + @Override + public List bulkFetchQuery() throws SQLException, DatabaseException { + if (database instanceof OracleDatabase) { + return oracleQuery(true); + } + return Collections.emptyList(); + } + + private List oracleQuery(boolean bulk) throws DatabaseException, SQLException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + String jdbcSchemaName = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + String jdbcTableName = database.escapeStringForDatabase(tableName); + String sqlToSelectNotNullConstraints = "SELECT NULL AS TABLE_CAT, atc.OWNER AS TABLE_SCHEMA, atc.OWNER, atc.TABLE_NAME, " + + "atc.COLUMN_NAME, NULLABLE, ac.VALIDATED as VALIDATED, ac.SEARCH_CONDITION, ac.CONSTRAINT_NAME " + + "FROM ALL_TAB_COLS atc " + + "JOIN all_cons_columns acc ON atc.OWNER = acc.OWNER AND atc.TABLE_NAME = acc.TABLE_NAME AND atc.COLUMN_NAME = acc.COLUMN_NAME " + + "JOIN all_constraints ac ON atc.OWNER = ac.OWNER AND atc.TABLE_NAME = ac.TABLE_NAME AND acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME "; + + if (!bulk || getAllCatalogsStringScratchData() == null) { + sqlToSelectNotNullConstraints += " WHERE atc.OWNER='" + jdbcSchemaName + "' AND atc.hidden_column='NO' AND ac.CONSTRAINT_TYPE='C' and ac.search_condition is not null "; + } else { + sqlToSelectNotNullConstraints += " WHERE atc.OWNER IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ") " + + " AND atc.hidden_column='NO' AND ac.CONSTRAINT_TYPE='C' and ac.search_condition is not null "; + } + + sqlToSelectNotNullConstraints += (!bulk && tableName != null && !tableName.isEmpty()) ? " AND atc.TABLE_NAME='" + jdbcTableName + "'" : ""; + + return this.executeAndExtract(sqlToSelectNotNullConstraints, database); + } + + @Override + protected List extract(ResultSet resultSet, boolean informixIndexTrimHint) throws SQLException { + List cachedRowList = new ArrayList<>(); + if (!(database instanceof OracleDatabase)) { + return cachedRowList; + } + + resultSet.setFetchSize(database.getFetchSize()); + + try { + List result = (List) new RowMapperNotNullConstraintsResultSetExtractor(new ColumnMapRowMapper(database.isCaseSensitive()) { + @Override + protected Object getColumnValue(ResultSet rs, int index) throws SQLException { + Object value = super.getColumnValue(rs, index); + if (!(value instanceof String)) { + return value; + } + return value.toString().trim(); + } + }).extractData(resultSet); + + for (Map row : result) { + cachedRowList.add(new CachedRow(row)); + } + } finally { + JdbcUtil.closeResultSet(resultSet); + } + return cachedRowList; + + } + } + + public List getTables(final String catalogName, final String schemaName, final String table) throws DatabaseException { + return getResultSetCache("getTables").get(new ResultSetCache.SingleResultSetExtractor(database) { + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + return table == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, table); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEM"); + } + + @Override + public List fastFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + if (database instanceof OracleDatabase) { + return queryOracle(catalogAndSchema, table); + } else if (database instanceof MSSQLDatabase) { + return queryMssql(catalogAndSchema, table); + } else if (database instanceof Db2zDatabase) { + return queryDb2Zos(catalogAndSchema, table); + } else if (database instanceof PostgresDatabase) { + return queryPostgres(catalogAndSchema, table); + } + + String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((table == null) ? + SQL_FILTER_MATCH_ALL : escapeForLike(table, database)), new String[]{"TABLE"})); + } + + @Override + public List bulkFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + if (database instanceof OracleDatabase) { + return queryOracle(catalogAndSchema, null); + } else if (database instanceof MSSQLDatabase) { + return queryMssql(catalogAndSchema, null); + } else if (database instanceof Db2zDatabase) { + return queryDb2Zos(catalogAndSchema, null); + } else if (database instanceof PostgresDatabase) { + return queryPostgres(catalogAndSchema, table); + } + + String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), SQL_FILTER_MATCH_ALL, new String[]{"TABLE"})); + } + + private List queryMssql(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { + String ownerName = database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class); + + String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); + String dbIdParam; + String databasePrefix; + if (databaseName == null) { + databasePrefix = ""; + dbIdParam = ""; + } else { + dbIdParam = ", db_id('" + databaseName + "')"; + databasePrefix = "[" + databaseName + "]."; + } + + + //From select object_definition(object_id('sp_tables')) + String sql = "select " + + "db_name(" + (databaseName == null ? "" : "db_id('" + databaseName + "')") + ") AS TABLE_CAT, " + + "convert(sysname,object_schema_name(o.object_id" + dbIdParam + ")) AS TABLE_SCHEM, " + + "convert(sysname,o.name) AS TABLE_NAME, " + + "'TABLE' AS TABLE_TYPE, " + + "CAST(ep.value as varchar(max)) as REMARKS " + + "from " + databasePrefix + "sys.all_objects o " + + "left outer join sys.extended_properties ep on ep.name='MS_Description' and major_id=o.object_id and minor_id=0 " + + "where " + + "o.type in ('U') " + + "and has_perms_by_name(" + (databaseName == null ? "" : "quotename('" + databaseName + "') + '.' + ") + "quotename(object_schema_name(o.object_id" + dbIdParam + ")) + '.' + quotename(o.name), 'object', 'select') = 1 " + + "and charindex(substring(o.type,1,1),'U') <> 0 " + + "and object_schema_name(o.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(ownerName) + "'"; + if (tableName != null) { + sql += " AND o.name='" + database.escapeStringForDatabase(tableName) + "' "; + } + sql += "order by 4, 1, 2, 3"; + + return executeAndExtract(sql, database); + } + + private List queryOracle(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { + String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); + + String sql = "SELECT null as TABLE_CAT, a.OWNER as TABLE_SCHEM, a.TABLE_NAME as TABLE_NAME, " + + "a.TEMPORARY as TEMPORARY, a.DURATION as DURATION, 'TABLE' as TABLE_TYPE, " + + "c.COMMENTS as REMARKS, A.tablespace_name as tablespace_name, CASE WHEN A.tablespace_name = " + + "(SELECT DEFAULT_TABLESPACE FROM USER_USERS) THEN 'true' ELSE null END as default_tablespace " + + "from ALL_TABLES a " + + "join ALL_TAB_COMMENTS c on a.TABLE_NAME=c.table_name and a.owner=c.owner " + + "left outer join ALL_QUEUE_TABLES q ON a.TABLE_NAME = q.QUEUE_TABLE and a.OWNER = q.OWNER " + + "WHERE q.QUEUE_TABLE is null "; + String allCatalogsString = getAllCatalogsStringScratchData(); + if (tableName != null || allCatalogsString == null) { + sql += "AND a.OWNER='" + ownerName + "'"; + } else { + sql += "AND a.OWNER IN ('" + ownerName + "', " + allCatalogsString + ")"; + } + if (tableName != null) { + sql += " AND a.TABLE_NAME='" + tableName + "'"; + } + + return executeAndExtract(sql, database); + } + + private List queryDb2Zos(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { + String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); + + String sql = "SELECT CREATOR AS TABLE_SCHEM, " + + "NAME AS TABLE_NAME, " + + "'TABLE' AS TABLE_TYPE, " + + "REMARKS " + + "FROM SYSIBM.SYSTABLES " + + "WHERE TYPE = 'T'"; + List parameters = new ArrayList<>(2); + if (ownerName != null) { + sql += " AND CREATOR = ?"; + parameters.add(ownerName); + } + if (tableName != null) { + sql += " AND NAME = ?"; + parameters.add(tableName); + } + + return executeAndExtract(database, sql, parameters.toArray()); + } + + private List queryPostgres(CatalogAndSchema catalogAndSchema, String tableName) throws SQLException { + String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((tableName == null) ? + SQL_FILTER_MATCH_ALL : escapeForLike(tableName, database)), new String[]{"TABLE", "PARTITIONED TABLE"})); + + } + }); + } + + public List getViews(final String catalogName, final String schemaName, String viewName) throws DatabaseException { + final String view; + if (database instanceof DB2Database) { + view = database.correctObjectName(viewName, View.class); + } else { + view = viewName; + } + return getResultSetCache("getViews").get(new ResultSetCache.SingleResultSetExtractor(database) { + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + return view == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); + } + + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, view); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEM"); + } + + + @Override + public List fastFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + if (database instanceof OracleDatabase) { + return queryOracle(catalogAndSchema, view); + } else if (database instanceof MSSQLDatabase) { + return queryMssql(catalogAndSchema, view); + } + + String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), ((view == null) ? SQL_FILTER_MATCH_ALL + : escapeForLike(view, database)), new String[]{"VIEW"})); + } + + @Override + public List bulkFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + if (database instanceof OracleDatabase) { + return queryOracle(catalogAndSchema, null); + } else if (database instanceof MSSQLDatabase) { + return queryMssql(catalogAndSchema, null); + } + + String catalog = ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema); + String schema = ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema); + return extract(databaseMetaData.getTables(catalog, escapeForLike(schema, database), SQL_FILTER_MATCH_ALL, new String[]{"VIEW"})); + } + + private List queryMssql(CatalogAndSchema catalogAndSchema, String viewName) throws DatabaseException, SQLException { + String ownerName = database.correctObjectName(catalogAndSchema.getSchemaName(), Schema.class); + String databaseName = StringUtil.trimToNull(database.correctObjectName(catalogAndSchema.getCatalogName(), Catalog.class)); + String dbIdParam = ""; + String databasePrefix = ""; + boolean haveDatabaseName = databaseName != null; + + if (haveDatabaseName) { + dbIdParam = ", db_id('" + databaseName + "')"; + databasePrefix = "[" + databaseName + "]."; + } + String tableCatParam = haveDatabaseName ? "db_id('" + databaseName + "')" : ""; + String permsParam = haveDatabaseName ? "quotename('" + databaseName + "') + '.' + " : ""; + + String sql = "select " + + "db_name(" + tableCatParam + ") AS TABLE_CAT, " + + "convert(sysname,object_schema_name(o.object_id" + dbIdParam + ")) AS TABLE_SCHEM, " + + "convert(sysname,o.name) AS TABLE_NAME, " + + "'VIEW' AS TABLE_TYPE, " + + "CAST(ep.value as varchar(max)) as REMARKS " + + "from " + databasePrefix + "sys.all_objects o " + + "left join sys.extended_properties ep on ep.name='MS_Description' and major_id=o.object_id and minor_id=0 " + + "where " + + "o.type in ('V') " + + "and has_perms_by_name(" + permsParam + "quotename(object_schema_name(o.object_id" + dbIdParam + ")) + '.' + quotename(o.name), 'object', 'select') = 1 " + + "and charindex(substring(o.type,1,1),'V') <> 0 " + + "and object_schema_name(o.object_id" + dbIdParam + ")='" + database.escapeStringForDatabase(ownerName) + "'"; + if (viewName != null) { + sql += " AND o.name='" + database.escapeStringForDatabase(viewName) + "' "; + } + sql += "order by 4, 1, 2, 3"; + + return executeAndExtract(sql, database); + } + + + private List queryOracle(CatalogAndSchema catalogAndSchema, String viewName) throws DatabaseException, SQLException { + String ownerName = database.correctObjectName(catalogAndSchema.getCatalogName(), Schema.class); + + String sql = "SELECT null as TABLE_CAT, a.OWNER as TABLE_SCHEM, a.VIEW_NAME as TABLE_NAME, 'TABLE' as TABLE_TYPE, c.COMMENTS as REMARKS, TEXT as OBJECT_BODY"; + if (database.getDatabaseMajorVersion() > 10) { + sql += ", EDITIONING_VIEW"; + } + sql += " from ALL_VIEWS a " + + "join ALL_TAB_COMMENTS c on a.VIEW_NAME=c.table_name and a.owner=c.owner "; + if (viewName != null || getAllCatalogsStringScratchData() == null) { + sql += "WHERE a.OWNER='" + ownerName + "'"; + } else { + sql += "WHERE a.OWNER IN ('" + ownerName + "', " + getAllCatalogsStringScratchData() + ")"; + } + if (viewName != null) { + sql += " AND a.VIEW_NAME='" + database.correctObjectName(viewName, View.class) + "'"; + } + sql += " AND a.VIEW_NAME not in (select mv.name from all_registered_mviews mv where mv.owner=a.owner)"; + + return executeAndExtract(sql, database); + } + }); + } + + public List getPrimaryKeys(final String catalogName, final String schemaName, final String table) throws DatabaseException { + return getResultSetCache("getPrimaryKeys").get(new ResultSetCache.SingleResultSetExtractor(database) { + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(row.getString("TABLE_CAT"), row.getString("TABLE_SCHEM"), database, row.getString("TABLE_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, table); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("TABLE_SCHEM"); + } + + @Override + public List fastFetchQuery() throws SQLException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + try { + List foundPks = new ArrayList<>(); + if (table == null) { + List tables = CachingDatabaseMetaData.this.getTables(catalogName, schemaName, null); + for (CachedRow table : tables) { + List pkInfo = getPkInfo(catalogAndSchema, table.getString("TABLE_NAME")); + if (pkInfo != null) { + foundPks.addAll(pkInfo); + } + } + return foundPks; + } else { + List pkInfo = getPkInfo(catalogAndSchema, table); + if (pkInfo != null) { + foundPks.addAll(pkInfo); + } + } + return foundPks; + } catch (DatabaseException e) { + throw new SQLException(e); + } + } + + private List getPkInfo(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException, SQLException { + List pkInfo; + if (database instanceof MSSQLDatabase) { + String sql = mssqlSql(catalogAndSchema, tableName); + pkInfo = executeAndExtract(sql, database); + } else { + if (database instanceof Db2zDatabase) { + String sql = "SELECT 'NULL' AS TABLE_CAT," + + " SYSTAB.TBCREATOR AS TABLE_SCHEM, " + + "SYSTAB.TBNAME AS TABLE_NAME, " + + "COLUSE.COLNAME AS COLUMN_NAME, " + + "COLUSE.COLSEQ AS KEY_SEQ, " + + "SYSTAB.CONSTNAME AS PK_NAME " + + "FROM SYSIBM.SYSTABCONST SYSTAB " + + "JOIN SYSIBM.SYSKEYCOLUSE COLUSE " + + "ON SYSTAB.TBCREATOR = COLUSE.TBCREATOR " + + "WHERE SYSTAB.TYPE = 'P' " + + "AND SYSTAB.TBNAME = ? " + + "AND SYSTAB.TBCREATOR = ? " + + "AND SYSTAB.TBNAME=COLUSE.TBNAME " + + "AND SYSTAB.CONSTNAME=COLUSE.CONSTNAME " + + "ORDER BY COLUSE.COLNAME"; + try { + return executeAndExtract(database, sql, table, ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema)); + } catch (DatabaseException e) { + throw new SQLException(e); + } + } else if (database instanceof OracleDatabase) { + warnAboutDbaRecycleBin(); + + String sql = "SELECT NULL AS table_cat, c.owner AS table_schem, c.table_name, c.column_name as COLUMN_NAME, c.position AS key_seq, c.constraint_name AS pk_name, k.VALIDATED as VALIDATED " + + "FROM all_cons_columns c, all_constraints k " + + "LEFT JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=k.table_name " + + "WHERE k.constraint_type = 'P' " + + "AND d.object_name IS NULL " + + "AND k.table_name = '" + table + "' " + + "AND k.owner = '" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "' " + + "AND k.constraint_name = c.constraint_name " + + "AND k.table_name = c.table_name " + + "AND k.owner = c.owner " + + "ORDER BY column_name"; + try { + return executeAndExtract(sql, database); + } catch (DatabaseException e) { + throw new SQLException(e); + } + } else if (database instanceof CockroachDatabase) { + // This is the same as the query generated by PGJDBC's getPrimaryKeys method, except it + // also adds an `asc_or_desc` column to the result. + String sql = "SELECT " + + " result.table_cat, " + + " result.table_schem, " + + " result.table_name, " + + " result.column_name, " + + " result.key_seq, " + + " result.pk_name, " + + " CASE result.indoption[result.key_seq - 1] & 1 " + + " WHEN 1 THEN 'D' " + + " ELSE 'A' " + + " END AS asc_or_desc " + + "FROM " + + " (" + + " SELECT " + + " NULL AS table_cat, " + + " n.nspname AS table_schem, " + + " ct.relname AS table_name, " + + " a.attname AS column_name, " + + " (information_schema._pg_expandarray(i.indkey)).n " + + " AS key_seq, " + + " ci.relname AS pk_name, " + + " information_schema._pg_expandarray(i.indkey) AS keys, " + + " i.indoption, " + + " a.attnum AS a_attnum " + + " FROM " + + " pg_catalog.pg_class AS ct " + + " JOIN pg_catalog.pg_attribute AS a ON (ct.oid = a.attrelid) " + + " JOIN pg_catalog.pg_namespace AS n ON " + + " (ct.relnamespace = n.oid) " + + " JOIN pg_catalog.pg_index AS i ON (a.attrelid = i.indrelid) " + + " JOIN pg_catalog.pg_class AS ci ON (ci.oid = i.indexrelid) " + + " WHERE " + + " true " + + " AND n.nspname = '" + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema) + "' " + + " AND ct.relname = '" + table + "' " + + " AND i.indisprimary" + + " ) " + + " AS result " + + "WHERE " + + " result.a_attnum = (result.keys).x " + + "ORDER BY " + + " result.table_name, result.pk_name, result.key_seq"; + + try { + return executeAndExtract(sql, database); + } catch (DatabaseException e) { + throw new SQLException(e); + } + } else { + return extract( + databaseMetaData.getPrimaryKeys( + ((AbstractJdbcDatabase) database).getJdbcCatalogName(catalogAndSchema), + ((AbstractJdbcDatabase) database).getJdbcSchemaName(catalogAndSchema), + table + ) + ); + } + } + return pkInfo; + } + + private String mssqlSql(CatalogAndSchema catalogAndSchema, String tableName) throws DatabaseException { + String sql; + sql = + "SELECT " + + "DB_NAME() AS [TABLE_CAT], " + + "[s].[name] AS [TABLE_SCHEM], " + + "[t].[name] AS [TABLE_NAME], " + + "[c].[name] AS [COLUMN_NAME], " + + "CASE [ic].[is_descending_key] WHEN 0 THEN N'A' WHEN 1 THEN N'D' END AS [ASC_OR_DESC], " + + "[ic].[key_ordinal] AS [KEY_SEQ], " + + "[kc].[name] AS [PK_NAME] " + + "FROM [sys].[schemas] AS [s] " + + "INNER JOIN [sys].[tables] AS [t] " + + "ON [t].[schema_id] = [s].[schema_id] " + + "INNER JOIN [sys].[key_constraints] AS [kc] " + + "ON [kc].[parent_object_id] = [t].[object_id] " + + "INNER JOIN [sys].[indexes] AS [i] " + + "ON [i].[object_id] = [kc].[parent_object_id] " + + "AND [i].[index_id] = [kc].[unique_index_id] " + + "INNER JOIN [sys].[index_columns] AS [ic] " + + "ON [ic].[object_id] = [i].[object_id] " + + "AND [ic].[index_id] = [i].[index_id] " + + "INNER JOIN [sys].[columns] AS [c] " + + "ON [c].[object_id] = [ic].[object_id] " + + "AND [c].[column_id] = [ic].[column_id] " + + "WHERE [s].[name] = N'" + database.escapeStringForDatabase(catalogAndSchema.getSchemaName()) + "' " + // The schema name was corrected in the customized CatalogAndSchema + (tableName == null ? "" : "AND [t].[name] = N'" + database.escapeStringForDatabase(database.correctObjectName(tableName, Table.class)) + "' ") + + "AND [kc].[type] = 'PK' " + + "AND [ic].[key_ordinal] > 0 " + + "ORDER BY " + + "[ic].[key_ordinal]"; + return sql; + } + + @Override + public List bulkFetchQuery() throws SQLException { + if (database instanceof OracleDatabase) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + warnAboutDbaRecycleBin(); + try { + String sql = "SELECT NULL AS table_cat, c.owner AS table_schem, c.table_name, c.column_name, c.position AS key_seq,c.constraint_name AS pk_name, k.VALIDATED as VALIDATED FROM " + + "all_cons_columns c, " + + "all_constraints k " + + "LEFT JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=k.table_name " + + "WHERE k.constraint_type = 'P' " + + "AND d.object_name IS NULL "; + if (getAllCatalogsStringScratchData() == null) { + sql += "AND k.owner='" + catalogAndSchema.getCatalogName() + "' "; + } else { + sql += "AND k.owner IN ('" + catalogAndSchema.getCatalogName() + "', " + getAllCatalogsStringScratchData() + ")"; + } + sql += "AND k.constraint_name = c.constraint_name " + + "AND k.table_name = c.table_name " + + "AND k.owner = c.owner " + + "ORDER BY column_name"; + return executeAndExtract(sql, database); + } catch (DatabaseException e) { + throw new SQLException(e); + } + } else if (database instanceof MSSQLDatabase) { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + try { + return executeAndExtract(mssqlSql(catalogAndSchema, null), database); + } catch (DatabaseException e) { + throw new SQLException(e); + } + } + return null; + } + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + if ((database instanceof OracleDatabase) || (database instanceof MSSQLDatabase)) { + return table == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); + } else { + return false; + } + } + }); + } + + public List getUniqueConstraints(final String catalogName, final String schemaName, final String tableName) throws DatabaseException { + return getResultSetCache("getUniqueConstraints").get(new ResultSetCache.SingleResultSetExtractor(database) { + + @Override + protected boolean shouldBulkSelect(String schemaKey, ResultSetCache resultSetCache) { + return tableName == null || getAllCatalogsStringScratchData() != null || super.shouldBulkSelect(schemaKey, resultSetCache); + } + + @Override + public boolean bulkContainsSchema(String schemaKey) { + return database instanceof OracleDatabase; + } + + @Override + public String getSchemaKey(CachedRow row) { + return row.getString("CONSTRAINT_SCHEM"); + } + + @Override + public ResultSetCache.RowData rowKeyParameters(CachedRow row) { + return new ResultSetCache.RowData(catalogName, schemaName, database, row.getString("TABLE_NAME")); + } + + @Override + public ResultSetCache.RowData wantedKeyParameters() { + return new ResultSetCache.RowData(catalogName, schemaName, database, tableName); + } + + @Override + public List fastFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + return queryDb(catalogAndSchema, tableName); + } + + @Override + public List bulkFetchQuery() throws SQLException, DatabaseException { + CatalogAndSchema catalogAndSchema = new CatalogAndSchema(catalogName, schemaName).customize(database); + + return queryDb(catalogAndSchema, null); + } + + private List queryDb(CatalogAndSchema catalogAndSchema, String tableName) throws SQLException, DatabaseException { + + String jdbcCatalogName = catalogAndSchema.getCatalogName(); + String jdbcSchemaName = catalogAndSchema.getSchemaName(); + + Database database = getDatabase(); + List parameters = new ArrayList<>(3); + String sql = null; + if (database instanceof Ingres9Database) { + sql = "select CONSTRAINT_NAME, TABLE_NAME from iiconstraints where schema_name ='" + + schemaName + "' and constraint_type='U'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + } else if ((database instanceof MySQLDatabase) || (database instanceof HsqlDatabase) || (database + instanceof MariaDBDatabase)) { + sql = "select CONSTRAINT_NAME, TABLE_NAME " + + "from " + database.getSystemSchema() + ".table_constraints " + + "where constraint_schema='" + jdbcCatalogName + "' " + + "and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + } else if (database instanceof PostgresDatabase) { + sql = "select CONSTRAINT_NAME, TABLE_NAME " + + "from " + database.getSystemSchema() + ".table_constraints " + + "where constraint_catalog='" + jdbcCatalogName + "' " + + "and constraint_schema='" + jdbcSchemaName + "' " + + "and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + } else if (database.getClass().getName().contains("MaxDB")) { //have to check classname as this is currently an extension + sql = "select distinct tablename AS TABLE_NAME, constraintname AS CONSTRAINT_NAME from CONSTRAINTCOLUMNS WHERE CONSTRAINTTYPE = 'UNIQUE_CONST'"; + if (tableName != null) { + sql += " and tablename='" + tableName + "'"; + } + } else if (database instanceof MSSQLDatabase) { + sql = + "SELECT " + + "[TC].[CONSTRAINT_NAME], " + + "[TC].[TABLE_NAME], " + + "[TC].[CONSTRAINT_CATALOG] AS INDEX_CATALOG, " + + "[TC].[CONSTRAINT_SCHEMA] AS INDEX_SCHEMA, " + + "[IDX].[TYPE_DESC], " + + "[IDX].[name] AS INDEX_NAME " + + "FROM [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] AS [TC] " + + "JOIN sys.indexes AS IDX ON IDX.name=[TC].[CONSTRAINT_NAME] AND object_schema_name(object_id)=[TC].[CONSTRAINT_SCHEMA] " + + "WHERE [TC].[CONSTRAINT_TYPE] = 'UNIQUE' " + + "AND [TC].[CONSTRAINT_CATALOG] = N'" + database.escapeStringForDatabase(jdbcCatalogName) + "' " + + "AND [TC].[CONSTRAINT_SCHEMA] = N'" + database.escapeStringForDatabase(jdbcSchemaName) + "'"; + if (tableName != null) { + sql += " AND [TC].[TABLE_NAME] = N'" + database.escapeStringForDatabase(database.correctObjectName(tableName, Table.class)) + "'"; + } + } else if (database instanceof OracleDatabase) { + warnAboutDbaRecycleBin(); + + sql = "select uc.owner AS CONSTRAINT_SCHEM, uc.constraint_name, uc.table_name,uc.status,uc.deferrable,uc.deferred,ui.tablespace_name, ui.index_name, ui.owner as INDEX_CATALOG, uc.VALIDATED as VALIDATED, ac.COLUMN_NAME as COLUMN_NAME " + + "from all_constraints uc " + + "join all_indexes ui on uc.index_name = ui.index_name and uc.owner=ui.table_owner and uc.table_name=ui.table_name " + + "LEFT OUTER JOIN " + (((OracleDatabase) database).canAccessDbaRecycleBin() ? "dba_recyclebin" : "user_recyclebin") + " d ON d.object_name=ui.table_name " + + "LEFT JOIN all_cons_columns ac ON ac.OWNER = uc.OWNER AND ac.TABLE_NAME = uc.TABLE_NAME AND ac.CONSTRAINT_NAME = uc.CONSTRAINT_NAME " + + "where uc.constraint_type='U' "; + if (tableName != null || getAllCatalogsStringScratchData() == null) { + sql += "and uc.owner = '" + jdbcSchemaName + "'"; + } else { + sql += "and uc.owner IN ('" + jdbcSchemaName + "', " + getAllCatalogsStringScratchData() + ")"; + } + sql += "AND d.object_name IS NULL "; + + if (tableName != null) { + sql += " and uc.table_name = '" + tableName + "'"; + } + } else if (database instanceof DB2Database) { + // if we are on DB2 AS400 iSeries + if (database.getDatabaseProductName().startsWith("DB2 UDB for AS/400")) { + sql = "select constraint_name as constraint_name, table_name as table_name from QSYS2.TABLE_CONSTRAINTS where table_schema='" + jdbcSchemaName + "' and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name = '" + tableName + "'"; + } + // DB2 z/OS + } + // here we are on DB2 UDB + else { + sql = "select distinct k.constname as constraint_name, t.tabname as TABLE_NAME " + + "from syscat.keycoluse k " + + "inner join syscat.tabconst t " + + "on k.constname = t.constname " + + "where t.tabschema = ? " + + "and t.type = 'U'"; + parameters.add(jdbcSchemaName); + if (tableName != null) { + sql += " and t.tabname = ?"; + parameters.add(tableName); + } + } + } else if (database instanceof Db2zDatabase) { + sql = "select k.constname as constraint_name, t.tbname as TABLE_NAME" + + " from SYSIBM.SYSKEYCOLUSE k" + + " inner join SYSIBM.SYSTABCONST t" + + " on k.constname = t.constname" + + " and k.TBCREATOR = t.TBCREATOR" + + " and k.TBNAME = t.TBNAME" + + " where t.TBCREATOR = ?" + + " and t.TYPE = 'U'"; + parameters.add(jdbcSchemaName); + if (tableName != null) { + sql += " and t.TBNAME = ?"; + parameters.add(tableName); + } + } else if (database instanceof FirebirdDatabase) { + sql = "SELECT TRIM(RDB$INDICES.RDB$INDEX_NAME) AS CONSTRAINT_NAME, " + + "TRIM(RDB$INDICES.RDB$RELATION_NAME) AS TABLE_NAME " + + "FROM RDB$INDICES " + + "LEFT JOIN RDB$RELATION_CONSTRAINTS " + + "ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME " + + "WHERE RDB$INDICES.RDB$UNIQUE_FLAG IS NOT NULL " + + "AND (" + + "RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL " + + "OR TRIM(RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE)='UNIQUE') " + + "AND NOT(RDB$INDICES.RDB$INDEX_NAME LIKE 'RDB$%')"; + if (tableName != null) { + sql += " AND TRIM(RDB$INDICES.RDB$RELATION_NAME)='" + tableName + "'"; + } + } else if (database instanceof DerbyDatabase) { + sql = "select c.constraintname as CONSTRAINT_NAME, tablename AS TABLE_NAME " + + "from sys.systables t, sys.sysconstraints c, sys.sysschemas s " + + "where s.schemaname='" + jdbcCatalogName + "' " + + "and t.tableid = c.tableid " + + "and t.schemaid=s.schemaid " + + "and c.type = 'U'"; + if (tableName != null) { + sql += " AND t.tablename = '" + tableName + "'"; + } + } else if (database instanceof InformixDatabase) { + sql = "select unique sysindexes.idxname as CONSTRAINT_NAME, sysindexes.idxtype, systables.tabname as TABLE_NAME " + + "from sysindexes, systables " + + "left outer join sysconstraints on sysconstraints.tabid = systables.tabid and sysconstraints.constrtype = 'P' " + + "where sysindexes.tabid = systables.tabid and sysindexes.idxtype = 'U' " + + "and sysconstraints.idxname != sysindexes.idxname " + + "and sysconstraints.tabid = sysindexes.tabid"; + if (tableName != null) { + sql += " and systables.tabname = '" + database.correctObjectName(tableName, Table.class) + "'"; + } + } else if (database instanceof SybaseDatabase) { + sql = "select idx.name as CONSTRAINT_NAME, tbl.name as TABLE_NAME " + + "from sysindexes idx " + + "inner join sysobjects tbl on tbl.id = idx.id " + + "where idx.indid between 1 and 254 " + + "and (idx.status & 2) = 2 " + + "and tbl.type = 'U'"; + if (tableName != null) { + sql += " and tbl.name = '" + database.correctObjectName(tableName, Table.class) + "'"; + } + } else if (database instanceof SybaseASADatabase) { + sql = "select sysconstraint.constraint_name, sysconstraint.constraint_type, systable.table_name " + + "from sysconstraint, systable " + + "where sysconstraint.table_object_id = systable.object_id " + + "and sysconstraint.constraint_type = 'U'"; + if (tableName != null) { + sql += " and systable.table_name = '" + tableName + "'"; + } + } else { + if (database instanceof H2Database) { + try { + if (database.getDatabaseMajorVersion() >= 2) { + sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " + + "from " + database.getSystemSchema() + ".table_constraints " + + "where constraint_schema='" + jdbcSchemaName + "' " + + "and constraint_catalog='" + jdbcCatalogName + "' " + + "and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + } + } catch (DatabaseException e) { + Scope.getCurrentScope().getLog(getClass()).fine("Cannot determine h2 version, using default unique constraint query"); + } + } + if (sql == null) { + + sql = "select CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME " + + "from " + database.getSystemSchema() + ".constraints " + + "where constraint_schema='" + jdbcSchemaName + "' " + + "and constraint_catalog='" + jdbcCatalogName + "' " + + "and constraint_type='UNIQUE'"; + if (tableName != null) { + sql += " and table_name='" + tableName + "'"; + } + } + } + + return executeAndExtract(database, database instanceof InformixDatabase, sql, parameters.toArray()); + } + }); + } + } + + private String getAllCatalogsStringScratchData() { + return (String) getScratchData(ALL_CATALOGS_STRING_SCRATCH_KEY); + } + + private String escapeForLike(String string, Database database) { + if (string == null) { + return null; + } + + if (database instanceof SQLiteDatabase || database instanceof DmDatabase) { + //sqlite jdbc's queries does not support escaped patterns. + // DM ä¹Ÿä¸æ”¯æŒè½¬ä¹‰çš„åŒ¹é…æ–¹å¼ï¼Œéœ€è¦å…¼å®¹ + return string; + } + + return string + .replace("%", "\\%") + .replace("_", "\\_"); + } +} diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java index 790e65e..2ac83d5 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java @@ -12,8 +12,29 @@ */ package org.flowable.common.engine.impl; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.ServiceLoader; +import java.util.Set; + +import javax.naming.InitialContext; +import javax.sql.DataSource; + import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.builder.xml.XMLConfigBuilder; import org.apache.ibatis.builder.xml.XMLMapperBuilder; @@ -26,7 +47,27 @@ import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; -import org.apache.ibatis.type.*; +import org.apache.ibatis.type.ArrayTypeHandler; +import org.apache.ibatis.type.BigDecimalTypeHandler; +import org.apache.ibatis.type.BlobInputStreamTypeHandler; +import org.apache.ibatis.type.BlobTypeHandler; +import org.apache.ibatis.type.BooleanTypeHandler; +import org.apache.ibatis.type.ByteTypeHandler; +import org.apache.ibatis.type.ClobTypeHandler; +import org.apache.ibatis.type.DateOnlyTypeHandler; +import org.apache.ibatis.type.DateTypeHandler; +import org.apache.ibatis.type.DoubleTypeHandler; +import org.apache.ibatis.type.FloatTypeHandler; +import org.apache.ibatis.type.IntegerTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.LongTypeHandler; +import org.apache.ibatis.type.NClobTypeHandler; +import org.apache.ibatis.type.NStringTypeHandler; +import org.apache.ibatis.type.ShortTypeHandler; +import org.apache.ibatis.type.SqlxmlTypeHandler; +import org.apache.ibatis.type.StringTypeHandler; +import org.apache.ibatis.type.TimeOnlyTypeHandler; +import org.apache.ibatis.type.TypeHandlerRegistry; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher; @@ -38,10 +79,25 @@ import org.flowable.common.engine.impl.cfg.CommandExecutorImpl; import org.flowable.common.engine.impl.cfg.IdGenerator; import org.flowable.common.engine.impl.cfg.TransactionContextFactory; import org.flowable.common.engine.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory; -import org.flowable.common.engine.impl.db.*; +import org.flowable.common.engine.impl.db.CommonDbSchemaManager; +import org.flowable.common.engine.impl.db.DbSqlSessionFactory; +import org.flowable.common.engine.impl.db.LogSqlExecutionTimePlugin; +import org.flowable.common.engine.impl.db.MybatisTypeAliasConfigurator; +import org.flowable.common.engine.impl.db.MybatisTypeHandlerConfigurator; +import org.flowable.common.engine.impl.db.SchemaManager; import org.flowable.common.engine.impl.event.EventDispatchAction; import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl; -import org.flowable.common.engine.impl.interceptor.*; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandConfig; +import org.flowable.common.engine.impl.interceptor.CommandContextFactory; +import org.flowable.common.engine.impl.interceptor.CommandContextInterceptor; +import org.flowable.common.engine.impl.interceptor.CommandExecutor; +import org.flowable.common.engine.impl.interceptor.CommandInterceptor; +import org.flowable.common.engine.impl.interceptor.CrDbRetryInterceptor; +import org.flowable.common.engine.impl.interceptor.DefaultCommandInvoker; +import org.flowable.common.engine.impl.interceptor.LogInterceptor; +import org.flowable.common.engine.impl.interceptor.SessionFactory; +import org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor; import org.flowable.common.engine.impl.lock.LockManager; import org.flowable.common.engine.impl.lock.LockManagerImpl; import org.flowable.common.engine.impl.logging.LoggingListener; @@ -51,7 +107,13 @@ import org.flowable.common.engine.impl.persistence.GenericManagerFactory; import org.flowable.common.engine.impl.persistence.StrongUuidGenerator; import org.flowable.common.engine.impl.persistence.cache.EntityCache; import org.flowable.common.engine.impl.persistence.cache.EntityCacheImpl; -import org.flowable.common.engine.impl.persistence.entity.*; +import org.flowable.common.engine.impl.persistence.entity.ByteArrayEntityManager; +import org.flowable.common.engine.impl.persistence.entity.ByteArrayEntityManagerImpl; +import org.flowable.common.engine.impl.persistence.entity.Entity; +import org.flowable.common.engine.impl.persistence.entity.PropertyEntityManager; +import org.flowable.common.engine.impl.persistence.entity.PropertyEntityManagerImpl; +import org.flowable.common.engine.impl.persistence.entity.TableDataManager; +import org.flowable.common.engine.impl.persistence.entity.TableDataManagerImpl; import org.flowable.common.engine.impl.persistence.entity.data.ByteArrayDataManager; import org.flowable.common.engine.impl.persistence.entity.data.PropertyDataManager; import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisByteArrayDataManager; @@ -65,14 +127,8 @@ import org.flowable.eventregistry.api.EventRegistryEventConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.naming.InitialContext; -import javax.sql.DataSource; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.sql.*; -import java.time.Duration; -import java.util.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; public abstract class AbstractEngineConfiguration { diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java new file mode 100644 index 0000000..cbea955 --- /dev/null +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/org/flowable/common/engine/impl/db/DbSqlSessionFactory.java @@ -0,0 +1,394 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.flowable.common.engine.impl.db; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.common.engine.impl.context.Context; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.common.engine.impl.interceptor.Session; +import org.flowable.common.engine.impl.interceptor.SessionFactory; +import org.flowable.common.engine.impl.persistence.cache.EntityCache; +import org.flowable.common.engine.impl.persistence.entity.Entity; + +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Tom Baeyens + * @author Joram Barrez + */ +public class DbSqlSessionFactory implements SessionFactory { + + protected Map> databaseSpecificStatements = new HashMap<>(); + + protected String databaseType; + protected String databaseTablePrefix = ""; + protected boolean tablePrefixIsSchema; + + protected String databaseCatalog; + protected String databaseSchema; + protected SqlSessionFactory sqlSessionFactory; + protected Map statementMappings; + + protected Map, String> insertStatements = new ConcurrentHashMap<>(); + protected Map, String> updateStatements = new ConcurrentHashMap<>(); + protected Map, String> deleteStatements = new ConcurrentHashMap<>(); + protected Map, String> selectStatements = new ConcurrentHashMap<>(); + + protected List> insertionOrder = new ArrayList<>(); + protected List> deletionOrder = new ArrayList<>(); + + protected boolean isDbHistoryUsed = true; + + protected Set> bulkInserteableEntityClasses = new HashSet<>(); + protected Map, String> bulkInsertStatements = new ConcurrentHashMap<>(); + + protected int maxNrOfStatementsInBulkInsert = 100; + + protected Map> logicalNameToClassMapping = new ConcurrentHashMap<>(); + + protected boolean usePrefixId; + + public DbSqlSessionFactory(boolean usePrefixId) { + this.usePrefixId = usePrefixId; + } + + @Override + public Class getSessionType() { + return DbSqlSession.class; + } + + @Override + public Session openSession(CommandContext commandContext) { + DbSqlSession dbSqlSession = createDbSqlSession(); + // 当å‰ç³»ç»Ÿé€‚é… dm,如果存在 schema 为空的情况,从 connection èŽ·å– + try { + if (getDatabaseSchema() == null || getDatabaseSchema().length() == 0){ + String schemaFromUrl = extractSchemaFromJdbcUrl(dbSqlSession.getSqlSession().getConnection()); + if (schemaFromUrl != null && schemaFromUrl.length() > 0) { + setDatabaseSchema(schemaFromUrl); + } else { + setDatabaseSchema(dbSqlSession.getSqlSession().getConnection().getSchema()); + } + } + dbSqlSession.getSqlSession().getConnection().getSchema(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + if (getDatabaseSchema() != null && getDatabaseSchema().length() > 0) { + try { + dbSqlSession.getSqlSession().getConnection().setSchema(getDatabaseSchema()); + } catch (SQLException e) { + throw new FlowableException("Could not set database schema on connection", e); + } + } + if (getDatabaseCatalog() != null && getDatabaseCatalog().length() > 0) { + try { + dbSqlSession.getSqlSession().getConnection().setCatalog(getDatabaseCatalog()); + } catch (SQLException e) { + throw new FlowableException("Could not set database catalog on connection", e); + } + } + if (dbSqlSession.getSqlSession().getConnection() == null) { + throw new FlowableException("Invalid dbSqlSession: no active connection found"); + } + return dbSqlSession; + } + + protected DbSqlSession createDbSqlSession() { + return new DbSqlSession(this, Context.getCommandContext().getSession(EntityCache.class)); + } + + // insert, update and delete statements + // ///////////////////////////////////// + + public String getInsertStatement(Entity object) { + return getStatement(object.getClass(), insertStatements, "insert"); + } + + public String getInsertStatement(Class clazz) { + return getStatement(clazz, insertStatements, "insert"); + } + + public String getUpdateStatement(Entity object) { + return getStatement(object.getClass(), updateStatements, "update"); + } + + public String getDeleteStatement(Class entityClass) { + return getStatement(entityClass, deleteStatements, "delete"); + } + + public String getSelectStatement(Class entityClass) { + return getStatement(entityClass, selectStatements, "select"); + } + + protected String getStatement(Class entityClass, Map, String> cachedStatements, String prefix) { + String statement = cachedStatements.get(entityClass); + if (statement != null) { + return statement; + } + statement = prefix + entityClass.getSimpleName(); + if (statement.endsWith("Impl")) { + statement = statement.substring(0, statement.length() - 10); // removing 'entityImpl' + } else { + statement = statement.substring(0, statement.length() - 6); // removing 'entity' + } + cachedStatements.put(entityClass, statement); + return statement; + } + + // db specific mappings + // ///////////////////////////////////////////////////// + + protected void addDatabaseSpecificStatement(String databaseType, String activitiStatement, String ibatisStatement) { + Map specificStatements = databaseSpecificStatements.get(databaseType); + if (specificStatements == null) { + specificStatements = new HashMap<>(); + databaseSpecificStatements.put(databaseType, specificStatements); + } + specificStatements.put(activitiStatement, ibatisStatement); + } + + public String mapStatement(String statement) { + if (statementMappings == null) { + return statement; + } + String mappedStatement = statementMappings.get(statement); + return (mappedStatement != null ? mappedStatement : statement); + } + + // customized getters and setters + // /////////////////////////////////////////// + + public void setDatabaseType(String databaseType) { + this.databaseType = databaseType; + this.statementMappings = databaseSpecificStatements.get(databaseType); + } + + public boolean isMysql() { + return "mysql".equals(getDatabaseType()); + } + + public boolean isOracle() { + return "oracle".equals(getDatabaseType()); + } + + public Boolean isBulkInsertable(Class entityClass) { + return bulkInserteableEntityClasses != null && bulkInserteableEntityClasses.contains(entityClass); + } + + @SuppressWarnings("rawtypes") + public String getBulkInsertStatement(Class clazz) { + return getStatement(clazz, bulkInsertStatements, "bulkInsert"); + } + + public Set> getBulkInserteableEntityClasses() { + return bulkInserteableEntityClasses; + } + + public void setBulkInserteableEntityClasses(Set> bulkInserteableEntityClasses) { + this.bulkInserteableEntityClasses = bulkInserteableEntityClasses; + } + + public int getMaxNrOfStatementsInBulkInsert() { + return maxNrOfStatementsInBulkInsert; + } + + public void setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) { + this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert; + } + + public Map, String> getBulkInsertStatements() { + return bulkInsertStatements; + } + + public void setBulkInsertStatements(Map, String> bulkInsertStatements) { + this.bulkInsertStatements = bulkInsertStatements; + } + + // getters and setters ////////////////////////////////////////////////////// + + public SqlSessionFactory getSqlSessionFactory() { + return sqlSessionFactory; + } + + public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { + this.sqlSessionFactory = sqlSessionFactory; + } + + public String getDatabaseType() { + return databaseType; + } + + public Map> getDatabaseSpecificStatements() { + return databaseSpecificStatements; + } + + public void setDatabaseSpecificStatements(Map> databaseSpecificStatements) { + this.databaseSpecificStatements = databaseSpecificStatements; + } + + public Map getStatementMappings() { + return statementMappings; + } + + public void setStatementMappings(Map statementMappings) { + this.statementMappings = statementMappings; + } + + public Map, String> getInsertStatements() { + return insertStatements; + } + + public void setInsertStatements(Map, String> insertStatements) { + this.insertStatements = insertStatements; + } + + public Map, String> getUpdateStatements() { + return updateStatements; + } + + public void setUpdateStatements(Map, String> updateStatements) { + this.updateStatements = updateStatements; + } + + public Map, String> getDeleteStatements() { + return deleteStatements; + } + + public void setDeleteStatements(Map, String> deleteStatements) { + this.deleteStatements = deleteStatements; + } + + public Map, String> getSelectStatements() { + return selectStatements; + } + + public void setSelectStatements(Map, String> selectStatements) { + this.selectStatements = selectStatements; + } + + public boolean isDbHistoryUsed() { + return isDbHistoryUsed; + } + + public void setDbHistoryUsed(boolean isDbHistoryUsed) { + this.isDbHistoryUsed = isDbHistoryUsed; + } + + public void setDatabaseTablePrefix(String databaseTablePrefix) { + this.databaseTablePrefix = databaseTablePrefix; + } + + public String getDatabaseTablePrefix() { + return databaseTablePrefix; + } + + public String getDatabaseCatalog() { + return databaseCatalog; + } + + public void setDatabaseCatalog(String databaseCatalog) { + this.databaseCatalog = databaseCatalog; + } + + public String getDatabaseSchema() { + return databaseSchema; + } + + public void setDatabaseSchema(String databaseSchema) { + this.databaseSchema = databaseSchema; + } + + public void setTablePrefixIsSchema(boolean tablePrefixIsSchema) { + this.tablePrefixIsSchema = tablePrefixIsSchema; + } + + public boolean isTablePrefixIsSchema() { + return tablePrefixIsSchema; + } + + public List> getInsertionOrder() { + return insertionOrder; + } + + public void setInsertionOrder(List> insertionOrder) { + this.insertionOrder = insertionOrder; + } + + public List> getDeletionOrder() { + return deletionOrder; + } + + public void setDeletionOrder(List> deletionOrder) { + this.deletionOrder = deletionOrder; + } + public void addLogicalEntityClassMapping(String logicalName, Class entityClass) { + logicalNameToClassMapping.put(logicalName, entityClass); + } + + public Map> getLogicalNameToClassMapping() { + return logicalNameToClassMapping; + } + + public void setLogicalNameToClassMapping(Map> logicalNameToClassMapping) { + this.logicalNameToClassMapping = logicalNameToClassMapping; + } + + public boolean isUsePrefixId() { + return usePrefixId; + } + + public void setUsePrefixId(boolean usePrefixId) { + this.usePrefixId = usePrefixId; + } + + private String extractSchemaFromJdbcUrl(java.sql.Connection connection) { + if (connection == null) { + return null; + } + try { + String url = connection.getMetaData().getURL(); + if (url == null || url.isEmpty()) { + return null; + } + int queryIndex = url.indexOf('?'); + if (queryIndex < 0 || queryIndex == url.length() - 1) { + return null; + } + String query = url.substring(queryIndex + 1); + String[] parts = query.split("[&;]"); + for (String part : parts) { + int eqIndex = part.indexOf('='); + if (eqIndex <= 0 || eqIndex == part.length() - 1) { + continue; + } + String key = part.substring(0, eqIndex).trim().toLowerCase(Locale.ROOT); + if ("schema".equals(key) || "currentschema".equals(key) || "current_schema".equals(key)) { + String value = part.substring(eqIndex + 1).trim(); + if ((value.startsWith("\"") && value.endsWith("\"")) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.substring(1, value.length() - 1); + } + return value; + } + } + } catch (SQLException ignored) { + return null; + } + return null; + } +} From 3377c357def2e6596cdeb0d073cddb94f71b51cd Mon Sep 17 00:00:00 2001 From: chenbowen Date: Tue, 3 Feb 2026 11:18:30 +0800 Subject: [PATCH 7/7] =?UTF-8?q?Revert=20"=E7=A7=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E4=BE=9D=E8=B5=96"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 667ee852dac79c88662922894e02629ef6ef2117. --- zt-module-bpm/zt-module-bpm-server/pom.xml | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/zt-module-bpm/zt-module-bpm-server/pom.xml b/zt-module-bpm/zt-module-bpm-server/pom.xml index e1928c0..d4ed13e 100644 --- a/zt-module-bpm/zt-module-bpm-server/pom.xml +++ b/zt-module-bpm/zt-module-bpm-server/pom.xml @@ -135,6 +135,90 @@ ${revision} compile + + + com.zt.plat + zt-spring-boot-starter-biz-data-permission + + + com.zt.plat + zt-spring-boot-starter-biz-tenant + + + + + com.zt.plat + zt-spring-boot-starter-security + + + + + com.zt.plat + zt-spring-boot-starter-mybatis + + + + com.zt.plat + zt-spring-boot-starter-redis + + + + + com.zt.plat + zt-spring-boot-starter-rpc + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + + + + + + + com.zt.plat + zt-spring-boot-starter-test + + + + + com.zt.plat + zt-spring-boot-starter-monitor + + + + + com.zt.plat + zt-spring-boot-starter-excel + + + + + org.flowable + flowable-spring-boot-starter-process + + + org.flowable + flowable-spring-boot-starter-actuator + + + com.zt.plat + zt-spring-boot-starter-biz-business + ${revision} + compile +