From 4657dcf91a4c08462dc4a4cad15b1f867577bf99 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 28 May 2022 05:33:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=BB=E5=BA=95=E7=A7=BB=E9=99=A4=20activiti?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6=EF=BC=8C=E4=B8=93=E6=B3=A8=20flowable=20?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/changeSql.sql | 2 - yudao-framework/pom.xml | 1 - .../pom.xml | 48 --- .../config/YudaoActivitiConfiguration.java | 45 --- .../activiti/core/util/ActivitiUtils.java | 109 ------ .../activiti/core/web/ActivitiWebFilter.java | 37 -- .../framework/activiti/package-info.java | 1 - .../main/resources/META-INF/spring.factories | 2 - yudao-module-bpm/pom.xml | 8 +- .../yudao-module-bpm-base/pom.xml | 63 ---- .../admin/definition/BpmFormController.java | 79 ----- .../definition/BpmUserGroupController.java | 85 ----- .../definition/vo/form/BpmFormBaseVO.java | 25 -- .../vo/form/BpmFormCreateReqVO.java | 23 -- .../definition/vo/form/BpmFormPageReqVO.java | 19 -- .../definition/vo/form/BpmFormRespVO.java | 33 -- .../vo/form/BpmFormSimpleRespVO.java | 17 - .../vo/form/BpmFormUpdateReqVO.java | 26 -- .../vo/group/BpmUserGroupBaseVO.java | 31 -- .../vo/group/BpmUserGroupCreateReqVO.java | 12 - .../vo/group/BpmUserGroupPageReqVO.java | 34 -- .../vo/group/BpmUserGroupRespVO.java | 19 -- .../vo/group/BpmUserGroupSimpleRespVO.java | 21 -- .../vo/group/BpmUserGroupUpdateReqVO.java | 17 - .../vo/model/BpmModeImportReqVO.java | 22 -- .../definition/vo/model/BpmModelBaseVO.java | 41 --- .../vo/model/BpmModelCreateReqVO.java | 26 -- .../vo/model/BpmModelPageItemRespVO.java | 49 --- .../vo/model/BpmModelPageReqVO.java | 26 -- .../definition/vo/model/BpmModelRespVO.java | 26 -- .../vo/model/BpmModelUpdateReqVO.java | 40 --- .../vo/model/BpmModelUpdateStateReqVO.java | 21 -- .../BpmProcessDefinitionListReqVO.java | 19 -- .../BpmProcessDefinitionPageItemRespVO.java | 23 -- .../BpmProcessDefinitionPageReqVO.java | 19 -- .../process/BpmProcessDefinitionRespVO.java | 52 --- .../vo/rule/BpmTaskAssignRuleBaseVO.java | 25 -- .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 25 -- .../vo/rule/BpmTaskAssignRuleRespVO.java | 29 -- .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 21 -- .../admin/oa/BpmOALeaveController.http | 12 - .../admin/oa/BpmOALeaveController.java | 63 ---- .../bpm/controller/admin/oa/package-info.java | 5 - .../admin/oa/vo/BpmOALeaveBaseVO.java | 33 -- .../admin/oa/vo/BpmOALeaveCreateReqVO.java | 21 -- .../admin/oa/vo/BpmOALeavePageReqVO.java | 34 -- .../admin/oa/vo/BpmOALeaveRespVO.java | 32 -- .../controller/admin/task/package-info.java | 1 - .../task/vo/activity/BpmActivityRespVO.java | 26 -- .../BpmProcessInstanceCancelReqVO.java | 23 -- .../BpmProcessInstanceCreateReqVO.java | 21 -- .../BpmProcessInstanceMyPageReqVO.java | 44 --- .../BpmProcessInstancePageItemRespVO.java | 55 --- .../vo/instance/BpmProcessInstanceRespVO.java | 97 ------ .../task/vo/task/BpmTaskApproveReqVO.java | 21 -- .../vo/task/BpmTaskDonePageItemRespVO.java | 27 -- .../task/vo/task/BpmTaskDonePageReqVO.java | 32 -- .../task/vo/task/BpmTaskRejectReqVO.java | 21 -- .../admin/task/vo/task/BpmTaskRespVO.java | 39 --- .../vo/task/BpmTaskTodoPageItemRespVO.java | 54 --- .../task/vo/task/BpmTaskTodoPageReqVO.java | 32 -- .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 25 -- .../bpm/controller/app/package-info.java | 4 - .../module/bpm/controller/package-info.java | 6 - .../convert/definition/BpmFormConvert.java | 34 -- .../definition/BpmUserGroupConvert.java | 38 --- .../convert/message/BpmMessageConvert.java | 16 - .../bpm/convert/oa/BpmOALeaveConvert.java | 30 -- .../module/bpm/convert/task/package-info.java | 1 - .../dal/dataobject/definition/BpmFormDO.java | 59 ---- .../definition/BpmProcessDefinitionExtDO.java | 92 ----- .../definition/BpmTaskAssignRuleDO.java | 85 ----- .../definition/BpmTaskMessageRuleDO.java | 5 - .../dataobject/definition/BpmUserGroupDO.java | 54 --- .../bpm/dal/dataobject/oa/BpmOALeaveDO.java | 76 ----- .../task/BpmProcessInstanceExtDO.java | 92 ----- .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 87 ----- .../dal/mysql/definition/BpmFormMapper.java | 25 -- .../BpmProcessDefinitionExtMapper.java | 21 -- .../definition/BpmTaskAssignRuleMapper.java | 35 -- .../mysql/definition/BpmUserGroupMapper.java | 32 -- .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 29 -- .../task/BpmProcessInstanceExtMapper.java | 34 -- .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 25 -- .../definition/BpmModelFormTypeEnum.java | 21 -- .../definition/BpmTaskAssignRuleTypeEnum.java | 37 -- .../definition/BpmTaskRuleScriptEnum.java | 30 -- .../bpm/enums/message/BpmMessageEnum.java | 26 -- .../BpmProcessInstanceDeleteReasonEnum.java | 37 -- .../task/BpmProcessInstanceResultEnum.java | 29 -- .../task/BpmProcessInstanceStatusEnum.java | 27 -- .../bpm/config/BpmCommonConfiguration.java | 19 -- .../event/BpmProcessInstanceResultEvent.java | 44 --- ...BpmProcessInstanceResultEventListener.java | 34 -- ...pmProcessInstanceResultEventPublisher.java | 24 -- .../bpm/core/event/package-info.java | 6 - .../bpm/framework/bpm/core/package-info.java | 4 - .../bpm/framework/bpm/package-info.java | 6 - .../module/bpm/framework/package-info.java | 6 - .../yudao/module/bpm/package-info.java | 10 - .../service/definition/BpmFormService.java | 99 ------ .../definition/BpmFormServiceImpl.java | 136 -------- .../definition/BpmUserGroupService.java | 82 ----- .../definition/BpmUserGroupServiceImpl.java | 111 ------ .../definition/dto/BpmFormFieldRespDTO.java | 25 -- .../dto/BpmModelMetaInfoRespDTO.java | 39 --- .../dto/BpmProcessDefinitionCreateReqDTO.java | 104 ------ .../service/message/BpmMessageService.java | 39 --- .../message/BpmMessageServiceImpl.java | 68 ---- ...eSendWhenProcessInstanceApproveReqDTO.java | 27 -- ...geSendWhenProcessInstanceRejectReqDTO.java | 33 -- .../BpmMessageSendWhenTaskCreatedReqDTO.java | 46 --- .../bpm/service/oa/BpmOALeaveService.java | 53 --- .../bpm/service/oa/BpmOALeaveServiceImpl.java | 88 ----- .../oa/listener/BpmOALeaveResultListener.java | 32 -- .../module/bpm/service/task/package-info.java | 1 - .../definition/BpmFormServiceTest.java | 145 -------- .../definition/BpmUserGroupServiceTest.java | 130 ------- .../test/resources/application-unit-test.yaml | 43 --- .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 2 - .../src/test/resources/sql/create_tables.sql | 28 -- .../yudao-module-bpm-biz-activiti/pom.xml | 39 --- .../yudao/module/bpm/api/package-info.java | 4 - .../api/task/BpmProcessInstanceApiImpl.java | 27 -- .../admin/definition/BpmModelController.java | 96 ------ .../BpmProcessDefinitionController.http | 4 - .../BpmProcessDefinitionController.java | 60 ---- .../BpmTaskAssignRuleController.http | 4 - .../BpmTaskAssignRuleController.java | 59 ---- .../admin/task/BpmActivityController.java | 55 --- .../task/BpmProcessInstanceController.http | 29 -- .../task/BpmProcessInstanceController.java | 60 ---- .../admin/task/BpmTaskController.http | 14 - .../admin/task/BpmTaskController.java | 77 ----- .../bpm/controller/app/package-info.java | 4 - .../module/bpm/controller/package-info.java | 6 - .../convert/definition/BpmModelConvert.java | 142 -------- .../BpmProcessDefinitionConvert.java | 83 ----- .../definition/BpmTaskAssignRuleConvert.java | 42 --- .../module/bpm/convert/package-info.java | 6 - .../bpm/convert/task/BpmActivityConvert.java | 30 -- .../task/BpmProcessInstanceConvert.java | 135 -------- .../bpm/convert/task/BpmTaskConvert.java | 149 -------- ...‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md | 1 - .../config/BpmActivitiConfiguration.java | 80 ----- .../behavior/BpmActivityBehaviorFactory.java | 61 ---- .../behavior/BpmUserTaskActivityBehavior.java | 196 ----------- .../activiti/core/behavior/package-info.java | 7 - .../behavior/script/BpmTaskAssignScript.java | 34 -- .../BpmTaskAssignLeaderAbstractScript.java | 63 ---- .../impl/BpmTaskAssignLeaderX1Script.java | 29 -- .../impl/BpmTaskAssignLeaderX2Script.java | 29 -- .../impl/BpmTaskAssignStartUserScript.java | 30 -- .../core/identity/EmptyUserGroupManager.java | 37 -- .../BpmProcessInstanceEventListener.java | 58 ---- .../BpmTackActivitiEventListener.java | 52 --- .../core/listener/BpmTaskEventListener.java | 63 ---- .../activiti/core/listener/package-info.java | 7 - .../module/bpm/framework/package-info.java | 6 - .../yudao/module/bpm/package-info.java | 12 - .../service/definition/BpmModelService.java | 77 ----- .../definition/BpmModelServiceImpl.java | 282 ---------------- .../BpmProcessDefinitionService.java | 161 --------- .../BpmProcessDefinitionServiceImpl.java | 267 --------------- .../definition/BpmTaskAssignRuleService.java | 87 ----- .../BpmTaskAssignRuleServiceImpl.java | 211 ------------ .../bpm/service/task/BpmActivityService.java | 37 -- .../service/task/BpmActivityServiceImpl.java | 84 ----- .../task/BpmProcessInstanceService.java | 165 --------- .../task/BpmProcessInstanceServiceImpl.java | 310 ----------------- .../bpm/service/task/BpmTaskService.java | 159 --------- .../bpm/service/task/BpmTaskServiceImpl.java | 319 ------------------ .../module/bpm/service/task/package-info.java | 12 - .../BpmUserTaskActivityBehaviorTest.java | 214 ------------ .../impl/BpmTaskAssignLeaderX2ScriptTest.java | 94 ------ .../module/bpm/service/package-info.java | 1 - .../test/resources/application-unit-test.yaml | 49 --- .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 0 .../src/test/resources/sql/create_tables.sql | 0 .../yudao-module-bpm-biz-flowable/pom.xml | 53 --- .../yudao/module/bpm/api/package-info.java | 4 - .../api/task/BpmProcessInstanceApiImpl.java | 28 -- .../admin/definition/BpmModelController.java | 97 ------ .../BpmProcessDefinitionController.java | 59 ---- .../BpmTaskAssignRuleController.java | 58 ---- .../admin/task/BpmActivityController.java | 39 --- .../task/BpmProcessInstanceController.java | 58 ---- .../admin/task/BpmTaskController.java | 88 ----- .../bpm/controller/app/package-info.java | 4 - .../module/bpm/controller/package-info.java | 6 - .../convert/definition/BpmModelConvert.java | 140 -------- .../BpmProcessDefinitionConvert.java | 82 ----- .../definition/BpmTaskAssignRuleConvert.java | 40 --- .../module/bpm/convert/package-info.java | 6 - .../bpm/convert/task/BpmActivityConvert.java | 29 -- .../task/BpmProcessInstanceConvert.java | 114 ------- .../bpm/convert/task/BpmTaskConvert.java | 147 -------- ...‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md | 1 - .../config/BpmFlowableConfiguration.java | 62 ---- .../behavior/BpmActivityBehaviorFactory.java | 55 --- .../behavior/BpmUserTaskActivityBehavior.java | 203 ----------- .../behavior/script/BpmTaskAssignScript.java | 34 -- .../BpmTaskAssignLeaderAbstractScript.java | 71 ---- .../impl/BpmTaskAssignLeaderX1Script.java | 29 -- .../impl/BpmTaskAssignLeaderX2Script.java | 29 -- .../impl/BpmTaskAssignStartUserScript.java | 41 --- .../BpmProcessInstanceEventListener.java | 53 --- .../core/listener/BpmTaskEventListener.java | 52 --- .../module/bpm/framework/package-info.java | 6 - .../yudao/module/bpm/package-info.java | 12 - .../service/definition/BpmModelService.java | 77 ----- .../definition/BpmModelServiceImpl.java | 286 ---------------- .../BpmProcessDefinitionService.java | 159 --------- .../BpmProcessDefinitionServiceImpl.java | 287 ---------------- .../definition/BpmTaskAssignRuleService.java | 87 ----- .../BpmTaskAssignRuleServiceImpl.java | 207 ------------ .../bpm/service/task/BpmActivityService.java | 22 -- .../service/task/BpmActivityServiceImpl.java | 49 --- .../task/BpmProcessInstanceService.java | 149 -------- .../task/BpmProcessInstanceServiceImpl.java | 309 ----------------- .../bpm/service/task/BpmTaskService.java | 123 ------- .../bpm/service/task/BpmTaskServiceImpl.java | 283 ---------------- .../yudao/module/bpm/AbstractOATest.java | 78 ----- .../yudao/module/bpm/ConditionTest.java | 226 ------------- .../yudao/module/bpm/LeaveFormKeyTest.java | 177 ---------- .../yudao/module/bpm/MultiInstancesTest.java | 208 ------------ .../leave-dynamic-form-with-javascript.zip | Bin 25020 -> 0 bytes .../dynamic-form/leave-dynamic-form.zip | Bin 24967 -> 0 bytes .../chapter6/dynamic-form/leave.bpmn | 198 ----------- .../resources/chapter6/dynamic-form/leave.png | Bin 28282 -> 0 bytes .../leave-formkey/approve-deptLeader.form | 31 -- .../chapter6/leave-formkey/approve-hr.form | 31 -- .../chapter6/leave-formkey/leave-formkey.bpmn | 151 --------- .../chapter6/leave-formkey/leave-formkey.png | Bin 28008 -> 0 bytes .../chapter6/leave-formkey/leave-formkey.zip | Bin 30257 -> 0 bytes .../chapter6/leave-formkey/leave-start.form | 18 - .../chapter6/leave-formkey/modify-apply.form | 27 -- .../chapter6/leave-formkey/report-back.form | 28 -- .../approve-deptLeader.form | 31 -- .../leave-timeLimit-money/approve-hr.form | 31 -- .../leave-formkey-ext.bpmn | 188 ----------- .../leave-formkey-ext.png | Bin 17724 -> 0 bytes .../leave-timeLimit-money/leave-start.form | 18 - .../leave-timeLimit-money/modify-apply.form | 27 -- .../leave-timeLimit-money/report-back.form | 28 -- .../diagrams/chapter9/leave-countersign.bpmn | 152 --------- .../diagrams/chapter9/leave-countersign.png | Bin 20431 -> 0 bytes .../testMultiInstanceFixedNumbers.bpmn | 44 --- ...estMultiInstanceForUserTask.exception.bpmn | 42 --- ...testMultiInstanceForUserTask.exception.png | Bin 11790 -> 0 bytes ...MultiInstanceForUserTask.nosequential.bpmn | 35 -- ...stMultiInstanceForUserTask.sequential.bpmn | 35 -- ...nstanceForUserTask.users.nosequential.bpmn | 33 -- ...iInstanceForUserTask.users.sequential.bpmn | 33 -- ...ers.sequential.with.complete.conditon.bpmn | 35 -- ...sers.sequential.with.complete.conditon.png | Bin 8007 -> 0 bytes .../src/test/resources/flowable.cfg.xml | 21 -- 259 files changed, 1 insertion(+), 14600 deletions(-) delete mode 100644 sql/changeSql.sql delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/pom.xml delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/pom.xml delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback.xml delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql delete mode 100644 yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/pom.xml delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehavior.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehaviorTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/application-unit-test.yaml delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/logback.xml delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/clean.sql delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/create_tables.sql delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/pom.xml delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/AbstractOATest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/ConditionTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/LeaveFormKeyTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/MultiInstancesTest.java delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form-with-javascript.zip delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form.zip delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-deptLeader.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-hr.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.zip delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-start.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/modify-apply.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/report-back.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-deptLeader.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-hr.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-start.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/modify-apply.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/report-back.form delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceFixedNumbers.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.nosequential.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.sequential.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.nosequential.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.bpmn delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.png delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/flowable.cfg.xml diff --git a/sql/changeSql.sql b/sql/changeSql.sql deleted file mode 100644 index 6fa4f92b9..000000000 --- a/sql/changeSql.sql +++ /dev/null @@ -1,2 +0,0 @@ --- 增加title 2022-05-17 -alter table tb_article add column title varchar(100) NULL DEFAULT '默认值' COMMENT '注释' after sender_name; \ No newline at end of file diff --git a/yudao-framework/pom.xml b/yudao-framework/pom.xml index 73bb614cd..02e4ff6fe 100644 --- a/yudao-framework/pom.xml +++ b/yudao-framework/pom.xml @@ -30,7 +30,6 @@ yudao-spring-boot-starter-biz-operatelog yudao-spring-boot-starter-biz-dict yudao-spring-boot-starter-biz-sms - yudao-spring-boot-starter-activiti yudao-spring-boot-starter-biz-pay yudao-spring-boot-starter-biz-weixin yudao-spring-boot-starter-biz-social diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml b/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml deleted file mode 100644 index 6a81c1fd7..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - cn.iocoder.boot - yudao-framework - ${revision} - - 4.0.0 - yudao-spring-boot-starter-activiti - jar - - ${project.artifactId} - Activiti 拓展 - https://github.com/YunaiV/ruoyi-vue-pro - - - - cn.iocoder.boot - yudao-common - - - - - cn.iocoder.boot - yudao-spring-boot-starter-security - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mybatis - - - - - org.activiti - activiti-spring-boot-starter - - - org.activiti - activiti-image-generator - - - - - diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java deleted file mode 100644 index ad9780a1f..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.yudao.framework.activiti.config; - -import cn.iocoder.yudao.framework.activiti.core.web.ActivitiWebFilter; -import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; -import org.activiti.image.ProcessDiagramGenerator; -import org.activiti.image.impl.DefaultProcessDiagramGenerator; -import org.activiti.spring.SpringProcessEngineConfiguration; -import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; -import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.ibatis.transaction.TransactionFactory; -import org.mybatis.spring.transaction.SpringManagedTransactionFactory; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.PlatformTransactionManager; - -@Configuration -public class YudaoActivitiConfiguration { - - /** - * Activiti æµç¨‹å›¾çš„生æˆå™¨ã€‚ç›®å‰ç®¡ç†åŽå°çš„æµç¨‹å›¾ svg,通过它绘制生æˆã€‚ - */ - @Bean - public ProcessDiagramGenerator processDiagramGenerator() { - return new DefaultProcessDiagramGenerator(); - } - - @Bean - public FilterRegistrationBean activitiWebFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new ActivitiWebFilter()); - registrationBean.setOrder(WebFilterOrderEnum.ACTIVITI_FILTER); - return registrationBean; - } - - /** - * ProcessEngineConfigurationConfigurer 实现类,设置事务管ç†å™¨ï¼Œä¿è¯ ACT_ 表和自己的表的事务一致性 - */ - @Bean - public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer( - PlatformTransactionManager platformTransactionManager) { - return processEngineConfiguration -> processEngineConfiguration.setTransactionManager(platformTransactionManager); - } - -} diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java deleted file mode 100644 index 13ecf7957..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.yudao.framework.activiti.core.util; - -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import com.alibaba.ttl.TransmittableThreadLocal; -import org.activiti.bpmn.converter.BpmnXMLConverter; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.bpmn.model.FlowElement; -import org.activiti.bpmn.model.Process; -import org.activiti.engine.impl.identity.Authentication; -import org.activiti.engine.impl.util.io.BytesStreamSource; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; - -/** - * Activiti 工具类 - * - * @author 芋é“æºç  - */ -public class ActivitiUtils { - - static { - setAuthenticationThreadLocal(); - } - - // ========== Authentication 相关 ========== - - /** - * å射修改 Authentication çš„ authenticatedUserIdThreadLocal é™æ€å˜é‡ï¼Œä½¿ç”¨ TTL 线程å˜é‡ - * 目的:ä¿è¯ @Async 等异步执行时,å˜é‡ä¸¢å¤±çš„问题 - */ - private static void setAuthenticationThreadLocal() { - ReflectUtil.setFieldValue(Authentication.class, "authenticatedUserIdThreadLocal", - new TransmittableThreadLocal()); - } - - public static void setAuthenticatedUserId(Long userId) { - Authentication.setAuthenticatedUserId(String.valueOf(userId)); - } - - public static void clearAuthenticatedUserId() { - Authentication.setAuthenticatedUserId(null); - } - - public static boolean equals(String userIdStr, Long userId) { - return Objects.equals(userId, NumberUtils.parseLong(userIdStr)); - } - - // ========== BPMN XML 相关 ========== - - /** - * 构建对应的 BPMN Model - * - * @param bpmnBytes 原始的 BPMN XML 字节数组 - * @return BPMN Model - */ - public static BpmnModel buildBpmnModel(byte[] bpmnBytes) { - // 转æ¢æˆ BpmnModel 对象 - BpmnXMLConverter converter = new BpmnXMLConverter(); - return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true); - } - - /** - * 获得 BPMN æµç¨‹ä¸­ï¼ŒæŒ‡å®šçš„元素们 - * - * @param model - * @param clazz 指定元素。例如说,{@link org.activiti.bpmn.model.UserTask}ã€{@link org.activiti.bpmn.model.Gateway} 等等 - * @return 元素们 - */ - 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 String getBpmnXml(BpmnModel model) { - if (model == null) { - return null; - } - return StrUtil.utf8Str(getBpmnBytes(model)); - } - - public static byte[] getBpmnBytes(BpmnModel model) { - if (model == null) { - return new byte[0]; - } - BpmnXMLConverter converter = new BpmnXMLConverter(); - return converter.convertToXML(model); - } - - public static boolean equals(BpmnModel oldModel, BpmnModel newModel) { - // 由于 BpmnModel 未æä¾› equals 方法,所以åªèƒ½è½¬æˆå­—节数组,进行比较 - return Arrays.equals(getBpmnBytes(oldModel), getBpmnBytes(newModel)); - } - -} diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java deleted file mode 100644 index cb190f1fa..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/web/ActivitiWebFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.framework.activiti.core.web; - -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Activiti Web 过滤器,将 userId 设置到 {@link org.activiti.engine.impl.identity.Authentication} 中 - * - * @author 芋é“æºç  - */ -public class ActivitiWebFilter extends OncePerRequestFilter { - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - try { - // 设置工作æµçš„用户 - Long userId = SecurityFrameworkUtils.getLoginUserId(); - if (userId != null) { - ActivitiUtils.setAuthenticatedUserId(userId); - } - // 过滤 - chain.doFilter(request, response); - } finally { - // æ¸…ç† - ActivitiUtils.clearAuthenticatedUserId(); - } - } - -} diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java deleted file mode 100644 index c49d90f93..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.framework.activiti; diff --git a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories b/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 2f091cd70..000000000 --- a/yudao-framework/yudao-spring-boot-starter-activiti/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - cn.iocoder.yudao.framework.activiti.config.YudaoActivitiConfiguration diff --git a/yudao-module-bpm/pom.xml b/yudao-module-bpm/pom.xml index 98a96a9b8..95b798904 100644 --- a/yudao-module-bpm/pom.xml +++ b/yudao-module-bpm/pom.xml @@ -11,9 +11,6 @@ yudao-module-bpm-api yudao-module-bpm-biz - - - yudao-module-bpm pom @@ -24,10 +21,7 @@ 例如说:æµç¨‹å®šä¹‰ã€è¡¨å•é…ç½®ã€å®¡æ ¸ä¸­å¿ƒï¼ˆæˆ‘的申请ã€æˆ‘的待办ã€æˆ‘的已办)等等 bpm 解释:https://baike.baidu.com/item/BPM/1933 - ç›®å‰æ供两套实现方案: - 1. 基于 Activiti 7 实现的 yudao-module-bpm-biz-activiti - 2. 基于 Flowable 6 实现的 yudao-module-bpm-biz-flowable - 两套实现会存在共享的逻辑,所以会继承 yudao-module-bpm-base + 工作æµåŸºäºŽ Flowable 6 实现,分æˆæµç¨‹å®šä¹‰ã€æµç¨‹è¡¨å•ã€æµç¨‹å®žä¾‹ã€æµç¨‹ä»»åŠ¡ç­‰åŠŸèƒ½æ¨¡å—。 diff --git a/yudao-module-bpm/yudao-module-bpm-base/pom.xml b/yudao-module-bpm/yudao-module-bpm-base/pom.xml deleted file mode 100644 index 1980a094d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - cn.iocoder.boot - yudao-module-bpm - ${revision} - - 4.0.0 - yudao-module-bpm-base - - ${project.artifactId} - - bpm-base 模å—,实现公用的工作æµçš„逻辑,æ供给 bpm-activiti å’Œ bpm-flowable å¤ç”¨ - - - - - cn.iocoder.boot - yudao-module-bpm-api - ${revision} - - - cn.iocoder.boot - yudao-module-system-api - ${revision} - - - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-operatelog - - - cn.iocoder.boot - yudao-spring-boot-starter-biz-data-permission - - - - - cn.iocoder.boot - yudao-spring-boot-starter-web - - - - cn.iocoder.boot - yudao-spring-boot-starter-security - - - - - cn.iocoder.boot - yudao-spring-boot-starter-mybatis - - - - - cn.iocoder.boot - yudao-spring-boot-starter-test - - - diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java deleted file mode 100644 index 217067f31..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.*; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - 动æ€è¡¨å•") -@RestController -@RequestMapping("/bpm/form") -@Validated -public class BpmFormController { - - @Resource - private BpmFormService formService; - - @PostMapping("/create") - @ApiOperation("创建动æ€è¡¨å•") - @PreAuthorize("@ss.hasPermission('bpm:form:create')") - public CommonResult createForm(@Valid @RequestBody BpmFormCreateReqVO createReqVO) { - return success(formService.createForm(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新动æ€è¡¨å•") - @PreAuthorize("@ss.hasPermission('bpm:form:update')") - public CommonResult updateForm(@Valid @RequestBody BpmFormUpdateReqVO updateReqVO) { - formService.updateForm(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除动æ€è¡¨å•") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('bpm:form:delete')") - public CommonResult deleteForm(@RequestParam("id") Long id) { - formService.deleteForm(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得动æ€è¡¨å•") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('bpm:form:query')") - public CommonResult getForm(@RequestParam("id") Long id) { - BpmFormDO form = formService.getForm(id); - return success(BpmFormConvert.INSTANCE.convert(form)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获得动æ€è¡¨å•çš„精简列表", notes = "用于表å•ä¸‹æ‹‰æ¡†") - public CommonResult> getSimpleForms() { - List list = formService.getFormList(); - return success(BpmFormConvert.INSTANCE.convertList2(list)); - } - - @GetMapping("/page") - @ApiOperation("获得动æ€è¡¨å•åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:form:query')") - public CommonResult> getFormPage(@Valid BpmFormPageReqVO pageVO) { - PageResult pageResult = formService.getFormPage(pageVO); - return success(BpmFormConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java deleted file mode 100644 index 4267f0902..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmUserGroupController.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - 用户组") -@RestController -@RequestMapping("/bpm/user-group") -@Validated -public class BpmUserGroupController { - - @Resource - private BpmUserGroupService userGroupService; - - @PostMapping("/create") - @ApiOperation("创建用户组") - @PreAuthorize("@ss.hasPermission('bpm:user-group:create')") - public CommonResult createUserGroup(@Valid @RequestBody BpmUserGroupCreateReqVO createReqVO) { - return success(userGroupService.createUserGroup(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新用户组") - @PreAuthorize("@ss.hasPermission('bpm:user-group:update')") - public CommonResult updateUserGroup(@Valid @RequestBody BpmUserGroupUpdateReqVO updateReqVO) { - userGroupService.updateUserGroup(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除用户组") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('bpm:user-group:delete')") - public CommonResult deleteUserGroup(@RequestParam("id") Long id) { - userGroupService.deleteUserGroup(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得用户组") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") - public CommonResult getUserGroup(@RequestParam("id") Long id) { - BpmUserGroupDO userGroup = userGroupService.getUserGroup(id); - return success(BpmUserGroupConvert.INSTANCE.convert(userGroup)); - } - - @GetMapping("/page") - @ApiOperation("获得用户组分页") - @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") - public CommonResult> getUserGroupPage(@Valid BpmUserGroupPageReqVO pageVO) { - PageResult pageResult = userGroupService.getUserGroupPage(pageVO); - return success(BpmUserGroupConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获å–用户组精简信æ¯åˆ—表", notes = "åªåŒ…å«è¢«å¼€å¯çš„用户组,主è¦ç”¨äºŽå‰ç«¯çš„下拉选项") - public CommonResult> getSimpleUserGroups() { - // 获用户门列表,åªè¦å¼€å¯çŠ¶æ€çš„ - List list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); - // 排åºåŽï¼Œè¿”回给å‰ç«¯ - return success(BpmUserGroupConvert.INSTANCE.convertList2(list)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java deleted file mode 100644 index 11fee5c00..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import lombok.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; - -/** -* 动æ€è¡¨å• Base VO,æ供给添加ã€ä¿®æ”¹ã€è¯¦ç»†çš„å­ VO 使用 -* å¦‚æžœå­ VO 存在差异的字段,请ä¸è¦æ·»åŠ åˆ°è¿™é‡Œï¼Œå½±å“ Swagger æ–‡æ¡£ç”Ÿæˆ -*/ -@Data -public class BpmFormBaseVO { - - @ApiModelProperty(value = "表å•å称", required = true, example = "芋é“") - @NotNull(message = "表å•å称ä¸èƒ½ä¸ºç©º") - private String name; - - @ApiModelProperty(value = "表å•çŠ¶æ€", required = true, notes = "å‚è§ CommonStatusEnum 枚举", example = "1") - @NotNull(message = "表å•çŠ¶æ€ä¸èƒ½ä¸ºç©º") - private Integer status; - - @ApiModelProperty(value = "备注", example = "我是备注") - private String remark; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java deleted file mode 100644 index d9a628125..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import lombok.*; -import io.swagger.annotations.*; - -import javax.validation.constraints.NotNull; -import java.util.List; - -@ApiModel("管ç†åŽå° - 动æ€è¡¨å•åˆ›å»º Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmFormCreateReqVO extends BpmFormBaseVO { - - @ApiModelProperty(value = "表å•çš„é…ç½®", required = true, notes = "JSON 字符串") - @NotNull(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @ApiModelProperty(value = "表å•é¡¹çš„数组", required = true, notes = "JSON 字符串的数组") - @NotNull(message = "表å•é¡¹çš„数组ä¸èƒ½ä¸ºç©º") - private List fields; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java deleted file mode 100644 index a8097c437..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormPageReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("管ç†åŽå° - 动æ€è¡¨å•åˆ†é¡µ Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmFormPageReqVO extends PageParam { - - @ApiModelProperty(value = "表å•å称", example = "芋é“") - private String name; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java deleted file mode 100644 index 76cf62046..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; -import java.util.Date; -import java.util.List; - -@ApiModel("管ç†åŽå° - 动æ€è¡¨å• Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmFormRespVO extends BpmFormBaseVO { - - @ApiModelProperty(value = "表å•ç¼–å·", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "表å•çš„é…ç½®", required = true, notes = "JSON 字符串") - @NotNull(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @ApiModelProperty(value = "表å•é¡¹çš„数组", required = true, notes = "JSON 字符串的数组") - @NotNull(message = "表å•é¡¹çš„数组ä¸èƒ½ä¸ºç©º") - private List fields; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java deleted file mode 100644 index 3a6b3c093..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel("管ç†åŽå° - æµç¨‹è¡¨å•ç²¾ç®€ Response VO") -@Data -public class BpmFormSimpleRespVO { - - @ApiModelProperty(value = "表å•ç¼–å·", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "表å•å称", required = true, example = "芋é“") - private String name; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java deleted file mode 100644 index 55b997679..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; - -import lombok.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; -import java.util.List; - -@ApiModel("管ç†åŽå° - 动æ€è¡¨å•æ›´æ–° Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmFormUpdateReqVO extends BpmFormBaseVO { - - @ApiModelProperty(value = "表å•ç¼–å·", required = true, example = "1024") - @NotNull(message = "表å•ç¼–å·ä¸èƒ½ä¸ºç©º") - private Long id; - - @ApiModelProperty(value = "表å•çš„é…ç½®", required = true, notes = "JSON 字符串") - @NotNull(message = "表å•çš„é…ç½®ä¸èƒ½ä¸ºç©º") - private String conf; - - @ApiModelProperty(value = "表å•é¡¹çš„数组", required = true, notes = "JSON 字符串的数组") - @NotNull(message = "表å•é¡¹çš„数组ä¸èƒ½ä¸ºç©º") - private List fields; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java deleted file mode 100644 index e0dfe568e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupBaseVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; - -/** -* 用户组 Base VO,æ供给添加ã€ä¿®æ”¹ã€è¯¦ç»†çš„å­ VO 使用 -* å¦‚æžœå­ VO 存在差异的字段,请ä¸è¦æ·»åŠ åˆ°è¿™é‡Œï¼Œå½±å“ Swagger æ–‡æ¡£ç”Ÿæˆ -*/ -@Data -public class BpmUserGroupBaseVO { - - @ApiModelProperty(value = "组å", required = true, example = "芋é“") - @NotNull(message = "组åä¸èƒ½ä¸ºç©º") - private String name; - - @ApiModelProperty(value = "æè¿°", required = true, example = "芋é“æºç ") - @NotNull(message = "æè¿°ä¸èƒ½ä¸ºç©º") - private String description; - - @ApiModelProperty(value = "æˆå‘˜ç¼–å·æ•°ç»„", required = true, example = "1,2,3") - @NotNull(message = "æˆå‘˜ç¼–å·æ•°ç»„ä¸èƒ½ä¸ºç©º") - private Set memberUserIds; - - @ApiModelProperty(value = "状æ€", required = true, example = "1") - @NotNull(message = "状æ€ä¸èƒ½ä¸ºç©º") - private Integer status; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java deleted file mode 100644 index 48b44d38b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import lombok.*; -import io.swagger.annotations.*; - -@ApiModel("管ç†åŽå° - 用户组创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmUserGroupCreateReqVO extends BpmUserGroupBaseVO { - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java deleted file mode 100644 index 44631737f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupPageReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - 用户组分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmUserGroupPageReqVO extends PageParam { - - @ApiModelProperty(value = "组å", example = "芋é“") - private String name; - - @ApiModelProperty(value = "状æ€", example = "1") - private Integer status; - - @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结æŸåˆ›å»ºæ—¶é—´") - private Date endCreateTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java deleted file mode 100644 index 55018d502..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; - -@ApiModel("管ç†åŽå° - 用户组 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmUserGroupRespVO extends BpmUserGroupBaseVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java deleted file mode 100644 index 0b47f447e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupSimpleRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("管ç†åŽå° - ç”¨æˆ·ç»„ç²¾ç®€ä¿¡æ¯ Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class BpmUserGroupSimpleRespVO { - - @ApiModelProperty(value = "用户组编å·", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "用户组åå­—", required = true, example = "芋é“") - private String name; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java deleted file mode 100644 index 14aa25c5b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/group/BpmUserGroupUpdateReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group; - -import lombok.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; - -@ApiModel("管ç†åŽå° - 用户组更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmUserGroupUpdateReqVO extends BpmUserGroupBaseVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - @NotNull(message = "ç¼–å·ä¸èƒ½ä¸ºç©º") - private Long id; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java deleted file mode 100644 index 7240ba15c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModeImportReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.NotNull; - -@ApiModel(value = "管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„导入 Request VO", description = "相比æµç¨‹æ¨¡åž‹çš„新建æ¥è¯´ï¼Œåªæ˜¯å¤šäº†ä¸€ä¸ª bpmnFile 文件") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmModeImportReqVO extends BpmModelCreateReqVO { - - @ApiModelProperty(value = "BPMN 文件", required = true) - @NotNull(message = "BPMN 文件ä¸èƒ½ä¸ºç©º") - private MultipartFile bpmnFile; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java deleted file mode 100644 index 542a177e4..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -/** -* æµç¨‹æ¨¡åž‹ Base VO,æ供给添加ã€ä¿®æ”¹ã€è¯¦ç»†çš„å­ VO 使用 -* å¦‚æžœå­ VO 存在差异的字段,请ä¸è¦æ·»åŠ åˆ°è¿™é‡Œï¼Œå½±å“ Swagger æ–‡æ¡£ç”Ÿæˆ -*/ -@Data -public class BpmModelBaseVO { - - @ApiModelProperty(value = "æµç¨‹æ ‡è¯†", required = true, example = "process_yudao") - @NotEmpty(message = "æµç¨‹æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String key; - - @ApiModelProperty(value = "æµç¨‹å称", required = true, example = "芋é“") - @NotEmpty(message = "æµç¨‹å称ä¸èƒ½ä¸ºç©º") - private String name; - - @ApiModelProperty(value = "æµç¨‹æè¿°", example = "我是æè¿°") - private String description; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - @NotEmpty(message = "æµç¨‹åˆ†ç±»ä¸èƒ½ä¸ºç©º") - private String category; - - @ApiModelProperty(value = "表å•ç±»åž‹", notes = "å‚è§ bpm_model_form_type æ•°æ®å­—å…¸", example = "1") - private Integer formType; - @ApiModelProperty(value = "表å•ç¼–å·", example = "1024", notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private Long formId; - @ApiModelProperty(value = "自定义表å•çš„æ交路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/create", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomCreatePath; - @ApiModelProperty(value = "自定义表å•çš„查看路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/view", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomViewPath; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java deleted file mode 100644 index c85ef3ae4..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelCreateReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„创建 Request VO") -@Data -public class BpmModelCreateReqVO { - - @ApiModelProperty(value = "æµç¨‹æ ‡è¯†", required = true, example = "process_yudao") - @NotEmpty(message = "æµç¨‹æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String key; - - @ApiModelProperty(value = "æµç¨‹å称", required = true, example = "芋é“") - @NotEmpty(message = "æµç¨‹å称ä¸èƒ½ä¸ºç©º") - private String name; - - @ApiModelProperty(value = "æµç¨‹æè¿°", example = "我是æè¿°") - private String description; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java deleted file mode 100644 index 7442b5ab0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„分页的æ¯ä¸€é¡¹ Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmModelPageItemRespVO extends BpmModelBaseVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - - /** - * 最新部署的æµç¨‹å®šä¹‰ - */ - private ProcessDefinition processDefinition; - - @ApiModel("æµç¨‹å®šä¹‰") - @Data - public static class ProcessDefinition { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "版本", required = true, example = "1") - private Integer version; - - @ApiModelProperty(value = "部署时间", required = true) - private Date deploymentTime; - - @ApiModelProperty(value = "中断状æ€", required = true, example = "1", notes = "å‚è§ SuspensionState 枚举") - private Integer suspensionState; - - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java deleted file mode 100644 index 945da139c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹åˆ†é¡µ Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmModelPageReqVO extends PageParam { - - @ApiModelProperty(value = "标识", example = "process1641042089407", notes = "精准匹é…") - private String key; - - @ApiModelProperty(value = "åå­—", example = "芋é“", notes = "模糊匹é…") - private String name; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - private String category; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java deleted file mode 100644 index bce0f9100..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmModelRespVO extends BpmModelBaseVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "BPMN XML", required = true) - private String bpmnXml; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java deleted file mode 100644 index 972aa31bb..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹çš„æ›´æ–° Request VO") -@Data -public class BpmModelUpdateReqVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - @NotEmpty(message = "ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "æµç¨‹å称", example = "芋é“") - private String name; - - @ApiModelProperty(value = "æµç¨‹æè¿°", example = "我是æè¿°") - private String description; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - private String category; - - @ApiModelProperty(value = "BPMN XML", required = true) - private String bpmnXml; - - @ApiModelProperty(value = "表å•ç±»åž‹", notes = "å‚è§ bpm_model_form_type æ•°æ®å­—å…¸", example = "1") - private Integer formType; - @ApiModelProperty(value = "表å•ç¼–å·", example = "1024", notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private Long formId; - @ApiModelProperty(value = "自定义表å•çš„æ交路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/create", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomCreatePath; - @ApiModelProperty(value = "自定义表å•çš„查看路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/view", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomViewPath; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java deleted file mode 100644 index 9cfcebbdc..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@ApiModel("管ç†åŽå° - æµç¨‹æ¨¡åž‹æ›´æ–°çŠ¶æ€ Request VO") -@Data -public class BpmModelUpdateStateReqVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - @NotNull(message = "ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "状æ€", required = true, example = "1", notes = "è§ SuspensionState 枚举") - @NotNull(message = "状æ€ä¸èƒ½ä¸ºç©º") - private Integer state; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java deleted file mode 100644 index 5e45b8bde..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("管ç†åŽå° - æµç¨‹å®šä¹‰åˆ—表 Request VO") -@Data -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -public class BpmProcessDefinitionListReqVO extends PageParam { - - @ApiModelProperty(value = "中断状æ€", example = "1", notes = "å‚è§ SuspensionState 枚举") - private Integer suspensionState; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java deleted file mode 100644 index 75990f08a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹å®šä¹‰çš„分页的æ¯ä¸€é¡¹ Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmProcessDefinitionPageItemRespVO extends BpmProcessDefinitionRespVO { - - @ApiModelProperty(value = "表å•åå­—", example = "请å‡è¡¨å•") - private String formName; - - @ApiModelProperty(value = "部署时间", required = true) - private Date deploymentTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java deleted file mode 100644 index a9657e9a2..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("管ç†åŽå° - æµç¨‹å®šä¹‰åˆ†é¡µ Request VO") -@Data -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -public class BpmProcessDefinitionPageReqVO extends PageParam { - - @ApiModelProperty(value = "标识", example = "process1641042089407", notes = "精准匹é…") - private String key; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java deleted file mode 100644 index 6f8fd4e5b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@ApiModel("管ç†åŽå° - æµç¨‹å®šä¹‰ Response VO") -@Data -public class BpmProcessDefinitionRespVO { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "版本", required = true, example = "1") - private Integer version; - - @ApiModelProperty(value = "æµç¨‹å称", required = true, example = "芋é“") - @NotEmpty(message = "æµç¨‹å称ä¸èƒ½ä¸ºç©º") - private String name; - - @ApiModelProperty(value = "æµç¨‹æè¿°", example = "我是æè¿°") - private String description; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - @NotEmpty(message = "æµç¨‹åˆ†ç±»ä¸èƒ½ä¸ºç©º") - private String category; - - @ApiModelProperty(value = "表å•ç±»åž‹", notes = "å‚è§ bpm_model_form_type æ•°æ®å­—å…¸", example = "1") - private Integer formType; - @ApiModelProperty(value = "表å•ç¼–å·", example = "1024", notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private Long formId; - @ApiModelProperty(value = "表å•çš„é…ç½®", required = true, - notes = "JSON 字符串。在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formConf; - @ApiModelProperty(value = "表å•é¡¹çš„数组", required = true, - notes = "JSON 字符串的数组。在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private List formFields; - @ApiModelProperty(value = "自定义表å•çš„æ交路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/create", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomCreatePath; - @ApiModelProperty(value = "自定义表å•çš„查看路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/view", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomViewPath; - - @ApiModelProperty(value = "中断状æ€", required = true, example = "1", notes = "å‚è§ SuspensionState 枚举") - private Integer suspensionState; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java deleted file mode 100644 index bcb9fc0f0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleBaseVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Set; - -/** - * æµç¨‹ä»»åŠ¡åˆ†é…规则 Base VO,æ供给添加ã€ä¿®æ”¹ã€è¯¦ç»†çš„å­ VO 使用 - * å¦‚æžœå­ VO 存在差异的字段,请ä¸è¦æ·»åŠ åˆ°è¿™é‡Œï¼Œå½±å“ Swagger æ–‡æ¡£ç”Ÿæˆ - */ -@Data -public class BpmTaskAssignRuleBaseVO { - - @ApiModelProperty(value = "规则类型", required = true, example = "bpm_task_assign_rule_type") - @NotNull(message = "规则类型ä¸èƒ½ä¸ºç©º") - private Integer type; - - @ApiModelProperty(value = "规则值数组", required = true, example = "1,2,3") - @NotNull(message = "规则值数组ä¸èƒ½ä¸ºç©º") - private Set options; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java deleted file mode 100644 index cbbc108c0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡åˆ†é…规则的创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskAssignRuleCreateReqVO extends BpmTaskAssignRuleBaseVO { - - @ApiModelProperty(value = "æµç¨‹æ¨¡åž‹çš„ç¼–å·", required = true, example = "1024") - @NotEmpty(message = "æµç¨‹æ¨¡åž‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String modelId; - - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡å®šä¹‰çš„ç¼–å·", required = true, example = "2048") - @NotEmpty(message = "æµç¨‹ä»»åŠ¡å®šä¹‰çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String taskDefinitionKey; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java deleted file mode 100644 index c0786e52b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleRespVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡åˆ†é…规则的 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskAssignRuleRespVO extends BpmTaskAssignRuleBaseVO { - - @ApiModelProperty(value = "任务分é…规则的编å·", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "æµç¨‹æ¨¡åž‹çš„ç¼–å·", required = true, example = "2048") - private String modelId; - - @ApiModelProperty(value = "æµç¨‹å®šä¹‰çš„ç¼–å·", required = true, example = "4096") - private String processDefinitionId; - - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡å®šä¹‰çš„ç¼–å·", required = true, example = "2048") - private String taskDefinitionKey; - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡å®šä¹‰çš„åå­—", required = true, example = "关注芋é“") - private String taskDefinitionName; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java deleted file mode 100644 index 8f1c12701..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡åˆ†é…规则的更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskAssignRuleUpdateReqVO extends BpmTaskAssignRuleBaseVO { - - @ApiModelProperty(value = "任务分é…规则的编å·", required = true, example = "1024") - @NotNull(message = "任务分é…规则的编å·ä¸èƒ½ä¸ºç©º") - private Long id; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.http deleted file mode 100644 index 96bbf964d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java deleted file mode 100644 index dd66580d3..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.oa; - -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -/** - * OA 请å‡ç”³è¯· Controller,用于演示自己存储数æ®ï¼ŒæŽ¥å…¥å·¥ä½œæµçš„ä¾‹å­ - * - * @author jason - * @author 芋é“æºç  - */ -@Api(tags = "管ç†åŽå° - OA 请å‡ç”³è¯·") -@RestController -@RequestMapping("/bpm/oa/leave") -@Validated -public class BpmOALeaveController { - - @Resource - private BpmOALeaveService leaveService; - - @PostMapping("/create") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')") - @ApiOperation("创建请求申请") - public CommonResult createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) { - return success(leaveService.createLeave(getLoginUserId(), createReqVO)); - } - - @GetMapping("/get") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") - @ApiOperation("获得请å‡ç”³è¯·") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = Long.class) - public CommonResult getLeave(@RequestParam("id") Long id) { - BpmOALeaveDO leave = leaveService.getLeave(id); - return success(BpmOALeaveConvert.INSTANCE.convert(leave)); - } - - @GetMapping("/page") - @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") - @ApiOperation("获得请å‡ç”³è¯·åˆ†é¡µ") - public CommonResult> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) { - PageResult pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO); - return success(BpmOALeaveConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java deleted file mode 100644 index 7028708b1..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * OA 示例,用于演示外部业务接入 BPM 工作æµçš„示例 - * 一般的接入方å¼ï¼Œåªéœ€è¦è°ƒç”¨ 接å£ï¼ŒåŽç»­ Admin 用户在管ç†åŽå°çš„ã€å¾…办事务】进行审批 - */ -package cn.iocoder.yudao.module.bpm.controller.admin.oa; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java deleted file mode 100644 index cbc568a11..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 请å‡ç”³è¯· Base VO,æ供给添加ã€ä¿®æ”¹ã€è¯¦ç»†çš„å­ VO 使用 -* å¦‚æžœå­ VO 存在差异的字段,请ä¸è¦æ·»åŠ åˆ°è¿™é‡Œï¼Œå½±å“ Swagger æ–‡æ¡£ç”Ÿæˆ -*/ -@Data -public class BpmOALeaveBaseVO { - - @ApiModelProperty(value = "请å‡çš„开始时间", required = true) - @NotNull(message = "开始时间ä¸èƒ½ä¸ºç©º") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date startTime; - @ApiModelProperty(value = "请å‡çš„结æŸæ—¶é—´", required = true) - @NotNull(message = "结æŸæ—¶é—´ä¸èƒ½ä¸ºç©º") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "请å‡ç±»åž‹", required = true, example = "1", notes = "å‚è§ bpm_oa_type 枚举") - private Integer type; - - @ApiModelProperty(value = "原因", required = true, example = "阅读芋é“æºç ") - private String reason; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java deleted file mode 100644 index 2ebab63e9..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.AssertTrue; - -@ApiModel("管ç†åŽå° - 请å‡ç”³è¯·åˆ›å»º Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { - - @AssertTrue(message = "结æŸæ—¶é—´ï¼Œéœ€è¦åœ¨å¼€å§‹æ—¶é—´ä¹‹åŽ") - public boolean isEndTimeValid() { - return !getEndTime().before(getStartTime()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java deleted file mode 100644 index 0443d44f5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("管ç†åŽå° - 请å‡ç”³è¯·åˆ†é¡µ Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmOALeavePageReqVO extends PageParam { - - @ApiModelProperty(value = "状æ€", example = "1", notes = "å‚è§ bpm_process_instance_result 枚举") - private Integer result; - - @ApiModelProperty(value = "请å‡ç±»åž‹", example = "1", notes = "å‚è§ bpm_oa_type") - private Integer type; - - @ApiModelProperty(value = "原因", example = "阅读芋é“æºç ", notes = "模糊匹é…") - private String reason; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始申请时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结æŸç”³è¯·æ—¶é—´") - private Date endCreateTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java deleted file mode 100644 index 908c48e06..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; - -import lombok.*; -import io.swagger.annotations.*; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("管ç†åŽå° - 请å‡ç”³è¯· Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmOALeaveRespVO extends BpmOALeaveBaseVO { - - @ApiModelProperty(value = "请å‡è¡¨å•ä¸»é”®", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "状æ€", required = true, example = "1", notes = "å‚è§ bpm_process_instance_result 枚举") - private Integer result; - - @ApiModelProperty(value = "申请时间", required = true) - @NotNull(message = "申请时间ä¸èƒ½ä¸ºç©º") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date createTime; - - @ApiModelProperty(value = "æµç¨‹id") - private String processInstanceId; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java deleted file mode 100644 index 6cf7f955b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java deleted file mode 100644 index ef9d11ac1..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹æ´»åŠ¨çš„ Response VO") -@Data -public class BpmActivityRespVO { - - @ApiModelProperty(value = "æµç¨‹æ´»åŠ¨çš„标识", required = true, example = "1024") - private String key; - @ApiModelProperty(value = "æµç¨‹æ´»åŠ¨çš„类型", required = true, example = "StartEvent") - private String type; - - @ApiModelProperty(value = "æµç¨‹æ´»åŠ¨çš„开始时间", required = true) - private Date startTime; - @ApiModelProperty(value = "æµç¨‹æ´»åŠ¨çš„结æŸæ—¶é—´", required = true) - private Date endTime; - - @ApiModelProperty(value = "å…³è”çš„æµç¨‹ä»»åŠ¡çš„ç¼–å·", example = "2048", notes = "å…³è”çš„æµç¨‹ä»»åŠ¡ï¼Œåªæœ‰ UserTask 等类型æ‰æœ‰") - private String taskId; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java deleted file mode 100644 index 928f187e7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCancelReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Map; - -@ApiModel("管ç†åŽå° - æµç¨‹å®žä¾‹çš„å–消 Request VO") -@Data -public class BpmProcessInstanceCancelReqVO { - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, example = "1024") - @NotEmpty(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "å–消原因", required = true, example = "ä¸è¯·å‡äº†ï¼") - @NotEmpty(message = "å–消原因ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java deleted file mode 100644 index 2085253d3..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import java.util.Map; - -@ApiModel("管ç†åŽå° - æµç¨‹å®žä¾‹çš„创建 Request VO") -@Data -public class BpmProcessInstanceCreateReqVO { - - @ApiModelProperty(value = "æµç¨‹å®šä¹‰çš„ç¼–å·", required = true, example = "1024") - @NotEmpty(message = "æµç¨‹å®šä¹‰ç¼–å·ä¸èƒ½ä¸ºç©º") - private String processDefinitionId; - - @ApiModelProperty(value = "å˜é‡å®žä¾‹") - private Map variables; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java deleted file mode 100644 index e1e4327ea..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("管ç†åŽå° - æµç¨‹å®žä¾‹çš„分页 Item Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmProcessInstanceMyPageReqVO extends PageParam { - - @ApiModelProperty(value = "æµç¨‹å称", example = "芋é“") - private String name; - - @ApiModelProperty(value = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048") - private String processDefinitionId; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„状æ€", notes = "å‚è§ bpm_process_instance_status", example = "1") - private Integer status; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„结果", notes = "å‚è§ bpm_process_instance_result", example = "2") - private Integer result; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - private String category; - - @ApiModelProperty(value = "开始的创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginCreateTime; - - @ApiModelProperty(value = "结æŸçš„创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endCreateTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java deleted file mode 100644 index 5b5d5797a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -@ApiModel("管ç†åŽå° - æµç¨‹å®žä¾‹çš„分页 Item Response VO") -@Data -public class BpmProcessInstancePageItemRespVO { - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "æµç¨‹å称", required = true, example = "芋é“") - private String name; - - @ApiModelProperty(value = "æµç¨‹å®šä¹‰çš„ç¼–å·", required = true, example = "2048") - private String processDefinitionId; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", required = true, notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - private String category; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„状æ€", required = true, notes = "å‚è§ bpm_process_instance_status", example = "1") - private Integer status; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„结果", required = true, notes = "å‚è§ bpm_process_instance_result", example = "2") - private Integer result; - - @ApiModelProperty(value = "æ交时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "结æŸæ—¶é—´", required = true) - private Date endTime; - - /** - * 当å‰ä»»åŠ¡ - */ - private List tasks; - - @ApiModel("æµç¨‹ä»»åŠ¡") - @Data - public static class Task { - - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡çš„ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "任务å称", required = true, example = "芋é“") - private String name; - - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java deleted file mode 100644 index a1547b175..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -@ApiModel("管ç†åŽå° - æµç¨‹å®žä¾‹çš„ Response VO") -@Data -public class BpmProcessInstanceRespVO { - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "æµç¨‹å称", required = true, example = "芋é“") - private String name; - - @ApiModelProperty(value = "æµç¨‹åˆ†ç±»", required = true, notes = "å‚è§ bpm_model_category æ•°æ®å­—å…¸", example = "1") - private String category; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„状æ€", required = true, notes = "å‚è§ bpm_process_instance_status", example = "1") - private Integer status; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹çš„结果", required = true, notes = "å‚è§ bpm_process_instance_result", example = "2") - private Integer result; - - @ApiModelProperty(value = "æ交时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "结æŸæ—¶é—´", required = true) - private Date endTime; - - @ApiModelProperty(value = "æ交的表å•å€¼", required = true) - private Map formVariables; - - @ApiModelProperty(value = "业务的唯一标识", example = "1", notes = "例如说,请å‡ç”³è¯·çš„ç¼–å·") - private String businessKey; - - /** - * å‘èµ·æµç¨‹çš„用户 - */ - private User startUser; - - /** - * æµç¨‹å®šä¹‰ - */ - private ProcessDefinition processDefinition; - - @ApiModel("用户信æ¯") - @Data - public static class User { - - @ApiModelProperty(value = "用户编å·", required = true, example = "1") - private Long id; - @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") - private String nickname; - - @ApiModelProperty(value = "部门编å·", required = true, example = "1") - private Long deptId; - @ApiModelProperty(value = "部门å称", required = true, example = "ç ”å‘部") - private String deptName; - - } - - @ApiModel("æµç¨‹å®šä¹‰ä¿¡æ¯") - @Data - public static class ProcessDefinition { - - @ApiModelProperty(value = "ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "表å•ç±»åž‹", notes = "å‚è§ bpm_model_form_type æ•°æ®å­—å…¸", example = "1") - private Integer formType; - @ApiModelProperty(value = "表å•ç¼–å·", example = "1024", notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private Long formId; - @ApiModelProperty(value = "表å•çš„é…ç½®", required = true, - notes = "JSON 字符串。在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formConf; - @ApiModelProperty(value = "表å•é¡¹çš„数组", required = true, - notes = "JSON 字符串的数组。在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private List formFields; - @ApiModelProperty(value = "自定义表å•çš„æ交路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/create", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomCreatePath; - @ApiModelProperty(value = "自定义表å•çš„查看路径,使用 Vue 的路由地å€", example = "/bpm/oa/leave/view", - notes = "在表å•ç±»åž‹ä¸º {@link BpmModelFormTypeEnum#CUSTOM} 时,必须éžç©º") - private String formCustomViewPath; - - @ApiModelProperty(value = "BPMN XML", required = true) - private String bpmnXml; - - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java deleted file mode 100644 index 1b6a69066..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("管ç†åŽå° - 通过æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskApproveReqVO { - - @ApiModelProperty(value = "任务编å·", required = true, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "审批æ„è§", required = true, example = "ä¸é”™ä¸é”™ï¼") - @NotEmpty(message = "审批æ„è§ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java deleted file mode 100644 index c5e2c23ae..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„ Done 已完æˆçš„分页项 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskDonePageItemRespVO extends BpmTaskTodoPageItemRespVO { - - @ApiModelProperty(value = "结æŸæ—¶é—´", required = true) - private Date endTime; - @ApiModelProperty(value = "æŒç»­æ—¶é—´", required = true, example = "1000") - private Long durationInMillis; - - @ApiModelProperty(value = "任务结果", required = true, notes = "å‚è§ bpm_process_instance_result", example = "2") - private Integer result; - @ApiModelProperty(value = "审批建议", required = true, example = "ä¸è¯·å‡äº†ï¼") - private String reason; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java deleted file mode 100644 index 99145b434..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„ Done 已办的分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskDonePageReqVO extends PageParam { - - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡å", example = "芋é“") - private String name; - - @ApiModelProperty(value = "开始的创建收间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginCreateTime; - - @ApiModelProperty(value = "结æŸçš„创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endCreateTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java deleted file mode 100644 index 596a82f77..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("管ç†åŽå° - ä¸é€šè¿‡æµç¨‹ä»»åŠ¡çš„ Request VO") -@Data -public class BpmTaskRejectReqVO { - - @ApiModelProperty(value = "任务编å·", required = true, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "审批æ„è§", required = true, example = "ä¸é”™ä¸é”™ï¼") - @NotEmpty(message = "审批æ„è§ä¸èƒ½ä¸ºç©º") - private String reason; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java deleted file mode 100644 index 9100eb3cd..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„ Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskRespVO extends BpmTaskDonePageItemRespVO { - - @ApiModelProperty(value = "任务定义的标识", required = true, example = "user-001") - private String definitionKey; - - /** - * å®¡æ ¸çš„ç”¨æˆ·ä¿¡æ¯ - */ - private User assigneeUser; - - @ApiModel("用户信æ¯") - @Data - public static class User { - - @ApiModelProperty(value = "用户编å·", required = true, example = "1") - private Long id; - @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") - private String nickname; - - @ApiModelProperty(value = "部门编å·", required = true, example = "1") - private Long deptId; - @ApiModelProperty(value = "部门å称", required = true, example = "ç ”å‘部") - private String deptName; - - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java deleted file mode 100644 index e25e3aa49..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„ Running 进行中的分页项 Response VO") -@Data -public class BpmTaskTodoPageItemRespVO { - - @ApiModelProperty(value = "任务编å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "任务åå­—", required = true, example = "芋é“") - private String name; - - @ApiModelProperty(value = "接收时间", required = true) - private Date claimTime; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "激活状æ€", required = true, example = "1", notes = "å‚è§ SuspensionState 枚举") - private Integer suspensionState; - - /** - * 所属æµç¨‹å®žä¾‹ - */ - private ProcessInstance processInstance; - - @Data - @ApiModel("æµç¨‹å®žä¾‹") - public static class ProcessInstance { - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹ç¼–å·", required = true, example = "1024") - private String id; - - @ApiModelProperty(value = "æµç¨‹å®žä¾‹å称", required = true, example = "芋é“") - private String name; - - @ApiModelProperty(value = "å‘起人的用户编å·", required = true, example = "1024") - private Long startUserId; - - @ApiModelProperty(value = "å‘起人的用户昵称", required = true, example = "芋艿") - private String startUserNickname; - - @ApiModelProperty(value = "æµç¨‹å®šä¹‰çš„ç¼–å·", required = true, example = "2048") - private String processDefinitionId; - - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java deleted file mode 100644 index 9f248e198..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„ TODO 待办的分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskTodoPageReqVO extends PageParam { - - @ApiModelProperty(value = "æµç¨‹ä»»åŠ¡å", example = "芋é“") - private String name; - - @ApiModelProperty(value = "开始的创建收间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginCreateTime; - - @ApiModelProperty(value = "结æŸçš„创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endCreateTime; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java deleted file mode 100644 index 0dd0ffed4..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import net.bytebuddy.implementation.bind.annotation.Empty; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@ApiModel("管ç†åŽå° - æµç¨‹ä»»åŠ¡çš„更新负责人的 Request VO") -@Data -public class BpmTaskUpdateAssigneeReqVO { - - @ApiModelProperty(value = "任务编å·", required = true, example = "1024") - @NotEmpty(message = "任务编å·ä¸èƒ½ä¸ºç©º") - private String id; - - @ApiModelProperty(value = "新审批人的用户编å·", required = true, example = "2048") - @NotNull(message = "新审批人的用户编å·ä¸èƒ½ä¸ºç©º") - private Long assigneeUserId; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java deleted file mode 100644 index e8d285e35..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package cn.iocoder.yudao.module.bpm.controller.app; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java deleted file mode 100644 index d1930bd6a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› RESTful API ç»™å‰ç«¯ï¼š - * 1. admin 包:æ供给管ç†åŽå° yudao-ui-admin å‰ç«¯é¡¹ç›® - * 2. app 包:æ供给用户 APP yudao-ui-app å‰ç«¯é¡¹ç›®ï¼Œå®ƒçš„ Controller å’Œ VO 都è¦æ·»åŠ  App å‰ç¼€ï¼Œç”¨äºŽå’Œç®¡ç†åŽå°è¿›è¡ŒåŒºåˆ† - */ -package cn.iocoder.yudao.module.bpm.controller; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java deleted file mode 100644 index 6ba757417..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSimpleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 动æ€è¡¨å• Convert - * - * @author 芋艿 - */ -@Mapper -public interface BpmFormConvert { - - BpmFormConvert INSTANCE = Mappers.getMapper(BpmFormConvert.class); - - BpmFormDO convert(BpmFormCreateReqVO bean); - - BpmFormDO convert(BpmFormUpdateReqVO bean); - - BpmFormRespVO convert(BpmFormDO bean); - - List convertList2(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java deleted file mode 100644 index bbf00ba52..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmUserGroupConvert.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import java.util.*; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import org.mapstruct.Mapper; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -/** - * 用户组 Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmUserGroupConvert { - - BpmUserGroupConvert INSTANCE = Mappers.getMapper(BpmUserGroupConvert.class); - - BpmUserGroupDO convert(BpmUserGroupCreateReqVO bean); - - BpmUserGroupDO convert(BpmUserGroupUpdateReqVO bean); - - BpmUserGroupRespVO convert(BpmUserGroupDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - @Named("convertList2") - List convertList2(List list); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java deleted file mode 100644 index 92683f4c9..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/message/BpmMessageConvert.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.message; - -import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Map; - -@Mapper -public interface BpmMessageConvert { - - BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); - - SmsSendSingleToUserReqDTO convert(Long userId, String templateCode, Map templateParams); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java deleted file mode 100644 index f87531bfc..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.oa; - -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 请å‡ç”³è¯· Convert - * - * @author 芋艿 - */ -@Mapper -public interface BpmOALeaveConvert { - - BpmOALeaveConvert INSTANCE = Mappers.getMapper(BpmOALeaveConvert.class); - - BpmOALeaveDO convert(BpmOALeaveCreateReqVO bean); - - BpmOALeaveRespVO convert(BpmOALeaveDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java deleted file mode 100644 index 6a53114a8..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java deleted file mode 100644 index bd8d79d5b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmFormDO.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * 工作æµçš„表å•å®šä¹‰ - * 用于工作æµçš„申请表å•ï¼Œéœ€è¦åŠ¨æ€é…置的场景 - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_form", autoResultMap = true) -@KeySequence("bpm_form_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmFormDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId - 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java deleted file mode 100644 index eb7d31d86..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * Bpm æµç¨‹å®šä¹‰çš„拓展表 - * 主è¦è§£å†³ Activiti {@link ProcessDefinition} ä¸æ”¯æŒæ‹“展字段,所以新建拓展表 - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_process_definition_ext", autoResultMap = true) -@KeySequence("bpm_process_definition_ext_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmProcessDefinitionExtDO extends BaseDO { - - /** - * ç¼–å· - */ - @TableId - private Long id; - /** - * æµç¨‹å®šä¹‰çš„ç¼–å· - * - * å…³è” ProcessDefinition çš„ id 属性 - */ - private String processDefinitionId; - /** - * æµç¨‹æ¨¡åž‹çš„ç¼–å· - * - * å…³è” Model çš„ id 属性 - */ - private String modelId; - /** - * æè¿° - */ - 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; - - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java deleted file mode 100644 index 84c0a5771..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Set; - -/** - * Bpm 任务分é…的规则表,用于自定义é…ç½®æ¯ä¸ªä»»åŠ¡çš„负责人ã€å€™é€‰äººçš„分é…规则。 - * 也就是说,废弃 BPMN 原本的 UserTask 设置的 assigneeã€candidateUsers ç­‰é…置,而是通过使用该规则进行计算对应的负责人。 - * - * 1. 默认情况下,{@link #processDefinitionId} 为 {@link #PROCESS_DEFINITION_ID_NULL} 值,表示贵改则与æµç¨‹æ¨¡åž‹å…³è” - * 2. 在æµç¨‹æ¨¡åž‹éƒ¨ç½²åŽï¼Œä¼šå°†ä»–的所有规则记录,å¤åˆ¶å‡ºä¸€ä»½æ–°éƒ¨ç½²å‡ºæ¥çš„æµç¨‹å®šä¹‰ï¼Œé€šè¿‡è®¾ç½® {@link #processDefinitionId} 为新的æµç¨‹å®šä¹‰çš„ç¼–å·è¿›è¡Œå…³è” - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_task_assign_rule", autoResultMap = true) -@KeySequence("bpm_task_assign_rule_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmTaskAssignRuleDO extends BaseDO { - - /** - * {@link #processDefinitionId} 空串,用于标识属于æµç¨‹æ¨¡åž‹ï¼Œè€Œä¸å±žäºŽæµç¨‹å®šä¹‰ - * ä¸ä½¿ç”¨ç©ºä¸²çš„原因,Oracle 针对空串,会处ç†æˆ null,进而导致无法检索 - */ - public static final String PROCESS_DEFINITION_ID_NULL = "DEFAULT"; - - /** - * ç¼–å· - */ - @TableId - private Long id; - - /** - * æµç¨‹æ¨¡åž‹ç¼–å· - * - * å…³è” Model çš„ id 属性 - */ - private String modelId; - /** - * æµç¨‹å®šä¹‰ç¼–å· - * - * å…³è” ProcessDefinition çš„ id 属性 - */ - private String processDefinitionId; - /** - * æµç¨‹ä»»åŠ¡çš„定义 Key - * - * å…³è” Task çš„ taskDefinitionKey 属性 - */ - private String taskDefinitionKey; - - /** - * 规则类型 - * - * 枚举 {@link BpmTaskAssignRuleTypeEnum} - */ - private Integer type; - /** - * 规则值数组,一般关è”æŒ‡å®šè¡¨çš„ç¼–å· - * æ ¹æ® type ä¸åŒï¼Œå¯¹åº”的值是ä¸åŒçš„: - * - * 1. {@link BpmTaskAssignRuleTypeEnum#ROLE} æ—¶ï¼šè§’è‰²ç¼–å· - * 2. {@link BpmTaskAssignRuleTypeEnum#DEPT_MEMBER} æ—¶ï¼šéƒ¨é—¨ç¼–å· - * 3. {@link BpmTaskAssignRuleTypeEnum#DEPT_LEADER} æ—¶ï¼šéƒ¨é—¨ç¼–å· - * 4. {@link BpmTaskAssignRuleTypeEnum#USER} æ—¶ï¼šç”¨æˆ·ç¼–å· - * 5. {@link BpmTaskAssignRuleTypeEnum#USER_GROUP} æ—¶ï¼šç”¨æˆ·ç»„ç¼–å· - * 6. {@link BpmTaskAssignRuleTypeEnum#SCRIPT} 时:脚本编å·ï¼Œç›®å‰é€šè¿‡ {@link BpmTaskRuleScriptEnum#getId()} 标识 - */ - @TableField(typeHandler = JsonLongSetTypeHandler.class) - private Set options; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java deleted file mode 100644 index db204c027..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; - -// TODO 芋艿:先埋个å‘。任务消æ¯çš„é…置规则。说白了,就是ä¸åŒçš„ -public class BpmTaskMessageRuleDO { -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java deleted file mode 100644 index 707e3a32c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Set; - -/** - * Bpm 用户组 - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_user_group", autoResultMap = true) -@KeySequence("bpm_user_group_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmUserGroupDO extends BaseDO { - - /** - * ç¼–å·ï¼Œè‡ªå¢ž - */ - @TableId - private Long id; - /** - * 组å - */ - private String name; - /** - * æè¿° - */ - private String description; - /** - * çŠ¶æ€ - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * æˆå‘˜ç”¨æˆ·ç¼–å·æ•°ç»„ - */ - @TableField(typeHandler = JsonLongSetTypeHandler.class) - private Set memberUserIds; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java deleted file mode 100644 index c1a4858f8..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.oa; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Date; - -/** - * OA 请å‡ç”³è¯· DO - * - * {@link #day} 请å‡å¤©æ•°ï¼Œç›®å‰å…ˆç®€å•åšã€‚一般是分æˆè¯·å‡ä¸Šåˆå’Œä¸‹åˆï¼Œå¯ä»¥æ˜¯ 1 整天,å¯ä»¥æ˜¯ 0.5 åŠå¤© - * - * @author jason - * @author 芋é“æºç  - */ -@TableName("bpm_oa_leave") -@KeySequence("bpm_oa_leave_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BpmOALeaveDO extends BaseDO { - - /** - * 请å‡è¡¨å•ä¸»é”® - */ - @TableId - private Long id; - /** - * ç”³è¯·äººçš„ç”¨æˆ·ç¼–å· - * - * å…³è” AdminUserDO çš„ id 属性 - */ - private Long userId; - /** - * 请å‡ç±»åž‹ - */ - private Integer type; - /** - * 原因 - */ - private String reason; - /** - * 开始时间 - */ - private Date startTime; - /** - * 结æŸæ—¶é—´ - */ - private Date endTime; - /** - * 请å‡å¤©æ•° - */ - private Long day; - /** - * 请å‡çš„结果 - * - * 枚举 {@link BpmProcessInstanceResultEnum} - * 考虑到简å•ï¼Œæ‰€ä»¥ç›´æŽ¥å¤ç”¨äº† BpmProcessInstanceResultEnum 枚举,也å¯ä»¥è‡ªå·±å®šä¹‰ä¸€ä¸ªæžšä¸¾å“ˆ - */ - private Integer result; - - /** - * 对应的æµç¨‹ç¼–å· - * - * å…³è” ProcessInstance çš„ id 属性 - */ - private String processInstanceId; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java deleted file mode 100644 index 9a6f603da..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.task; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; -import java.util.Map; - -/** - * Bpm æµç¨‹å®žä¾‹çš„拓展表 - * 主è¦è§£å†³ Activiti ProcessInstance å’Œ HistoricProcessInstance ä¸æ”¯æŒæ‹“展字段,所以新建拓展表 - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_process_instance_ext", autoResultMap = true) -@KeySequence("bpm_process_instance_ext_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmProcessInstanceExtDO extends BaseDO { - - /** - * ç¼–å·ï¼Œè‡ªå¢ž - */ - @TableId - private Long id; - /** - * å‘èµ·æµç¨‹çš„ç”¨æˆ·ç¼–å· - * - * 冗余 HistoricProcessInstance çš„ startUserId 属性 - */ - private Long startUserId; - /** - * æµç¨‹å®žä¾‹çš„åå­— - * - * 冗余 ProcessInstance çš„ name 属性,用于筛选 - */ - private String name; - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - * - * å…³è” ProcessInstance çš„ id 属性 - */ - private String processInstanceId; - /** - * æµç¨‹å®šä¹‰çš„ç¼–å· - * - * å…³è” ProcessDefinition çš„ id 属性 - */ - private String processDefinitionId; - /** - * æµç¨‹åˆ†ç±» - * - * 冗余 ProcessDefinition çš„ category 属性 - * æ•°æ®å­—å…¸ bpm_model_category - */ - private String category; - /** - * æµç¨‹å®žä¾‹çš„çŠ¶æ€ - * - * 枚举 {@link BpmProcessInstanceStatusEnum} - */ - private Integer status; - /** - * æµç¨‹å®žä¾‹çš„结果 - * - * 枚举 {@link BpmProcessInstanceResultEnum} - */ - private Integer result; - /** - * 结æŸæ—¶é—´ - * - * 冗余 HistoricProcessInstance çš„ endTime 属性 - */ - private Date endTime; - - /** - * æ交的表å•å€¼ - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map formVariables; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java deleted file mode 100644 index efbd76296..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.dataobject.task; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -/** - * Bpm æµç¨‹ä»»åŠ¡çš„拓展表 - * 主è¦è§£å†³ Activiti Task å’Œ HistoricTaskInstance ä¸æ”¯æŒæ‹“展字段,所以新建拓展表 - * - * @author 芋é“æºç  - */ -@TableName(value = "bpm_task_ext", autoResultMap = true) -@KeySequence("bpm_task_ext_seq") // 用于 Oracleã€PostgreSQLã€Kingbaseã€DB2ã€H2 æ•°æ®åº“的主键自增。如果是 MySQL 等数æ®åº“,å¯ä¸å†™ã€‚ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmTaskExtDO extends BaseDO { - - /** - * ç¼–å·ï¼Œè‡ªå¢ž - */ - @TableId - private Long id; - /** - * 任务的审批人 - * - * 冗余 Task çš„ assignee 属性 - */ - private Long assigneeUserId; - /** - * 任务的åå­— - * - * 冗余 Task çš„ name 属性,为了筛选 - */ - private String name; - /** - * ä»»åŠ¡çš„ç¼–å· - * - * å…³è” Task çš„ id 属性 - */ - private String taskId; -// /** -// * 任务的标识 -// * -// * å…³è” {@link Task#getTaskDefinitionKey()} -// */ -// private String definitionKey; - /** - * 任务的结果 - * - * 枚举 {@link BpmProcessInstanceResultEnum} - */ - private Integer result; - /** - * 审批建议 - */ - private String reason; - /** - * 任务的结æŸæ—¶é—´ - * - * 冗余 HistoricTaskInstance çš„ endTime 属性 - */ - private Date endTime; - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - * - * å…³è” ProcessInstance çš„ id 属性 - */ - private String processInstanceId; - /** - * æµç¨‹å®šä¹‰çš„ç¼–å· - * - * å…³è” ProcessDefinition çš„ id 属性 - */ - private String processDefinitionId; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java deleted file mode 100644 index 1f15719cd..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmFormMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.definition; - - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.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 LambdaQueryWrapperX() - .likeIfPresent(BpmFormDO::getName, reqVO.getName()) - .orderByDesc(BpmFormDO::getId)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java deleted file mode 100644 index 689a562bc..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.definition; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface BpmProcessDefinitionExtMapper extends BaseMapperX { - - default List selectListByProcessDefinitionIds(Collection processDefinitionIds) { - return selectList(BpmProcessDefinitionExtDO::getProcessDefinitionId, processDefinitionIds); - } - - default BpmProcessDefinitionExtDO selectByProcessDefinitionId(String processDefinitionId) { - return selectOne(BpmProcessDefinitionExtDO::getProcessDefinitionId, processDefinitionId); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java deleted file mode 100644 index cb2f1018b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.definition; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.lang.Nullable; - -import java.util.List; - -@Mapper -public interface BpmTaskAssignRuleMapper extends BaseMapperX { - - default List selectListByProcessDefinitionId(String processDefinitionId, - @Nullable String taskDefinitionKey) { - return selectList(new LambdaQueryWrapperX() - .eq(BpmTaskAssignRuleDO::getProcessDefinitionId, processDefinitionId) - .eqIfPresent(BpmTaskAssignRuleDO::getTaskDefinitionKey, taskDefinitionKey)); - } - - default List selectListByModelId(String modelId) { - return selectList(new LambdaQueryWrapperX() - .eq(BpmTaskAssignRuleDO::getModelId, modelId) - .eq(BpmTaskAssignRuleDO::getProcessDefinitionId, BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL)); - } - - default BpmTaskAssignRuleDO selectListByModelIdAndTaskDefinitionKey(String modelId, - String taskDefinitionKey) { - return selectOne(new LambdaQueryWrapperX() - .eq(BpmTaskAssignRuleDO::getModelId, modelId) - .eq(BpmTaskAssignRuleDO::getProcessDefinitionId, BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL) - .eq(BpmTaskAssignRuleDO::getTaskDefinitionKey, taskDefinitionKey)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java deleted file mode 100644 index 982e678bf..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 用户组 Mapper - * - * @author 芋é“æºç  - */ -@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.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(BpmUserGroupDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(BpmUserGroupDO::getStatus, status); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java deleted file mode 100644 index ba781e350..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.oa; - -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import org.apache.ibatis.annotations.Mapper; - -/** - * 请å‡ç”³è¯· Mapper - * - * @author jason - * @author 芋é“æºç  - */ -@Mapper -public interface BpmOALeaveMapper extends BaseMapperX { - - default PageResult selectPage(Long userId, BpmOALeavePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BpmOALeaveDO::getUserId, userId) - .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult()) - .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType()) - .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason()) - .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(BpmOALeaveDO::getId)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java deleted file mode 100644 index 159cdc267..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.task; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface BpmProcessInstanceExtMapper extends BaseMapperX { - - default PageResult selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId) - .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName()) - .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) - .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) - .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) - .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult()) - .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc(BpmProcessInstanceExtDO::getId)); - } - - default BpmProcessInstanceExtDO selectByProcessInstanceId(String processDefinitionId) { - return selectOne(BpmProcessInstanceExtDO::getProcessInstanceId, processDefinitionId); - } - - default void updateByProcessInstanceId(BpmProcessInstanceExtDO updateObj) { - update(updateObj, new LambdaQueryWrapperX() - .eq(BpmProcessInstanceExtDO::getProcessInstanceId, updateObj.getProcessInstanceId())); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java deleted file mode 100644 index 300174c44..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.module.bpm.dal.mysql.task; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface BpmTaskExtMapper extends BaseMapperX { - - default void updateByTaskId(BpmTaskExtDO entity) { - update(entity, new LambdaQueryWrapper().eq(BpmTaskExtDO::getTaskId, entity.getTaskId())); - } - - default List selectListByTaskIds(Collection taskIds) { - return selectList(BpmTaskExtDO::getTaskId, taskIds); - } - - default List selectListByProcessInstanceId(String processInstanceId) { - return selectList(BpmTaskExtDO::getProcessInstanceId, processInstanceId); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java deleted file mode 100644 index c21d6f999..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.definition; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM 模型的表å•ç±»åž‹çš„枚举 - * - * @author 芋é“æºç  - */ -@Getter -@AllArgsConstructor -public enum BpmModelFormTypeEnum { - - NORMAL(10, "æµç¨‹è¡¨å•"), // 对应 BpmFormDO - CUSTOM(20, "业务表å•") // 业务自己定义的表å•ï¼Œè‡ªå·±è¿›è¡Œæ•°æ®çš„存储 - ; - - private final Integer type; - private final String desc; -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java deleted file mode 100644 index de3c35162..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.definition; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM 任务分é…规则的类型枚举 - * - * @author 芋é“æºç  - */ -@Getter -@AllArgsConstructor -public enum BpmTaskAssignRuleTypeEnum { - - ROLE(10, "角色"), - - DEPT_MEMBER(20, "部门的æˆå‘˜"), // 包括负责人 - DEPT_LEADER(21, "部门的负责人"), - POST(22, "å²—ä½"), - - USER(30, "用户"), - - USER_GROUP(40, "用户组"), - - SCRIPT(50, "自定义脚本"), // 例如说,å‘起人所在部门的领导ã€å‘起人所在部门的领导的领导 - ; - - /** - * 类型 - */ - private final Integer type; - /** - * æè¿° - */ - private final String desc; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java deleted file mode 100644 index 7fc0e3b8b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.definition; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * BPM 任务规则的脚本枚举 - * ç›®å‰æš‚时通过 TODO 芋艿:硬编ç ï¼Œæœªæ¥å¯ä»¥è€ƒè™‘ Groovy 动æ€è„šæœ¬çš„æ–¹å¼ - * - * @author 芋é“æºç  - */ -@Getter -@AllArgsConstructor -public enum BpmTaskRuleScriptEnum { - - START_USER(10L, "æµç¨‹å‘起人"), - - LEADER_X1(20L, "æµç¨‹å‘起人的一级领导"), - LEADER_X2(21L, "æµç¨‹å‘起人的二级领导"); - - /** - * è„šæœ¬ç¼–å· - */ - private final Long id; - /** - * 脚本æè¿° - */ - private final String desc; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java deleted file mode 100644 index 79001fccd..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/message/BpmMessageEnum.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.message; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * Bpm 消æ¯çš„枚举 - * - * @author 芋é“æºç  - */ -@AllArgsConstructor -@Getter -public enum BpmMessageEnum { - - PROCESS_INSTANCE_APPROVE("bpm_process_instance_approve"), // æµç¨‹ä»»åŠ¡è¢«å®¡æ‰¹é€šè¿‡æ—¶ï¼Œå‘é€ç»™ç”³è¯·äºº - PROCESS_INSTANCE_REJECT("bpm_process_instance_reject"), // æµç¨‹ä»»åŠ¡è¢«å®¡æ‰¹ä¸é€šè¿‡æ—¶ï¼Œå‘é€ç»™ç”³è¯·äºº - TASK_ASSIGNED("bpm_task_assigned"); // 任务被分é…时,å‘é€ç»™å®¡æ‰¹äºº - - /** - * 短信模æ¿çš„标识 - * - * å…³è” SmsTemplateDO çš„ code 属性 - */ - private final String smsTemplateCode; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java deleted file mode 100644 index e41930bb8..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.task; - -import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹å®žä¾‹çš„删除原因 - * - * @author 芋é“æºç  - */ -@Getter -@AllArgsConstructor -public enum BpmProcessInstanceDeleteReasonEnum { - - REJECT_TASK("ä¸é€šè¿‡ä»»åŠ¡ï¼ŒåŽŸå› ï¼š{}"), // 修改文案时,需è¦æ³¨æ„ isRejectReason 方法 - CANCEL_TASK("主动å–消任务,原因:{}"); - - private final String reason; - - /** - * æ ¼å¼åŒ–ç†ç”± - * - * @param args å‚æ•° - * @return ç†ç”± - */ - public String format(Object... args) { - return StrUtil.format(reason, args); - } - - // ========== 逻辑 ========== - - public static boolean isRejectReason(String reason) { - return StrUtil.startWith(reason, "ä¸é€šè¿‡ä»»åŠ¡ï¼ŒåŽŸå› ï¼š"); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java deleted file mode 100644 index 39bf22ada..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.task; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹å®žä¾‹çš„结果 - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum BpmProcessInstanceResultEnum { - - PROCESS(1, "处ç†ä¸­"), - APPROVE(2, "通过"), - REJECT(3, "ä¸é€šè¿‡"), - CANCEL(4, "å·²å–消"); - - /** - * 结果 - */ - private final Integer result; - /** - * æè¿° - */ - private final String desc; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java deleted file mode 100644 index 70a31dd34..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.bpm.enums.task; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * æµç¨‹å®žä¾‹çš„çŠ¶æ€ - * - * @author 芋é“æºç  - */ -@Getter -@AllArgsConstructor -public enum BpmProcessInstanceStatusEnum { - - RUNNING(1, "进行中"), - FINISH(2, "已完æˆ"); - - /** - * çŠ¶æ€ - */ - private final Integer status; - /** - * æè¿° - */ - private final String desc; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java deleted file mode 100644 index 8915fc6b5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCommonConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.bpm.config; - -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * BPM 通用的 Configuration é…置类,æ供给 Activiti å’Œ Flowable - */ -@Configuration -public class BpmCommonConfiguration { - - @Bean - public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { - return new BpmProcessInstanceResultEventPublisher(publisher); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java deleted file mode 100644 index 9fccbab8e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; - -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import lombok.Data; -import org.springframework.context.ApplicationEvent; - -import javax.validation.constraints.NotNull; - -/** - * æµç¨‹å®žä¾‹çš„结果å‘生å˜åŒ–çš„ Event - * 定ä½ï¼šç”±äºŽé¢å¤–增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件 - * - * @author 芋é“æºç  - */ -@SuppressWarnings("ALL") -@Data -public class BpmProcessInstanceResultEvent extends ApplicationEvent { - - /** - * æµç¨‹å®žä¾‹çš„ç¼–å· - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„ç¼–å·ä¸èƒ½ä¸ºç©º") - private String id; - /** - * æµç¨‹å®žä¾‹çš„ key - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„ key ä¸èƒ½ä¸ºç©º") - private String processDefinitionKey; - /** - * æµç¨‹å®žä¾‹çš„结果 - */ - @NotNull(message = "æµç¨‹å®žä¾‹çš„结果ä¸èƒ½ä¸ºç©º") - private Integer result; - /** - * æµç¨‹å®žä¾‹å¯¹åº”的业务标识 - * ä¾‹å¦‚è¯´ï¼Œè¯·å‡ - */ - private String businessKey; - - public BpmProcessInstanceResultEvent(Object source) { - super(source); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java deleted file mode 100644 index c2b215394..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; - -import cn.hutool.core.util.StrUtil; -import org.springframework.context.ApplicationListener; - -/** - * {@link BpmProcessInstanceResultEvent} 的监å¬å™¨ - * - * @author 芋é“æºç  - */ -public abstract class BpmProcessInstanceResultEventListener - implements ApplicationListener { - - @Override - public final void onApplicationEvent(BpmProcessInstanceResultEvent event) { - if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) { - return; - } - onEvent(event); - } - - /** - * @return 返回监å¬çš„æµç¨‹å®šä¹‰ Key - */ - protected abstract String getProcessDefinitionKey(); - - /** - * 处ç†äº‹ä»¶ - * - * @param event 事件 - */ - protected abstract void onEvent(BpmProcessInstanceResultEvent event); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java deleted file mode 100644 index dc5c21b75..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; - -import lombok.AllArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; - -/** - * {@link BpmProcessInstanceResultEvent} 的生产者 - * - * @author 芋é“æºç  - */ -@AllArgsConstructor -@Validated -public class BpmProcessInstanceResultEventPublisher { - - private final ApplicationEventPublisher publisher; - - public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) { - publisher.publishEvent(event); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java deleted file mode 100644 index c4a131128..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/event/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 自定义 Event 实现,æ供方便业务接入的 Listenerï¼ - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java deleted file mode 100644 index b97cb4c8a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/core/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package cn.iocoder.yudao.module.bpm.framework.bpm.core; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java deleted file mode 100644 index 9a5e3ea96..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æ供给 Activiti å’Œ Flowable 的通用å°è£… - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java deleted file mode 100644 index 52fdb7f93..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 bpm 模å—çš„ framework å°è£… - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java deleted file mode 100644 index 6d399cf2a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java +++ /dev/null @@ -1,10 +0,0 @@ -/** - * bpm 包下,业务æµç¨‹ç®¡ç†ï¼ˆBusiness Process Management),我们放工作æµçš„功能。 - * 例如说:æµç¨‹å®šä¹‰ã€è¡¨å•é…ç½®ã€å®¡æ ¸ä¸­å¿ƒï¼ˆæˆ‘的申请ã€æˆ‘的待办ã€æˆ‘的已办)等等 - * - * bpm 解释:https://baike.baidu.com/item/BPM/1933 - * - * 1. Controller URL:以 /bpm/ 开头,é¿å…和其它 Module å†²çª - * 2. DataObject 表å:以 bpm_ 开头,方便在数æ®åº“中区分 - */ -package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java deleted file mode 100644 index 80355ef5e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - - -/** - * 动æ€è¡¨å• Service æŽ¥å£ - * - * @author @风里雾里 - */ -public interface BpmFormService { - - /** - * 创建动æ€è¡¨å• - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createForm(@Valid BpmFormCreateReqVO createReqVO); - - /** - * 更新动æ€è¡¨å• - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateForm(@Valid BpmFormUpdateReqVO 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) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId); - } - - /** - * 获得动æ€è¡¨å•åˆ†é¡µ - * - * @param pageReqVO 分页查询 - * @return 动æ€è¡¨å•åˆ†é¡µ - */ - PageResult getFormPage(BpmFormPageReqVO pageReqVO); - - /** - * 校验æµç¨‹è¡¨å•å·²é…ç½® - * - * @param configStr configStr 字段 - * @return æµç¨‹è¡¨å• - */ - BpmFormDO checkFormConfig(String configStr); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java deleted file mode 100644 index d64684b82..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.lang.Assert; -import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * 动æ€è¡¨å• Service 实现类 - * - * @author 风里雾里 - */ -@Service -@Validated -public class BpmFormServiceImpl implements BpmFormService { - - @Resource - private BpmFormMapper formMapper; - - @Override - public Long createForm(BpmFormCreateReqVO createReqVO) { - this.checkFields(createReqVO.getFields()); - // æ’å…¥ - BpmFormDO form = BpmFormConvert.INSTANCE.convert(createReqVO); - formMapper.insert(form); - // 返回 - return form.getId(); - } - - @Override - public void updateForm(BpmFormUpdateReqVO updateReqVO) { - this.checkFields(updateReqVO.getFields()); - // 校验存在 - this.validateFormExists(updateReqVO.getId()); - // æ›´æ–° - BpmFormDO updateObj = BpmFormConvert.INSTANCE.convert(updateReqVO); - 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 ServiceExceptionUtil.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) { - return formMapper.selectBatchIds(ids); - } - - @Override - public PageResult getFormPage(BpmFormPageReqVO pageReqVO) { - return formMapper.selectPage(pageReqVO); - } - - - @Override - public BpmFormDO checkFormConfig(String configStr) { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(configStr, BpmModelMetaInfoRespDTO.class); - if (metaInfo == null || metaInfo.getFormType() == null) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - // 校验表å•å­˜åœ¨ - if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - BpmFormDO form = getForm(metaInfo.getFormId()); - if (form == null) { - throw exception(FORM_NOT_EXISTS); - } - return form; - } - return null; - } - - private void checkKeyNCName(String key) { - if (!ValidationUtils.isXmlNCName(key)) { - throw exception(MODEL_KEY_VALID); - } - } - /** - * 校验 Field,é¿å… field é‡å¤ - * - * @param fields field 数组 - */ - private void checkFields(List fields) { - 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 ServiceExceptionUtil.exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); - } - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java deleted file mode 100644 index da185105e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupService.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import java.util.*; -import javax.validation.*; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -/** - * 用户组 Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmUserGroupService { - - /** - * 创建用户组 - * - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createUserGroup(@Valid BpmUserGroupCreateReqVO createReqVO); - - /** - * 更新用户组 - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateUserGroup(@Valid BpmUserGroupUpdateReqVO 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(Set ids); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java deleted file mode 100644 index e6a93b45d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmUserGroupConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * 用户组 Service 实现类 - * - * @author 芋é“æºç  - */ -@Service -@Validated -public class BpmUserGroupServiceImpl implements BpmUserGroupService { - - @Resource - private BpmUserGroupMapper userGroupMapper; - - @Override - public Long createUserGroup(BpmUserGroupCreateReqVO createReqVO) { - // æ’å…¥ - BpmUserGroupDO userGroup = BpmUserGroupConvert.INSTANCE.convert(createReqVO); - userGroupMapper.insert(userGroup); - // 返回 - return userGroup.getId(); - } - - @Override - public void updateUserGroup(BpmUserGroupUpdateReqVO updateReqVO) { - // 校验存在 - this.validateUserGroupExists(updateReqVO.getId()); - // æ›´æ–° - BpmUserGroupDO updateObj = BpmUserGroupConvert.INSTANCE.convert(updateReqVO); - 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 ServiceExceptionUtil.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(Set ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // èŽ·å¾—ç”¨æˆ·ç»„ä¿¡æ¯ - List userGroups = userGroupMapper.selectBatchIds(ids); - Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); - // 校验 - ids.forEach(id -> { - BpmUserGroupDO userGroup = userGroupMap.get(id); - if (userGroup == null) { - throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { - throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); - } - }); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java deleted file mode 100644 index 1606192ce..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.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 芋é“æºç  - */ -@Data -public class BpmFormFieldRespDTO { - - /** - * 表å•æ ‡é¢˜ - */ - private String label; - /** - * 表å•å­—段的属性å,å¯è‡ªå®šä¹‰ - */ - @JsonProperty(value = "vModel") - private String vModel; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java deleted file mode 100644 index 3a36b0eeb..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition.dto; - -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import lombok.Data; - -/** - * BPM æµç¨‹ MetaInfo Response DTO - * 主è¦ç”¨äºŽ { Model#setMetaInfo(String)} 的存储 - * - * @author 芋é“æºç  - */ -@Data -public class BpmModelMetaInfoRespDTO { - - /** - * æµç¨‹æè¿° - */ - 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java deleted file mode 100644 index 8b2d22ad5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java +++ /dev/null @@ -1,104 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition.dto; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import lombok.Data; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; -import java.util.Objects; - -/** - * æµç¨‹å®šä¹‰åˆ›å»º Request DTO - */ -@Data -public class BpmProcessDefinitionCreateReqDTO { - - // ========== 模型相关 ========== - - /** - * æµç¨‹æ¨¡åž‹çš„ç¼–å· - */ - @NotEmpty(message = "æµç¨‹æ¨¡åž‹ç¼–å·ä¸èƒ½ä¸ºç©º") - private String modelId; - /** - * æµç¨‹æ ‡è¯† - */ - @NotEmpty(message = "æµç¨‹æ ‡è¯†ä¸èƒ½ä¸ºç©º") - private String key; - /** - * æµç¨‹å称 - */ - @NotEmpty(message = "æµç¨‹å称ä¸èƒ½ä¸ºç©º") - private String name; - /** - * æµç¨‹æè¿° - */ - private String description; - /** - * æµç¨‹åˆ†ç±» - * å‚è§ bpm_model_category æ•°æ®å­—å…¸ - */ - @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; - - @AssertTrue(message = "æµç¨‹è¡¨å•ä¿¡æ¯ä¸å…¨") - public boolean isNormalFormTypeValid() { - // 如果éžä¸šåŠ¡è¡¨å•ï¼Œåˆ™ç›´æŽ¥é€šè¿‡ - if (!Objects.equals(formType, BpmModelFormTypeEnum.NORMAL.getType())) { - return true; - } - return formId != null && StrUtil.isNotEmpty(formConf) && CollUtil.isNotEmpty(formFields); - } - - @AssertTrue(message = "业务表å•ä¿¡æ¯ä¸å…¨") - public boolean isNormalCustomTypeValid() { - // 如果éžä¸šåŠ¡è¡¨å•ï¼Œåˆ™ç›´æŽ¥é€šè¿‡ - if (!Objects.equals(formType, BpmModelFormTypeEnum.CUSTOM.getType())) { - return true; - } - return StrUtil.isNotEmpty(formCustomCreatePath) && StrUtil.isNotEmpty(formCustomViewPath); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java deleted file mode 100644 index ff51ae306..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageService.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.message; - -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; - -import javax.validation.Valid; - -/** - * BPM æ¶ˆæ¯ Service æŽ¥å£ - * - * TODO 芋艿:未æ¥æ”¯æŒæ¶ˆæ¯çš„å¯é…置;ä¸åŒçš„æµç¨‹ï¼Œåœ¨ä»€ä¹ˆåœºæ™¯ä¸‹ï¼Œéœ€è¦å‘é€ä»€ä¹ˆæ¶ˆæ¯ï¼Œæ¶ˆæ¯çš„内容是什么; - * - * @author 芋é“æºç  - */ -public interface BpmMessageService { - - /** - * å‘é€æµç¨‹å®žä¾‹è¢«é€šè¿‡çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenProcessInstanceApprove(@Valid BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO); - - /** - * å‘é€æµç¨‹å®žä¾‹è¢«ä¸é€šè¿‡çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenProcessInstanceReject(@Valid BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO); - - /** - * å‘é€ä»»åŠ¡è¢«åˆ†é…çš„æ¶ˆæ¯ - * - * @param reqDTO å‘é€ä¿¡æ¯ - */ - void sendMessageWhenTaskAssigned(@Valid BpmMessageSendWhenTaskCreatedReqDTO reqDTO); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java deleted file mode 100644 index 89dfd1227..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.message; - -import cn.iocoder.yudao.framework.web.config.WebProperties; -import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert; -import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.api.sms.SmsSendApi; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -/** - * BPM æ¶ˆæ¯ Service 实现类 - * - * @author 芋é“æºç  - */ -@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)); - } - - @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)); - } - - @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.getStartUserId(), - BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams)); - } - - private String getProcessInstanceDetailUrl(String taskId) { - return webProperties.getAdminUi().getUrl() + "/bpm/process-instance/detail?id=" + taskId; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java deleted file mode 100644 index 7c37734f9..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.message.dto; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java deleted file mode 100644 index 69a266b68..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.message.dto; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java deleted file mode 100644 index 7cb0e3d70..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.message.dto; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java deleted file mode 100644 index a851f403c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.oa; - - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; - -import javax.validation.Valid; - -/** - * 请å‡ç”³è¯· Service æŽ¥å£ - * - * @author jason - * @author 芋é“æºç  - */ -public interface BpmOALeaveService { - - /** - * 创建请å‡ç”³è¯· - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return ç¼–å· - */ - Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); - - /** - * 更新请å‡ç”³è¯·çš„çŠ¶æ€ - * - * @param id ç¼–å· - * @param result 结果 - */ - void updateLeaveResult(Long id, Integer result); - - /** - * 获得请å‡ç”³è¯· - * - * @param id ç¼–å· - * @return 请å‡ç”³è¯· - */ - BpmOALeaveDO getLeave(Long id); - - /** - * 获得请å‡ç”³è¯·åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页查询 - * @return 请å‡ç”³è¯·åˆ†é¡µ - */ - PageResult getLeavePage(Long userId, BpmOALeavePageReqVO pageReqVO); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java deleted file mode 100644 index d0aadd95e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.oa; - -import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS; - -/** - * OA 请å‡ç”³è¯· Service 实现类 - * - * @author jason - * @author 芋é“æºç  - */ -@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 = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false); - BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - 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()))); - - // 将工作æµçš„ç¼–å·ï¼Œæ›´æ–°åˆ° OA 请å‡å•ä¸­ - leaveMapper.updateById(new BpmOALeaveDO().setId(leave.getId()).setProcessInstanceId(processInstanceId)); - return leave.getId(); - } - - @Override - public void updateLeaveResult(Long id, Integer result) { - validateLeaveExists(id); - leaveMapper.updateById(new BpmOALeaveDO().setId(id).setResult(result)); - } - - 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/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java deleted file mode 100644 index 2354070f0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.oa.listener; - -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener; -import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; -import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * OA 请å‡å•çš„结果的监å¬å™¨å®žçŽ°ç±» - * - * @author 芋é“æºç  - */ -@Component -public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener { - - @Resource - private BpmOALeaveService leaveService; - - @Override - protected String getProcessDefinitionKey() { - return BpmOALeaveServiceImpl.PROCESS_KEY; - } - - @Override - protected void onEvent(BpmProcessInstanceResultEvent event) { - leaveService.updateLeaveResult(Long.parseLong(event.getBusinessKey()), event.getResult()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java deleted file mode 100644 index eaa615302..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java deleted file mode 100644 index bdd88afea..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.FORM_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link BpmFormServiceImpl} çš„å•å…ƒæµ‹è¯•ç±» - * - * @author 芋é“æºç  - */ -@Import(BpmFormServiceImpl.class) -public class BpmFormServiceTest extends BaseDbUnitTest { - - @Resource - private BpmFormServiceImpl formService; - - @Resource - private BpmFormMapper formMapper; - - @Test - public void testCreateForm_success() { - // 准备å‚æ•° - BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> { - o.setConf("{}"); - o.setFields(randomFields()); - }); - - // 调用 - Long formId = formService.createForm(reqVO); - // 断言 - assertNotNull(formId); - // 校验记录的属性是å¦æ­£ç¡® - BpmFormDO form = formMapper.selectById(formId); - assertPojoEquals(reqVO, form); - } - - @Test - public void testUpdateForm_success() { - // mock æ•°æ® - BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { - o.setConf("{}"); - o.setFields(randomFields()); - }); - formMapper.insert(dbForm);// @Sql: å…ˆæ’入出一æ¡å­˜åœ¨çš„æ•°æ® - // 准备å‚æ•° - BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { - o.setId(dbForm.getId()); // 设置更新的 ID - o.setConf("{'yudao': 'yuanma'}"); - o.setFields(randomFields()); - }); - - // 调用 - formService.updateForm(reqVO); - // 校验是å¦æ›´æ–°æ­£ç¡® - BpmFormDO form = formMapper.selectById(reqVO.getId()); // 获å–最新的 - assertPojoEquals(reqVO, form); - } - - @Test - public void testUpdateForm_notExists() { - // 准备å‚æ•° - BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> { - o.setConf("{'yudao': 'yuanma'}"); - o.setFields(randomFields()); - }); - - // 调用, 并断言异常 - assertServiceException(() -> formService.updateForm(reqVO), FORM_NOT_EXISTS); - } - - @Test - public void testDeleteForm_success() { - // mock æ•°æ® - BpmFormDO dbForm = randomPojo(BpmFormDO.class); - formMapper.insert(dbForm);// @Sql: å…ˆæ’入出一æ¡å­˜åœ¨çš„æ•°æ® - // 准备å‚æ•° - Long id = dbForm.getId(); - - // 调用 - formService.deleteForm(id); - // 校验数æ®ä¸å­˜åœ¨äº† - assertNull(formMapper.selectById(id)); - } - - @Test - public void testDeleteForm_notExists() { - // 准备å‚æ•° - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> formService.deleteForm(id), FORM_NOT_EXISTS); - } - - @Test - public void testGetFormPage() { - // mock æ•°æ® - BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { // 等会查询到 - o.setName("芋é“æºç "); - }); - formMapper.insert(dbForm); - // 测试 name ä¸åŒ¹é… - formMapper.insert(cloneIgnoreId(dbForm, o -> o.setName("æºç "))); - // 准备å‚æ•° - BpmFormPageReqVO reqVO = new BpmFormPageReqVO(); - reqVO.setName("芋é“"); - - // 调用 - PageResult pageResult = formService.getFormPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbForm, pageResult.getList().get(0)); - } - - private List randomFields() { - int size = RandomUtil.randomInt(1, 3); - return Stream.iterate(0, i -> i).limit(size) - .map(i -> JsonUtils.toJsonString(randomPojo(BpmFormFieldRespDTO.class))) - .collect(Collectors.toList()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java b/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java deleted file mode 100644 index 78e388700..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.framework.test.core.util.AssertUtils; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; - -/** -* {@link BpmUserGroupServiceImpl} çš„å•å…ƒæµ‹è¯•ç±» -* -* @author 芋é“æºç  -*/ -@Import(BpmUserGroupServiceImpl.class) -public class BpmUserGroupServiceTest extends BaseDbUnitTest { - - @Resource - private BpmUserGroupServiceImpl userGroupService; - - @Resource - private BpmUserGroupMapper userGroupMapper; - - @Test - public void testCreateUserGroup_success() { - // 准备å‚æ•° - BpmUserGroupCreateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupCreateReqVO.class); - - // 调用 - Long userGroupId = userGroupService.createUserGroup(reqVO); - // 断言 - Assertions.assertNotNull(userGroupId); - // 校验记录的属性是å¦æ­£ç¡® - BpmUserGroupDO userGroup = userGroupMapper.selectById(userGroupId); - AssertUtils.assertPojoEquals(reqVO, userGroup); - } - - @Test - public void testUpdateUserGroup_success() { - // mock æ•°æ® - BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class); - userGroupMapper.insert(dbUserGroup);// @Sql: å…ˆæ’入出一æ¡å­˜åœ¨çš„æ•°æ® - // 准备å‚æ•° - BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class, o -> { - o.setId(dbUserGroup.getId()); // 设置更新的 ID - }); - - // 调用 - userGroupService.updateUserGroup(reqVO); - // 校验是å¦æ›´æ–°æ­£ç¡® - BpmUserGroupDO userGroup = userGroupMapper.selectById(reqVO.getId()); // 获å–最新的 - AssertUtils.assertPojoEquals(reqVO, userGroup); - } - - @Test - public void testUpdateUserGroup_notExists() { - // 准备å‚æ•° - BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class); - - // 调用, 并断言异常 - AssertUtils.assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); - } - - @Test - public void testDeleteUserGroup_success() { - // mock æ•°æ® - BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class); - userGroupMapper.insert(dbUserGroup);// @Sql: å…ˆæ’入出一æ¡å­˜åœ¨çš„æ•°æ® - // 准备å‚æ•° - Long id = dbUserGroup.getId(); - - // 调用 - userGroupService.deleteUserGroup(id); - // 校验数æ®ä¸å­˜åœ¨äº† - Assertions.assertNull(userGroupMapper.selectById(id)); - } - - @Test - public void testDeleteUserGroup_notExists() { - // 准备å‚æ•° - Long id = RandomUtils.randomLongId(); - - // 调用, 并断言异常 - AssertUtils.assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS); - } - - @Test - public void testGetUserGroupPage() { - // mock æ•°æ® - BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到 - o.setName("芋é“æºç "); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); - }); - userGroupMapper.insert(dbUserGroup); - // 测试 name ä¸åŒ¹é… - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName("芋é“"))); - // 测试 status ä¸åŒ¹é… - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime ä¸åŒ¹é… - userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12)))); - // 准备å‚æ•° - BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO(); - reqVO.setName("æºç "); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10)); - reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12)); - - // 调用 - PageResult pageResult = userGroupService.getUserGroupPage(reqVO); - // 断言 - Assertions.assertEquals(1, pageResult.getTotal()); - Assertions.assertEquals(1, pageResult.getList().size()); - AssertUtils.assertPojoEquals(dbUserGroup, pageResult.getList().get(0)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml deleted file mode 100644 index c4a0f3031..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,43 +0,0 @@ -spring: - main: - lazy-initialization: true # å¼€å¯æ‡’加载,加快速度 - banner-mode: off # å•å…ƒæµ‹è¯•ï¼Œç¦ç”¨ Banner - ---- #################### æ•°æ®åº“相关é…ç½® #################### - -spring: - # æ•°æ®æºé…置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模å¼ï¼›DATABASE_TO_UPPER é…置表和字段使用å°å†™ - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # å•å…ƒæµ‹è¯•ï¼Œå¼‚æ­¥åˆå§‹åŒ– Druid 连接池,æå‡å¯åŠ¨é€Ÿåº¦ - initial-size: 1 # å•å…ƒæµ‹è¯•ï¼Œé…置为 1,æå‡å¯åŠ¨é€Ÿåº¦ - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - -mybatis: - lazy-initialization: true # å•å…ƒæµ‹è¯•ï¼Œè®¾ç½® MyBatis Mapper 延迟加载,加速æ¯ä¸ªå•å…ƒæµ‹è¯• - ---- #################### 定时任务相关é…ç½® #################### - ---- #################### é…置中心相关é…ç½® #################### - ---- #################### æœåŠ¡ä¿éšœç›¸å…³é…ç½® #################### - -# Lock4j é…置项(å•å…ƒæµ‹è¯•ï¼Œç¦ç”¨ Lock4j) - -# Resilience4j é…置项 - ---- #################### 监控相关é…ç½® #################### - ---- #################### 芋é“相关é…ç½® #################### - -# 芋é“é…置项,设置当å‰é¡¹ç›®æ‰€æœ‰è‡ªå®šä¹‰çš„é…ç½® -yudao: - info: - base-package: cn.iocoder.yudao.module diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback.xml b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback.xml deleted file mode 100644 index daf756bff..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql deleted file mode 100644 index 6e42d3cfc..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM "bpm_form"; -DELETE FROM "bpm_user_group"; diff --git a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 20a939b76..000000000 --- a/yudao-module-bpm/yudao-module-bpm-base/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,28 +0,0 @@ -CREATE TABLE IF NOT EXISTS "bpm_user_group" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(63) NOT NULL, - "description" varchar(255) NOT NULL, - "status" tinyint NOT NULL, - "member_user_ids" varchar(255) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '用户组'; - -CREATE TABLE IF NOT EXISTS "bpm_form" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(63) NOT NULL, - "status" tinyint NOT NULL, - "fields" varchar(255) NOT NULL, - "conf" varchar(255) NOT NULL, - "remark" varchar(255), - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '动æ€è¡¨å•'; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/pom.xml b/yudao-module-bpm/yudao-module-bpm-biz-activiti/pom.xml deleted file mode 100644 index 690103e2b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - cn.iocoder.boot - yudao-module-bpm - ${revision} - - 4.0.0 - yudao-module-bpm-biz-activiti - jar - - ${project.artifactId} - - bpm-activiti 模å—,基于 Activiti 7 å®žçŽ°å·¥ä½œæµ - - - - - cn.iocoder.boot - yudao-module-bpm-base - ${revision} - - - - - cn.iocoder.boot - yudao-spring-boot-starter-activiti - - - - - cn.iocoder.boot - yudao-spring-boot-starter-test - test - - - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java deleted file mode 100644 index 2137e2203..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * bpm API 实现类,定义暴露给其它模å—çš„ API - */ -package cn.iocoder.yudao.module.bpm.api; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java deleted file mode 100644 index ff3966025..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.bpm.api.task; - -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * Activiti æµç¨‹å®žä¾‹ Api 实现类 - * - * @author 芋é“æºç  - */ -@Service -@Validated -public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqDTO reqDTO) { - return processInstanceService.createProcessInstance(userId, reqDTO); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java deleted file mode 100644 index 5d8b4bfcc..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.io.IoUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.io.IOException; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹æ¨¡åž‹") -@RestController -@RequestMapping("/bpm/model") -@Validated -public class BpmModelController { - - @Resource - private BpmModelService bpmModelService; - - @GetMapping("/page") - @ApiOperation(value = "获得模型分页") - public CommonResult> getModelPage(BpmModelPageReqVO pageVO) { - return success(bpmModelService.getModelPage(pageVO)); - } - - @GetMapping("/get") - @ApiOperation("获得模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:query')") - public CommonResult getModel(@RequestParam("id") String id) { - BpmModelRespVO model = bpmModelService.getModel(id); - return success(model); - } - - @PostMapping("/create") - @ApiOperation(value = "新建模型") - @PreAuthorize("@ss.hasPermission('bpm:model:create')") - public CommonResult createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) { - return success(bpmModelService.createModel(createRetVO, null)); - } - - @PostMapping("/import") - @ApiOperation(value = "导入模型") - @PreAuthorize("@ss.hasPermission('bpm:model:import')") - public CommonResult importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException { - BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO); - // 读å–文件 - String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false); - return success(bpmModelService.createModel(createReqVO, bpmnXml)); - } - - @PutMapping("/update") - @ApiOperation(value = "修改模型") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) { - bpmModelService.updateModel(modelVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:delete')") - public CommonResult deleteModel(@RequestParam("id") String id) { - bpmModelService.deleteModel(id); - return success(true); - } - - @PostMapping("/deploy") - @ApiOperation(value = "部署模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:deploy')") - public CommonResult deployModel(@RequestParam("id") String id) { - bpmModelService.deployModel(id); - return success(true); - } - - @PutMapping("/update-state") - @ApiOperation(value = "修改模型的状æ€", notes = "实际更新的部署的æµç¨‹å®šä¹‰çš„状æ€") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) { - bpmModelService.updateModelState(reqVO.getId(), reqVO.getState()); - return success(true); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http deleted file mode 100644 index 492960ed5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.http +++ /dev/null @@ -1,4 +0,0 @@ -### 请求 /bpm/process-definition/list æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/process-definition/list?suspensionState=1 -tenant-id: 1 -Authorization: Bearer {{token}} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java deleted file mode 100644 index 769e53ec5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -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 javax.annotation.Resource; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹å®šä¹‰") -@RestController -@RequestMapping("/bpm/process-definition") -@Validated -public class BpmProcessDefinitionController { - - @Resource - private BpmProcessDefinitionService bpmDefinitionService; - - @GetMapping ("/page") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult> getProcessDefinitionPage( - BpmProcessDefinitionPageReqVO pageReqVO) { - return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO)); - } - - @GetMapping ("/list") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰åˆ—表") - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult> getProcessDefinitionList( - BpmProcessDefinitionListReqVO listReqVO) { - return success(bpmDefinitionService.getProcessDefinitionList(listReqVO)); - } - - @GetMapping ("/get-bpmn-xml") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰çš„ BPMN XML") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult getProcessDefinitionBpmnXML(@RequestParam("id") String id) { - String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id); - return success(bpmnXML); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http deleted file mode 100644 index e5d8fe966..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.http +++ /dev/null @@ -1,4 +0,0 @@ -### 请求 /bpm/task-assign-rule/list æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/task-assign-rule/list?processDefinitionId=leave:9:59689ba0-7284-11ec-965c-a2380e71991a -tenant-id: 1 -Authorization: Bearer {{token}} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java deleted file mode 100644 index b51a4661b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - 任务分é…规则") -@RestController -@RequestMapping("/bpm/task-assign-rule") -@Validated -public class BpmTaskAssignRuleController { - - @Resource - private BpmTaskAssignRuleService taskAssignRuleService; - - @GetMapping("/list") - @ApiOperation(value = "获得任务分é…规则列表") - @ApiImplicitParams({ - @ApiImplicitParam(name = "modelId", value = "模型编å·", example = "1024", dataTypeClass = String.class), - @ApiImplicitParam(name = "processDefinitionId", value = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048", dataTypeClass = String.class) - }) - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:query')") - public CommonResult> getTaskAssignRuleList( - @RequestParam(value = "modelId", required = false) String modelId, - @RequestParam(value = "processDefinitionId", required = false) String processDefinitionId) { - return success(taskAssignRuleService.getTaskAssignRuleList(modelId, processDefinitionId)); - } - - @PostMapping("/create") - @ApiOperation(value = "创建任务分é…规则") - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:create')") - public CommonResult createTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleCreateReqVO reqVO) { - return success(taskAssignRuleService.createTaskAssignRule(reqVO)); - } - - @PutMapping("/update") - @ApiOperation(value = "更新任务分é…规则") - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:update')") - public CommonResult updateTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleUpdateReqVO reqVO) { - taskAssignRuleService.updateTaskAssignRule(reqVO); - return success(true); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java deleted file mode 100644 index 224a942fb..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -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 javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹æ´»åŠ¨å®žä¾‹") -@RestController -@RequestMapping("/bpm/activity") -@Validated -public class BpmActivityController { - - @Resource - private BpmActivityService activityService; - - @GetMapping("/list") - @ApiOperation(value = "生æˆæŒ‡å®šæµç¨‹å®žä¾‹çš„高亮æµç¨‹å›¾", - notes = "åªé«˜äº®è¿›è¡Œä¸­çš„任务。ä¸è¿‡è¦æ³¨æ„,该接å£æš‚时没用,通过å‰ç«¯çš„ ProcessViewer.vue ç•Œé¢çš„ highlightDiagram 方法生æˆ") - @ApiImplicitParam(name = "processInstanceId", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getActivityList( - @RequestParam("processInstanceId") String processInstanceId) { - return success(activityService.getActivityListByProcessInstanceId(processInstanceId)); - } - - @GetMapping("/generate-highlight-diagram") - @ApiOperation(value = "生æˆæŒ‡å®šæµç¨‹å®žä¾‹çš„高亮æµç¨‹å›¾", - notes = "åªé«˜äº®è¿›è¡Œä¸­çš„任务。ä¸è¿‡è¦æ³¨æ„,该接å£æš‚时没用,通过å‰ç«¯çš„ ProcessViewer.vue ç•Œé¢çš„ highlightDiagram 方法生æˆ") - @ApiImplicitParam(name = "processInstanceId", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public void generateHighlightDiagram(@RequestParam("processInstanceId") String processInstanceId, - HttpServletResponse response) throws IOException { - byte[] bytes = activityService.generateHighlightDiagram(processInstanceId); - ServletUtils.writeAttachment(response, StrUtil.format("æµç¨‹å›¾-{}.svg", processInstanceId), bytes); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http deleted file mode 100644 index e9243ed66..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.http +++ /dev/null @@ -1,29 +0,0 @@ -### 请求 /bpm/process-instance/create æŽ¥å£ => æˆåŠŸ -POST {{baseUrl}}/bpm/process-instance/create -Content-Type: application/json -tenant-id: 1 -Authorization: Bearer {{token}} - -{ - "processDefinitionId": "gateway_test:2:00e52d8e-701b-11ec-aca9-a2380e71991a", - "variables": { - "a": 1, - "b": "2" - } -} - -### 请求 /bpm/process-instance/cancel æŽ¥å£ => æˆåŠŸ -DELETE {{baseUrl}}/bpm/process-instance/cancel -Content-Type: application/json -tenant-id: 1 -Authorization: Bearer {{token}} - -{ - "id": "b9220387-7088-11ec-bcae-a2380e71991a", - "reason": "我就å–消" -} - -### 请求 /bpm/process-instance/get æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/process-instance/get?id=537cceb3-768c-11ec-afcd-a2380e71991a -tenant-id: 1 -Authorization: Bearer {{token}} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java deleted file mode 100644 index e859968ed..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Api(tags = "管ç†åŽå° - æµç¨‹å®žä¾‹") // æµç¨‹å®žä¾‹ï¼Œé€šè¿‡æµç¨‹å®šä¹‰åˆ›å»ºçš„一次“申请†-@RestController -@RequestMapping("/bpm/process-instance") -@Validated -public class BpmProcessInstanceController { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @PostMapping("/create") - @ApiOperation("新建æµç¨‹å®žä¾‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { - return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); - } - - @DeleteMapping("/cancel") - @ApiOperation(value = "å–消æµç¨‹å®žä¾‹", notes = "撤回å‘èµ·çš„æµç¨‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')") - public CommonResult cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { - processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO); - return success(true); - } - - @GetMapping("/my-page") - @ApiOperation(value = "获得我的实例分页列表", notes = "在ã€æˆ‘çš„æµç¨‹ã€‘èœå•ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult> getMyProcessInstancePage( - @Valid BpmProcessInstanceMyPageReqVO pageReqVO) { - return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO)); - } - - @GetMapping("/get") - @ApiOperation(value = "获得指定æµç¨‹å®žä¾‹", notes = "在ã€æµç¨‹è¯¦ç»†ã€‘ç•Œé¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @ApiImplicitParam(name = "id", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult getProcessInstance(@RequestParam("id") String id) { - return success(processInstanceService.getProcessInstanceVO(id)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http deleted file mode 100644 index ee4bf0c28..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.http +++ /dev/null @@ -1,14 +0,0 @@ -### 请求 /bpm/task/todo-page æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/task/todo-page -tenant-id: 1 -Authorization: Bearer {{token}} - -### 请求 /bpm/task/done-page æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/task/done-page?pageSize=100 -tenant-id: 1 -Authorization: Bearer {{token}} - -### 请求 /bpm/task/list-by-process-instance-id æŽ¥å£ => æˆåŠŸ -GET {{baseUrl}}/bpm/task/list-by-process-instance-id?processInstanceId=537cceb3-768c-11ec-afcd-a2380e71991a -tenant-id: 1 -Authorization: Bearer {{token}} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java deleted file mode 100644 index 6b8f6dff0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; - -@Api(tags = "管ç†åŽå° - æµç¨‹ä»»åŠ¡å®žä¾‹") -@RestController -@RequestMapping("/bpm/task") -@Validated -public class BpmTaskController { - - @Resource - private BpmTaskService taskService; - - @GetMapping("todo-page") - @ApiOperation("èŽ·å– Todo 待办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) { - return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO)); - } - - @GetMapping("done-page") - @ApiOperation("èŽ·å– Done 已办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) { - return success(taskService.getDoneTaskPage(getLoginUserId(), pageVO)); - } - - @PutMapping("/approve") - @ApiOperation("通过任务") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) { - taskService.approveTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/reject") - @ApiOperation("ä¸é€šè¿‡ä»»åŠ¡") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) { - taskService.rejectTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-assignee") - @ApiOperation(value = "更新任务的负责人", notes = "用于ã€æµç¨‹è¯¦æƒ…】的ã€è½¬æ´¾ã€‘按钮") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult updateTaskAssignee(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { - taskService.updateTaskAssignee(getLoginUserId(), reqVO); - return success(true); - } - - @GetMapping("/list-by-process-instance-id") - @ApiOperation(value = "获得指定æµç¨‹å®žä¾‹çš„任务列表", notes = "包括完æˆçš„ã€æœªå®Œæˆçš„") - @ApiImplicitParam(name = "processInstanceId", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskListByProcessInstanceId( - @RequestParam("processInstanceId") String processInstanceId) { - return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java deleted file mode 100644 index e8d285e35..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package cn.iocoder.yudao.module.bpm.controller.app; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java deleted file mode 100644 index d1930bd6a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› RESTful API ç»™å‰ç«¯ï¼š - * 1. admin 包:æ供给管ç†åŽå° yudao-ui-admin å‰ç«¯é¡¹ç›® - * 2. app 包:æ供给用户 APP yudao-ui-app å‰ç«¯é¡¹ç›®ï¼Œå®ƒçš„ Controller å’Œ VO 都è¦æ·»åŠ  App å‰ç¼€ï¼Œç”¨äºŽå’Œç®¡ç†åŽå°è¿›è¡ŒåŒºåˆ† - */ -package cn.iocoder.yudao.module.bpm.controller; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java deleted file mode 100644 index 171bbbb53..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java +++ /dev/null @@ -1,142 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import org.activiti.engine.impl.persistence.entity.SuspensionState; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.Model; -import org.activiti.engine.repository.ProcessDefinition; -import org.mapstruct.Mapper; -import org.mapstruct.MappingTarget; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - - -/** - * æµç¨‹æ¨¡åž‹ Convert - * - * @author yunlongn - */ -@Mapper -public interface BpmModelConvert { - - BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); - - default List convertList(List list, Map formMap, - Map deploymentMap, - Map processDefinitionMap) { - return CollectionUtils.convertList(list, model -> { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; - Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; - ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; - return convert(model, form, deployment, processDefinition); - }); - } - - default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) { - BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO(); - modelRespVO.setId(model.getId()); - modelRespVO.setCreateTime(model.getCreateTime()); - // 通用 copy - copyTo(model, modelRespVO); - // Form - if (form != null) { - modelRespVO.setFormId(form.getId()); - modelRespVO.setFormName(form.getName()); - } - // ProcessDefinition - modelRespVO.setProcessDefinition(this.convert(processDefinition)); - if (modelRespVO.getProcessDefinition() != null) { - modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ? - SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - modelRespVO.getProcessDefinition().setDeploymentTime(deployment.getDeploymentTime()); - } - return modelRespVO; - } - - default BpmModelRespVO convert(Model model) { - BpmModelRespVO modelRespVO = new BpmModelRespVO(); - modelRespVO.setId(model.getId()); - modelRespVO.setCreateTime(model.getCreateTime()); - // 通用 copy - copyTo(model, modelRespVO); - return modelRespVO; - } - - default void copyTo(Model model, BpmModelBaseVO to) { - to.setName(model.getName()); - to.setKey(model.getKey()); - to.setCategory(model.getCategory()); - // metaInfo - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - copyTo(metaInfo, to); - } - - void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); - - default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) { - BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO(); - createReqDTO.setModelId(model.getId()); - createReqDTO.setName(model.getName()); - createReqDTO.setKey(model.getKey()); - createReqDTO.setCategory(model.getCategory()); - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - // metaInfo - copyTo(metaInfo, createReqDTO); - // form - if (form != null) { - createReqDTO.setFormConf(form.getConf()); - createReqDTO.setFormFields(form.getFields()); - } - return createReqDTO; - } - - void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmProcessDefinitionCreateReqDTO to); - - default void copy(Model model, BpmModelCreateReqVO bean) { - model.setName(bean.getName()); - model.setKey(bean.getKey()); - model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null, - null, null)); - } - - default void copy(Model model, BpmModelUpdateReqVO bean) { - model.setName(bean.getName()); - model.setCategory(bean.getCategory()); - model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class), - bean.getDescription(), bean.getFormType(), bean.getFormId(), - bean.getFormCustomCreatePath(), bean.getFormCustomViewPath())); - } - - default String buildMetaInfoStr(BpmModelMetaInfoRespDTO metaInfo, String description, Integer formType, - Long formId, String formCustomCreatePath, String formCustomViewPath) { - if (metaInfo == null) { - metaInfo = new BpmModelMetaInfoRespDTO(); - } - // åªæœ‰éžç©ºï¼Œæ‰è¿›è¡Œè®¾ç½®ï¼Œé¿å…更新时的覆盖 - if (StrUtil.isNotEmpty(description)) { - metaInfo.setDescription(description); - } - if (Objects.nonNull(formType)) { - metaInfo.setFormType(formType); - metaInfo.setFormId(formId); - metaInfo.setFormCustomCreatePath(formCustomCreatePath); - metaInfo.setFormCustomViewPath(formCustomViewPath); - } - return JsonUtils.toJsonString(metaInfo); - } - - BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean); - - BpmModelCreateReqVO convert(BpmModeImportReqVO bean); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java deleted file mode 100644 index b789bc000..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import org.activiti.engine.impl.persistence.entity.SuspensionState; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.ProcessDefinition; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * Bpm æµç¨‹å®šä¹‰çš„ Convert - * - * @author yunlong.li - */ -@Mapper -public interface BpmProcessDefinitionConvert { - - BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); - - default List convertList(List list, Map deploymentMap, - Map processDefinitionDOMap, Map formMap) { - return CollectionUtils.convertList(list, definition -> { - Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; - BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId()); - BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; - return convert(definition, deployment, definitionDO, form); - }); - } - - default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, - BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { - BpmProcessDefinitionPageItemRespVO respVO = convert(bean); - respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - if (deployment != null) { - respVO.setDeploymentTime(deployment.getDeploymentTime()); - } - if (form != null) { - respVO.setFormName(form.getName()); - } - // å¤åˆ¶é€šç”¨å±žæ€§ - copyTo(processDefinitionExtDO, respVO); - return respVO; - } - - BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean); - - BpmProcessDefinitionExtDO convert2(BpmProcessDefinitionCreateReqDTO bean); - - default List convertList3(List list, - Map processDefinitionDOMap) { - return CollectionUtils.convertList(list, processDefinition -> { - BpmProcessDefinitionRespVO respVO = convert3(processDefinition); - BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId()); - // å¤åˆ¶é€šç”¨å±žæ€§ - copyTo(processDefinitionExtDO, respVO); - return respVO; - }); - } - - @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") - BpmProcessDefinitionRespVO convert3(ProcessDefinition bean); - - @Named("convertSuspendedToSuspensionState") - default Integer convertSuspendedToSuspensionState(boolean suspended) { - return suspended ? SuspensionState.SUSPENDED.getStateCode() : - SuspensionState.ACTIVE.getStateCode(); - } - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java deleted file mode 100644 index 4be54fe7a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.activiti.bpmn.model.UserTask; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface BpmTaskAssignRuleConvert { - - BpmTaskAssignRuleConvert INSTANCE = Mappers.getMapper(BpmTaskAssignRuleConvert.class); - - default List convertList(List tasks, List rules) { - Map ruleMap = CollectionUtils.convertMap(rules, BpmTaskAssignRuleDO::getTaskDefinitionKey); - // 以 UserTask 为主维度,原因是:æµç¨‹å›¾ç¼–辑åŽï¼Œä¸€äº›è§„则实际就没用了。 - return CollectionUtils.convertList(tasks, task -> { - BpmTaskAssignRuleRespVO respVO = convert(ruleMap.get(task.getId())); - if (respVO == null) { - respVO = new BpmTaskAssignRuleRespVO(); - respVO.setTaskDefinitionKey(task.getId()); - } - respVO.setTaskDefinitionName(task.getName()); - return respVO; - }); - } - - BpmTaskAssignRuleRespVO convert(BpmTaskAssignRuleDO bean); - - BpmTaskAssignRuleDO convert(BpmTaskAssignRuleCreateReqVO bean); - - BpmTaskAssignRuleDO convert(BpmTaskAssignRuleUpdateReqVO bean); - - List convertList2(List list); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java deleted file mode 100644 index 6db6ebc46..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› POJO ç±»çš„å®žä½“è½¬æ¢ - * - * ç›®å‰ä½¿ç”¨ MapStruct 框架 - */ -package cn.iocoder.yudao.module.bpm.convert; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java deleted file mode 100644 index 02bfaa24e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import org.activiti.engine.history.HistoricActivityInstance; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * BPM 活动 Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmActivityConvert { - - BpmActivityConvert INSTANCE = Mappers.getMapper(BpmActivityConvert.class); - - List convertList(List list); - - @Mappings({ - @Mapping(source = "activityId", target = "key"), - @Mapping(source = "activityType", target = "type") - }) - BpmActivityRespVO convert(HistoricActivityInstance bean); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java deleted file mode 100644 index 8b58a15e7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ /dev/null @@ -1,135 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Task; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * æµç¨‹å®žä¾‹ Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmProcessInstanceConvert { - - BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); - - default BpmProcessInstanceExtDO convert3(ProcessInstance instance, ProcessDefinition definition) { - BpmProcessInstanceExtDO ext = new BpmProcessInstanceExtDO(); - copyTo(instance, ext); - copyTo(definition, ext); - return ext; - } - - @Mappings({ - @Mapping(source = "from.id", target = "id", ignore = true), - @Mapping(source = "from.startTime", target = "createTime"), - }) - void copyTo(ProcessInstance from, @MappingTarget BpmProcessInstanceExtDO to); - @Mapping(source = "from.id", target = "id", ignore = true) - void copyTo(ProcessDefinition from, @MappingTarget BpmProcessInstanceExtDO to); - - default PageResult convertPage(PageResult page, - Map> taskMap) { - List list = convertList(page.getList()); - list.forEach(respVO -> respVO.setTasks(convertList2(taskMap.get(respVO.getId())))); - return new PageResult<>(list, page.getTotal()); - } - - List convertList(List list); - - List convertList2(List tasks); - - @Mapping(source = "processInstanceId", target = "id") - BpmProcessInstancePageItemRespVO convert(BpmProcessInstanceExtDO bean); - - @Mappings({ - @Mapping(source = "id", target = "processInstanceId"), - @Mapping(source = "id", target = "id", ignore = true), - @Mapping(source = "startDate", target = "createTime"), - @Mapping(source = "initiator", target = "startUserId"), - @Mapping(source = "status", target = "status", ignore = true) - }) - BpmProcessInstanceExtDO convert(org.activiti.api.process.model.ProcessInstance bean); - - default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt, - ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt, - String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) { - BpmProcessInstanceRespVO respVO = convert2(processInstance); - copyTo(processInstanceExt, respVO); - // definition - respVO.setProcessDefinition(convert2(processDefinition)); - copyTo(processDefinitionExt, respVO.getProcessDefinition()); - respVO.getProcessDefinition().setBpmnXml(bpmnXml); - // user - if (startUser != null) { - respVO.setStartUser(convert2(startUser)); - if (dept != null) { - respVO.getStartUser().setDeptName(dept.getName()); - } - } - return respVO; - } - - BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean); - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessInstanceExtDO from, @MappingTarget BpmProcessInstanceRespVO to); - BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean); - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); - BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean); - - default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) { - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); - event.setId(instance.getId()); - event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); - event.setBusinessKey(instance.getBusinessKey()); - event.setResult(result); - return event; - } - - default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) { - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); - event.setId(instance.getId()); - event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); - event.setBusinessKey(instance.getBusinessKey()); - event.setResult(result); - return event; - } - - default BpmMessageSendWhenProcessInstanceRejectReqDTO convert(ProcessInstance processInstance, String reason) { - BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceRejectReqDTO(); - copyTo(processInstance, reqDTO); - reqDTO.setReason(reason); - return reqDTO; - } - @Mapping(source = "name", target = "processInstanceName") - void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenProcessInstanceRejectReqDTO to); - - @Mappings({ - @Mapping(source = "id", target = "processInstanceId"), - @Mapping(source = "name", target = "processInstanceName"), - @Mapping(source = "initiator", target = "startUserId") - }) - BpmMessageSendWhenProcessInstanceApproveReqDTO convert2(org.activiti.api.process.model.ProcessInstance processInstance); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java deleted file mode 100644 index d74cc16b8..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ /dev/null @@ -1,149 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.history.HistoricTaskInstance; -import org.activiti.engine.impl.persistence.entity.SuspensionState; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Task; -import org.mapstruct.*; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * Bpm 任务 Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmTaskConvert { - - BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); - - default List convertList1(List tasks, Map processInstanceMap, - Map userMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskTodoPageItemRespVO respVO = convert1(task); - ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId()); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - return respVO; - }); - } - - @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") - BpmTaskTodoPageItemRespVO convert1(Task bean); - - @Named("convertSuspendedToSuspensionState") - default Integer convertSuspendedToSuspensionState(boolean suspended) { - return suspended ? SuspensionState.SUSPENDED.getStateCode() : - SuspensionState.ACTIVE.getStateCode(); - } - - default List convertList2(List tasks, Map bpmTaskExtDOMap, - Map historicProcessInstanceMap, - Map userMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskDonePageItemRespVO respVO = convert2(task); - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); - copyTo(taskExtDO, respVO); - HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - return respVO; - }); - } - - BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean); - - @Mappings({ - @Mapping(source = "id", target = "taskId"), - @Mapping(source = "assignee", target = "assigneeUserId"), - @Mapping(source = "createdDate", target = "createTime"), - @Mapping(target = "id", ignore = true) - }) - BpmTaskExtDO convert(org.activiti.api.task.model.Task bean); - - default List convertList3(List tasks, Map bpmTaskExtDOMap, - HistoricProcessInstance processInstance, Map userMap, - Map deptMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskRespVO respVO = convert3(task); - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); - copyTo(taskExtDO, respVO); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); - if (assignUser != null) { - respVO.setAssigneeUser(convert3(assignUser)); - DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); - if (dept != null) { - respVO.getAssigneeUser().setDeptName(dept.getName()); - } - } - return respVO; - }); - } - - @Mapping(source = "taskDefinitionKey", target = "definitionKey") - BpmTaskRespVO convert3(HistoricTaskInstance bean); - BpmTaskRespVO.User convert3(AdminUserRespDTO bean); - - @Mapping(target = "id", ignore = true) - void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); - - @Mappings({ - @Mapping(source = "processInstance.id", target = "id"), - @Mapping(source = "processInstance.name", target = "name"), - @Mapping(source = "processInstance.startUserId", target = "startUserId"), - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), - @Mapping(source = "startUser.nickname", target = "startUserNickname") - }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); - - @Mappings({ - @Mapping(source = "processInstance.id", target = "id"), - @Mapping(source = "processInstance.name", target = "name"), - @Mapping(source = "processInstance.startUserId", target = "startUserId"), - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), - @Mapping(source = "startUser.nickname", target = "startUserNickname") - }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); - - default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, org.activiti.api.task.model.Task task) { - BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); - copyTo(processInstance, reqDTO); - copyTo(startUser, reqDTO); - copyTo(task, reqDTO); - return reqDTO; - } - @Mapping(source = "name", target = "processInstanceName") - void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); - @Mappings({ - @Mapping(source = "id", target = "startUserId"), - @Mapping(source = "nickname", target = "startUserNickname") - }) - void copyTo(AdminUserRespDTO from, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); - @Mappings({ - @Mapping(source = "id", target = "taskId"), - @Mapping(source = "name", target = "taskName"), - @Mapping(source = "assignee", target = "assigneeUserId") - }) - void copyTo(org.activiti.api.task.model.Task task, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to); -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md deleted file mode 100644 index 8153487b7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java deleted file mode 100644 index 181cc2d57..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.config; - -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.identity.EmptyUserGroupManager; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import org.activiti.api.runtime.shared.identity.UserGroupManager; -import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Collections; -import java.util.List; - -import static org.activiti.spring.boot.ProcessEngineAutoConfiguration.BEHAVIOR_FACTORY_MAPPING_CONFIGURER; - -/** - * BPM 模å—çš„ Activiti é…置类 - */ -@Configuration -public class BpmActivitiConfiguration { - - /** - * 空用户组的 Bean - */ - @Bean - public UserGroupManager userGroupManager() { - return new EmptyUserGroupManager(); - } - - /** - * BPM 模å—çš„ ProcessEngineConfigurationConfigurer 实现类,主è¦è®¾ç½®å„ç§ç›‘å¬å™¨ - */ - @Bean - public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( - BpmTackActivitiEventListener taskActivitiEventListener) { - return configuration -> { - // 注册监å¬å™¨ï¼Œä¾‹å¦‚说 BpmActivitiEventListener - configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener)); - }; - } - - /** - * 用于设置自定义的 ActivityBehaviorFactory 实现的 ProcessEngineConfigurationConfigurer 实现类 - * - * 目的:覆盖 {@link org.activiti.spring.boot.ProcessEngineAutoConfiguration} çš„ - * defaultActivityBehaviorFactoryMappingConfigurer 方法创建的 Bean - */ - @Bean(name = BEHAVIOR_FACTORY_MAPPING_CONFIGURER) - public ProcessEngineConfigurationConfigurer defaultActivityBehaviorFactoryMappingConfigurer( - BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { - return configuration -> { - // 设置 ActivityBehaviorFactory 实现类,用于æµç¨‹ä»»åŠ¡çš„审核人的自定义 - configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); - }; - } - - @Bean - public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService, - BpmUserGroupService userGroupService, - PermissionApi permissionApi, - DeptApi deptApi, - AdminUserApi adminUserApi, - List scripts) { - BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); - bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); - bpmActivityBehaviorFactory.setUserGroupService(userGroupService); - bpmActivityBehaviorFactory.setAdminUserApi(adminUserApi); - bpmActivityBehaviorFactory.setPermissionApi(permissionApi); - bpmActivityBehaviorFactory.setDeptApi(deptApi); - bpmActivityBehaviorFactory.setScripts(scripts); - return bpmActivityBehaviorFactory; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java deleted file mode 100644 index 76f0d97a0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; - -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.Setter; -import lombok.ToString; -import org.activiti.bpmn.model.UserTask; -import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; -import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; - -import java.util.List; - -/** - * 自定义的 ActivityBehaviorFactory 实现类,目的如下: - * 1. 自定义 {@link #createUserTaskActivityBehavior(UserTask)}:实现自定义的æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * - * @author 芋é“æºç  - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { - - @Setter - private BpmTaskAssignRuleService bpmTaskRuleService; - @Setter - private BpmUserGroupService userGroupService; - - @Setter - private PermissionApi permissionApi; - @Setter - private DeptApi deptApi; - @Setter - private AdminUserApi adminUserApi; - - @Setter - private List scripts; - - @Override - public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { - BpmUserTaskActivityBehavior userTaskActivityBehavior = new BpmUserTaskActivityBehavior(userTask); - userTaskActivityBehavior.setBpmTaskRuleService(bpmTaskRuleService); - userTaskActivityBehavior.setPermissionApi(permissionApi); - userTaskActivityBehavior.setDeptApi(deptApi); - userTaskActivityBehavior.setUserGroupService(userGroupService); - userTaskActivityBehavior.setAdminUserApi(adminUserApi); - userTaskActivityBehavior.setScripts(scripts); - return userTaskActivityBehavior; - } - - // TODO 芋艿:并行任务 ParallelMultiInstanceBehavior - - // TODO 芋艿:并行任务 SequentialMultiInstanceBehavior - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehavior.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehavior.java deleted file mode 100644 index ed95b4c8a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehavior.java +++ /dev/null @@ -1,196 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import com.google.common.annotations.VisibleForTesting; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.activiti.bpmn.model.UserTask; -import org.activiti.engine.ActivitiException; -import org.activiti.engine.delegate.DelegateExecution; -import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; -import org.activiti.engine.impl.el.ExpressionManager; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.activiti.engine.impl.persistence.entity.TaskEntityManager; - -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; - -/** - * 自定义的æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * 第一步,获得对应的分é…规则; - * 第二步,根æ®åˆ†é…规则,计算出分é…任务的候选人。如果找ä¸åˆ°ï¼Œåˆ™ç›´æŽ¥æŠ¥ä¸šåŠ¡å¼‚常,ä¸ç»§ç»­æ‰§è¡ŒåŽç»­çš„æµç¨‹ï¼› - * 第三步,éšæœºé€‰æ‹©ä¸€ä¸ªå€™é€‰äººï¼Œåˆ™é€‰æ‹©ä½œä¸º assignee 负责人。 - * - * @author 芋é“æºç  - */ -@Slf4j -public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior { - - @Setter - private BpmTaskAssignRuleService bpmTaskRuleService; - - @Setter - private BpmUserGroupService userGroupService; - - @Setter - private DeptApi deptApi; - @Setter - private AdminUserApi adminUserApi; - @Setter - private PermissionApi permissionApi; - - /** - * 任务分é…脚本 - */ - private Map scriptMap = Collections.emptyMap(); - - public BpmUserTaskActivityBehavior(UserTask userTask) { - super(userTask); - } - - public void setScripts(List scripts) { - this.scriptMap = convertMap(scripts, script -> script.getEnum().getId()); - } - - @Override - protected void handleAssignments(TaskEntityManager taskEntityManager, - String assignee, String owner, List candidateUsers, List candidateGroups, - TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution) { - // 第一步,获得任务的规则 - BpmTaskAssignRuleDO rule = getTaskRule(task); - // 第二步,获得任务的候选用户们 - Set candidateUserIds = calculateTaskCandidateUsers(task, rule); - // 第三步,设置一个作为负责人 - Long assigneeUserId = chooseTaskAssignee(candidateUserIds); - taskEntityManager.changeTaskAssignee(task, String.valueOf(assigneeUserId)); - } - - private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) { - List taskRules = bpmTaskRuleService.getTaskAssignRuleListByProcessDefinitionId(task.getProcessDefinitionId(), - task.getTaskDefinitionKey()); - if (CollUtil.isEmpty(taskRules)) { - throw new ActivitiException(StrUtil.format("æµç¨‹ä»»åŠ¡({}/{}/{}) 找ä¸åˆ°ç¬¦åˆçš„任务规则", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey())); - } - if (taskRules.size() > 1) { - throw new ActivitiException(StrUtil.format("æµç¨‹ä»»åŠ¡({}/{}/{}) 找到过多任务规则({})", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), taskRules.size())); - } - return taskRules.get(0); - } - - private Long chooseTaskAssignee(Set candidateUserIds) { - // TODO 芋艿:未æ¥å¯ä»¥ä¼˜åŒ–下,改æˆè½®è¯¢çš„ç­–ç•¥ - int index = RandomUtil.randomInt(candidateUserIds.size()); - return CollUtil.get(candidateUserIds, index); - } - - @VisibleForTesting - Set calculateTaskCandidateUsers(TaskEntity task, BpmTaskAssignRuleDO rule) { - Set assigneeUserIds = null; - if (Objects.equals(BpmTaskAssignRuleTypeEnum.ROLE.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByRole(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByDeptMember(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByDeptLeader(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.POST.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByPost(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByUserGroup(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.SCRIPT.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByScript(task, rule); - } - - // 移除被ç¦ç”¨çš„用户 - removeDisableUsers(assigneeUserIds); - // 如果候选人为空,抛出异常 TODO 芋艿:没候选人的策略选择。1 - 挂起;2 - 直接结æŸï¼›3 - 强制一个兜底人 - if (CollUtil.isEmpty(assigneeUserIds)) { - log.error("[calculateTaskCandidateUsers][æµç¨‹ä»»åŠ¡({}/{}/{}) 任务规则({}) 找ä¸åˆ°å€™é€‰äºº]", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), toJsonString(rule)); - throw exception(TASK_CREATE_FAIL_NO_CANDIDATE_USER); - } - return assigneeUserIds; - } - - private Set calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskAssignRuleDO rule) { - return permissionApi.getUserRoleIdListByRoleIds(rule.getOptions()); - } - - private Set calculateTaskCandidateUsersByDeptMember(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = adminUserApi.getUsersByDeptIds(rule.getOptions()); - return convertSet(users, AdminUserRespDTO::getId); - } - - private Set calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskAssignRuleDO rule) { - List depts = deptApi.getDepts(rule.getOptions()); - return convertSet(depts, DeptRespDTO::getLeaderUserId); - } - - private Set calculateTaskCandidateUsersByPost(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = adminUserApi.getUsersByPostIds(rule.getOptions()); - return convertSet(users, AdminUserRespDTO::getId); - } - - private Set calculateTaskCandidateUsersByUser(TaskEntity task, BpmTaskAssignRuleDO rule) { - return rule.getOptions(); - } - - private Set calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskAssignRuleDO rule) { - List userGroups = userGroupService.getUserGroupList(rule.getOptions()); - Set userIds = new HashSet<>(); - userGroups.forEach(group -> userIds.addAll(group.getMemberUserIds())); - return userIds; - } - - private Set calculateTaskCandidateUsersByScript(TaskEntity task, BpmTaskAssignRuleDO rule) { - // 获得对应的脚本 - List scripts = new ArrayList<>(rule.getOptions().size()); - rule.getOptions().forEach(id -> { - BpmTaskAssignScript script = scriptMap.get(id); - if (script == null) { - throw exception(TASK_ASSIGN_SCRIPT_NOT_EXISTS, id); - } - scripts.add(script); - }); - // é€ä¸ªè®¡ç®—任务 - Set userIds = new HashSet<>(); - scripts.forEach(script -> CollUtil.addAll(userIds, script.calculateTaskCandidateUsers(task))); - 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.ENABLE.getStatus().equals(user.getStatus()); - }); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java deleted file mode 100644 index e627479a5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 拓展 {@link org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior} 实现,基于 {@link cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO} 实现自定义的任务分é…规则。 - * 原因:BPMN 默认的 assignã€candidateUsersã€candidateGroups 拓展起æ¥æœ‰ä¸€å®šçš„难度,所以选择放弃它们,使用自己定义的规则。 - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java deleted file mode 100644 index eee0d3f40..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/BpmTaskAssignScript.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script; - -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.activiti.engine.impl.persistence.entity.TaskEntity; - -import java.util.Set; - -/** - * Bpm 任务分é…的自定义 Script 脚本 - * 使用场景: - * 1. 设置审批人为å‘起人 - * 2. 设置审批人为å‘起人的 Leader - * 3. 甚至审批人为å‘起人的 Leader çš„ Leader - * - * @author 芋é“æºç  - */ -public interface BpmTaskAssignScript { - - /** - * 基于æµç¨‹ä»»åŠ¡ï¼ŒèŽ·å¾—任务的候选用户们 - * - * @param task 任务 - * @return 候选人用户的编å·æ•°ç»„ - */ - Set calculateTaskCandidateUsers(TaskEntity task); - - /** - * 获得枚举值 - * - * @return 枚举值 - */ - BpmTaskRuleScriptEnum getEnum(); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java deleted file mode 100644 index c27567018..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; - -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; - -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.springframework.util.Assert; - -import javax.annotation.Resource; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; -import static java.util.Collections.emptySet; - -/** - * 分é…ç»™å‘起人的 Leader 审批的 Script 实现类 - * ç›®å‰ Leader 的定义是, - * - * @author 芋é“æºç  - */ -public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssignScript { - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - - protected Set calculateTaskCandidateUsers(TaskEntity task, int level) { - Assert.isTrue(level > 0, "level 必须大于 0"); - // 获得å‘起人 - Long startUserId = Long.parseLong(task.getProcessInstance().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()); - if (parentDept == null) { // 找ä¸åˆ°çˆ¶çº§éƒ¨é—¨ï¼Œæ‰€ä»¥åªå¥½ç»“æŸå¯»æ‰¾ã€‚原因是:例如说,级别比较高的人,所在部门层级比较少 - break; - } - dept = parentDept; - } - } - return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet(); - } - - private DeptRespDTO getStartUserDept(Long startUserId) { - AdminUserRespDTO startUser = adminUserApi.getUser(startUserId); - if (startUser.getDeptId() == null) { // 找ä¸åˆ°éƒ¨é—¨ï¼Œæ‰€ä»¥æ— æ³•ä½¿ç”¨è¯¥è§„则 - return null; - } - return deptApi.getDept(startUser.getDeptId()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java deleted file mode 100644 index 4b0a7c1eb..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人的一级 Leader 审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignLeaderX1Script extends BpmTaskAssignLeaderAbstractScript { - - @Override - @DataPermission(enable = false) // ä¸éœ€è¦å¤„ç†æ•°æ®æƒé™ï¼Œ ä¸ç„¶ä¼šæœ‰é—®é¢˜ï¼ŒæŸ¥è¯¢ä¸åˆ°æ•°æ® - public Set calculateTaskCandidateUsers(TaskEntity task) { - return calculateTaskCandidateUsers(task, 1); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X1; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java deleted file mode 100644 index 41ee8254b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人的二级 Leader 审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignLeaderX2Script extends BpmTaskAssignLeaderAbstractScript { - - @Override - @DataPermission(enable = false) // ä¸éœ€è¦å¤„ç†æ•°æ®æƒé™ï¼Œ ä¸ç„¶ä¼šæœ‰é—®é¢˜ï¼ŒæŸ¥è¯¢ä¸åˆ°æ•°æ® - public Set calculateTaskCandidateUsers(TaskEntity task) { - return calculateTaskCandidateUsers(task, 2); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X2; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java deleted file mode 100644 index af8846cbe..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignStartUserScript.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; - -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.framework.common.util.collection.SetUtils; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignStartUserScript implements BpmTaskAssignScript { - - @Override - public Set calculateTaskCandidateUsers(TaskEntity task) { - Long userId = Long.parseLong(task.getProcessInstance().getStartUserId()); - return SetUtils.asSet(userId); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.START_USER; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java deleted file mode 100644 index 22786da10..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.identity; - -import org.activiti.api.runtime.shared.identity.UserGroupManager; - -import java.util.Collections; -import java.util.List; - -/** - * 空的 UserGroupManager 实现类,用于ç¦ç”¨ Activiti 自带的用户组实现。 - * 原因是,我们使用了自己实现的任务分é…规则,所以ä¸éœ€è¦ Activiti。 - * 如果ä¸åŽ»ç¦ç”¨ï¼Œä¼šå­˜åœ¨ä¸€äº›åœºæ™¯ä¸‹ï¼Œä¼šåŽ»æŸ¥è¯¢ç”¨æˆ·æ‰€åœ¨çš„用户组,导致报错。 - * - * @author 芋é“æºç  - */ -public class EmptyUserGroupManager implements UserGroupManager { - - @Override - public List getUserGroups(String s) { - return Collections.emptyList(); - } - - @Override - public List getUserRoles(String s) { - return Collections.emptyList(); - } - - @Override - public List getGroups() { - return Collections.emptyList(); - } - - @Override - public List getUsers() { - return Collections.emptyList(); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java deleted file mode 100644 index 6ed7297d7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; - -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import org.activiti.api.model.shared.event.RuntimeEvent; -import org.activiti.api.process.model.ProcessInstance; -import org.activiti.api.process.model.events.ProcessRuntimeEvent; -import org.activiti.api.process.runtime.events.ProcessCancelledEvent; -import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * ç›‘å¬ {@link ProcessInstance} 的开始与完æˆï¼Œåˆ›å»ºä¸Žæ›´æ–°å¯¹åº”çš„ {@link BpmProcessInstanceExtDO} 记录 - * - * @author 芋é“æºç  - */ -@Component -public class BpmProcessInstanceEventListener> - implements ProcessRuntimeEventListener { - - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - - @Override - @SuppressWarnings("unchecked") - public void onEvent(T rawEvent) { - // 由于 ProcessRuntimeEventListener 无法ä¿è¯åªç›‘å¬ ProcessRuntimeEvent äº‹ä»¶ï¼Œæ‰€ä»¥é€šè¿‡è¿™æ ·çš„æ–¹å¼ - if (!(rawEvent instanceof ProcessRuntimeEvent)) { - return; - } - ProcessRuntimeEvent event = (ProcessRuntimeEvent) rawEvent; - - // 创建时,æ’入拓展表 - if (event.getEventType() == ProcessRuntimeEvent.ProcessEvents.PROCESS_CREATED) { - processInstanceService.createProcessInstanceExt(event.getEntity()); - return; - } - // å–消时,更新拓展表为å–消 - if (event.getEventType() == ProcessRuntimeEvent.ProcessEvents.PROCESS_CANCELLED) { - processInstanceService.updateProcessInstanceExtCancel(event.getEntity(), - ((ProcessCancelledEvent) event).getCause()); - return; - } - // 完æˆæ—¶ï¼Œæ›´æ–°æ‹“å±•è¡¨ä¸ºå·²å®Œæˆ - if (event.getEventType() == ProcessRuntimeEvent.ProcessEvents.PROCESS_COMPLETED) { - processInstanceService.updateProcessInstanceExtComplete(event.getEntity()); - return; - } - - // 其它事件,进行更新拓展表 - processInstanceService.updateProcessInstanceExt(event.getEntity()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java deleted file mode 100644 index 4b6c21cfd..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import org.activiti.api.task.runtime.events.listener.TaskEventListener; -import org.activiti.engine.delegate.event.ActivitiEvent; -import org.activiti.engine.delegate.event.ActivitiEventListener; -import org.activiti.engine.delegate.event.ActivitiEventType; -import org.activiti.engine.delegate.event.impl.ActivitiEntityEventImpl; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.activiti.engine.repository.ProcessDefinition; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * ç›‘å¬ {@link TaskEntity} 相关的事件,设置相关属性。 - * 目的:解决 {@link TaskEventListener} 无法解决的场景 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTackActivitiEventListener implements ActivitiEventListener { - - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessDefinitionService processDefinitionService; - - @Override - public void onEvent(ActivitiEvent event) { - // Task 创建时,设置其分类,解决 TaskService 未æä¾› name 的设置方法 - if (ActivitiEventType.TASK_CREATED == event.getType()) { - TaskEntity task = ((TaskEntity) ((ActivitiEntityEventImpl) event).getEntity()); - if (StrUtil.isNotEmpty(task.getCategory())) { - return; - } - // 设置 name - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition2(task.getProcessDefinitionId()); - if (processDefinition == null) { - return; - } - task.setCategory(processDefinition.getCategory()); - } - } - - @Override - public boolean isFailOnException() { - return true; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java deleted file mode 100644 index da8c6238d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/BpmTaskEventListener.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; - -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; -import org.activiti.api.model.shared.event.RuntimeEvent; -import org.activiti.api.task.model.Task; -import org.activiti.api.task.model.events.TaskRuntimeEvent; -import org.activiti.api.task.runtime.events.listener.TaskRuntimeEventListener; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * ç›‘å¬ {@link Task} 的开始与完æˆï¼Œåˆ›å»ºä¸Žæ›´æ–°å¯¹åº”çš„ {@link BpmTaskExtDO} 记录 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskEventListener> - implements TaskRuntimeEventListener { - - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmTaskService taskService; - - @Override - @SuppressWarnings("unchecked") - public void onEvent(T rawEvent) { - // 由于 TaskRuntimeEventListener 无法ä¿è¯åªç›‘å¬ TaskRuntimeEvent äº‹ä»¶ï¼Œæ‰€ä»¥é€šè¿‡è¿™æ ·çš„æ–¹å¼ - if (!(rawEvent instanceof TaskRuntimeEvent)) { - return; - } - TaskRuntimeEvent event = (TaskRuntimeEvent) rawEvent; - - // 创建时,æ’入拓展表 - if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_CREATED) { - taskService.createTaskExt(event.getEntity()); - return; - } - - // å–消时,更新拓展表为å–消 - if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_CANCELLED) { - taskService.updateTaskExtCancel(event.getEntity()); - return; - } - // 完æˆæ—¶ï¼Œæ›´æ–°æ‹“展表为已完æˆã€‚è¦æ³¨æ„,在调用 delete ProcessInstance æ‰ä¼šè§¦å‘该逻辑 - if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_COMPLETED) { - taskService.updateTaskExtComplete(event.getEntity()); - return; - } - - // 审核人修改时,进行拓展表,并é¢å¤–å‘é€é€šçŸ¥ - if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_ASSIGNED) { - taskService.updateTaskExtAssign(event.getEntity()); - return; - } - - // 其它事件,进行更新拓展表 - taskService.updateTaskExt(event.getEntity()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java deleted file mode 100644 index eca41904c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/listener/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 自定义å„ç§ Activiti 的监å¬å™¨ï¼Œå®žçŽ°æµç¨‹ç¤ºä¾‹ã€æµç¨‹ä»»åŠ¡çš„拓展表信æ¯çš„åŒæ­¥ - * 例如说,{@link org.activiti.api.task.model.Task} 新建时,我们也è¦æ–°å»ºå¯¹åº”çš„ {@link cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO} 记录 - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.listener; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java deleted file mode 100644 index 52fdb7f93..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 bpm 模å—çš„ framework å°è£… - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java deleted file mode 100644 index 5713e495c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * bpm 包下,业务æµç¨‹ç®¡ç†ï¼ˆBusiness Process Management),我们放工作æµçš„功能,基于 activiti 7 版本实现。 - * 例如说:æµç¨‹å®šä¹‰ã€è¡¨å•é…ç½®ã€å®¡æ ¸ä¸­å¿ƒï¼ˆæˆ‘的申请ã€æˆ‘的待办ã€æˆ‘的已办)等等 - * - * bpm 解释:https://baike.baidu.com/item/BPM/1933 - * - * 1. Controller URL:以 /bpm/ 开头,é¿å…和其它 Module å†²çª - * 2. DataObject 表å:以 bpm_ 开头,方便在数æ®åº“中区分 - * - * 注æ„,由于 Bpm 模å—下,容易和其它模å—é‡å,所以类å都加载 Pay çš„å‰ç¼€~ - */ -package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java deleted file mode 100644 index fea5398a7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import org.activiti.bpmn.model.BpmnModel; - -import javax.validation.Valid; - -/** - * æµç¨‹æ¨¡åž‹æŽ¥å£ - * - * @author yunlongn - */ -public interface BpmModelService { - /** - * 获得æµç¨‹æ¨¡åž‹åˆ†é¡µ - * - * @param pageVO 分页查询 - * @return æµç¨‹æ¨¡åž‹åˆ†é¡µ - */ - PageResult getModelPage(BpmModelPageReqVO pageVO); - - /** - * 创建æµç¨‹æ¨¡åž‹ - * - * @param modelVO åˆ›å»ºä¿¡æ¯ - * @param bpmnXml BPMN XML - * @return 创建的æµç¨‹æ¨¡åž‹çš„ç¼–å· - */ - String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml); - - /** - * 获得æµç¨‹æ¨¡å— - * - * @param id ç¼–å· - * @return æµç¨‹æ¨¡åž‹ - */ - BpmModelRespVO getModel(String id); - - /** - * 修改æµç¨‹æ¨¡åž‹ - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateModel(@Valid BpmModelUpdateReqVO updateReqVO); - - /** - * å°†æµç¨‹æ¨¡åž‹ï¼Œéƒ¨ç½²æˆä¸€ä¸ªæµç¨‹å®šä¹‰ - * - * @param id ç¼–å· - */ - void deployModel(String id); - - /** - * 删除模型 - * - * @param id ç¼–å· - */ - void deleteModel(String id); - - /** - * 修改模型的状æ€ï¼Œå®žé™…更新的部署的æµç¨‹å®šä¹‰çš„çŠ¶æ€ - * - * @param id ç¼–å· - * @param state çŠ¶æ€ - */ - void updateModelState(String id, Integer state); - - /** - * 获得æµç¨‹æ¨¡åž‹ç¼–å·å¯¹åº”çš„ BPMN Model - * - * @param id æµç¨‹æ¨¡åž‹ç¼–å· - * @return BPMN Model - */ - BpmnModel getBpmnModel(String id); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java deleted file mode 100644 index bbeadd6b5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ /dev/null @@ -1,282 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import lombok.extern.slf4j.Slf4j; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.impl.persistence.entity.SuspensionState; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.Model; -import org.activiti.engine.repository.ModelQuery; -import org.activiti.engine.repository.ProcessDefinition; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.ObjectUtils; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * æµç¨‹å®šä¹‰å®žçŽ° - * 主è¦è¿›è¡Œ Activiti {@link Model} 的维护 - * - * @author yunlongn - * @author 芋é“æºç  - */ -@Service -@Validated -@Slf4j -public class BpmModelServiceImpl implements BpmModelService { - - @Resource - private RepositoryService repositoryService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmFormService bpmFormService; - @Resource - private BpmTaskAssignRuleService taskAssignRuleService; - - @Override - public PageResult getModelPage(BpmModelPageReqVO pageVO) { - ModelQuery modelQuery = repositoryService.createModelQuery(); - if (StrUtil.isNotBlank(pageVO.getKey())) { - modelQuery.modelKey(pageVO.getKey()); - } - if (StrUtil.isNotBlank(pageVO.getName())) { - modelQuery.modelNameLike("%" + pageVO.getName() + "%"); // æ¨¡ç³ŠåŒ¹é… - } - if (StrUtil.isNotBlank(pageVO.getCategory())) { - modelQuery.modelCategory(pageVO.getCategory()); - } - // 执行查询 - List models = modelQuery.orderByCreateTime().desc() - .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - - // 获得 Form Map - Set formIds = CollectionUtils.convertSet(models, model -> { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - return metaInfo != null ? metaInfo.getFormId() : null; - }); - Map formMap = bpmFormService.getFormMap(formIds); - - // 获得 Deployment Map - Set deploymentIds = new HashSet<>(); - models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId())); - Map deploymentMap = processDefinitionService.getDeploymentMap(deploymentIds); - // 获得 ProcessDefinition Map - List processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds); - Map processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId); - - // 拼接结果 - long modelCount = modelQuery.count(); - return new PageResult<>(BpmModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount); - } - - @Override - public BpmModelRespVO getModel(String id) { - Model model = repositoryService.getModel(id); - if (model == null) { - return null; - } - BpmModelRespVO modelRespVO = BpmModelConvert.INSTANCE.convert(model); - // 拼接 bpmn XML - byte[] bpmnBytes = repositoryService.getModelEditorSource(id); - modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes)); - return modelRespVO; - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti æ“作,所以开å¯äº‹åŠ¡ - public String createModel(BpmModelCreateReqVO createReqVO, String bpmnXml) { - checkKeyNCName(createReqVO.getKey()); - // 校验æµç¨‹æ ‡è¯†å·²ç»å­˜åœ¨ - Model keyModel = this.getModelByKey(createReqVO.getKey()); - if (keyModel != null) { - throw exception(MODEL_KEY_EXISTS, createReqVO.getKey()); - } - - // 创建æµç¨‹å®šä¹‰ - Model model = repositoryService.newModel(); - BpmModelConvert.INSTANCE.copy(model, createReqVO); - // ä¿å­˜æµç¨‹å®šä¹‰ - repositoryService.saveModel(model); - // ä¿å­˜ BPMN XML - saveModelBpmnXml(model, bpmnXml); - return model.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti æ“作,所以开å¯äº‹åŠ¡ - public void updateModel(BpmModelUpdateReqVO updateReqVO) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(updateReqVO.getId()); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - - // 修改æµç¨‹å®šä¹‰ - BpmModelConvert.INSTANCE.copy(model, updateReqVO); - // 更新模型 - repositoryService.saveModel(model); - // æ›´æ–° BPMN XML - saveModelBpmnXml(model, updateReqVO.getBpmnXml()); - } - - private void saveModelBpmnXml(Model model, String bpmnXml) { - if (StrUtil.isEmpty(bpmnXml)) { - return; - } - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(bpmnXml)); - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti æ“作,所以开å¯äº‹åŠ¡ - public void deployModel(String id) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (ObjectUtils.isEmpty(model)) { - throw exception(MODEL_NOT_EXISTS); - } - // 校验æµç¨‹å›¾ - byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId()); - if (bpmnBytes == null) { - throw exception(MODEL_NOT_EXISTS); - } - // TODO 芋艿:校验æµç¨‹å›¾çš„有效性;例如说,是å¦æœ‰å¼€å§‹çš„元素,是å¦æœ‰ç»“æŸçš„元素; - // 校验表å•å·²é… - BpmFormDO form = checkFormConfig(model.getMetaInfo()); - // 校验任务分é…规则已é…ç½® - taskAssignRuleService.checkTaskAssignRuleAllConfig(id); - - // 校验模型是å¦å‘生修改。如果未修改,则ä¸å…许创建 - BpmProcessDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model, form).setBpmnBytes(bpmnBytes); - if (processDefinitionService.isProcessDefinitionEquals(definitionCreateReqDTO)) { // æµç¨‹å®šä¹‰çš„ä¿¡æ¯ç›¸ç­‰ - ProcessDefinition oldProcessInstance = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); - if (oldProcessInstance != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessInstance.getId())) { - throw exception(MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS); - } - } - // 创建æµç¨‹å®šä¹‰ - String definitionId = processDefinitionService.createProcessDefinition(definitionCreateReqDTO); - - // å°†è€çš„æµç¨‹å®šä¹‰è¿›è¡ŒæŒ‚起。也就是说,åªæœ‰æœ€æ–°éƒ¨ç½²çš„æµç¨‹å®šä¹‰ï¼Œæ‰å¯ä»¥å‘起任务。 - updateProcessDefinitionSuspended(model.getDeploymentId()); - - // æ›´æ–° model çš„ deploymentIdï¼Œè¿›è¡Œå…³è” - ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId); - model.setDeploymentId(definition.getDeploymentId()); - repositoryService.saveModel(model); - - // å¤åˆ¶ä»»åŠ¡åˆ†é…规则 - taskAssignRuleService.copyTaskAssignRules(id, definition.getId()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteModel(String id) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - // 执行删除 - repositoryService.deleteModel(id); - // ç¦ç”¨æµç¨‹å®žä¾‹ - updateProcessDefinitionSuspended(model.getDeploymentId()); - } - - private void updateProcessDefinitionSuspended(String deploymentId) { - if (StrUtil.isEmpty(deploymentId)) { - return; - } - ProcessDefinition oldDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(deploymentId); - if (oldDefinition == null) { - return; - } - if(oldDefinition.isSuspended()) { - return; - } - processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode()); - } - - @Override - public void updateModelState(String id, Integer state) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - // 校验æµç¨‹å®šä¹‰å­˜åœ¨ - ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - - // æ›´æ–°çŠ¶æ€ - processDefinitionService.updateProcessDefinitionState(definition.getId(), state); - } - - @Override - public BpmnModel getBpmnModel(String id) { - byte[] bpmnBytes = repositoryService.getModelEditorSource(id); - if (ArrayUtil.isEmpty(bpmnBytes)) { - return null; - } - return ActivitiUtils.buildBpmnModel(bpmnBytes); - } - - private Model getModelByKey(String key) { - return repositoryService.createModelQuery().modelKey(key).singleResult(); - } - - private void checkKeyNCName(String key) { - if (!ValidationUtils.isXmlNCName(key)) { - throw exception(MODEL_KEY_VALID); - } - } - - /** - * 校验æµç¨‹è¡¨å•å·²é…ç½® - * - * @param metaInfoStr æµç¨‹æ¨¡åž‹ metaInfo 字段 - * @return æµç¨‹è¡¨å• - */ - private BpmFormDO checkFormConfig(String metaInfoStr) { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class); - if (metaInfo == null || metaInfo.getFormType() == null) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - // 校验表å•å­˜åœ¨ - if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - BpmFormDO form = bpmFormService.getForm(metaInfo.getFormId()); - if (form == null) { - throw exception(FORM_NOT_EXISTS); - } - return form; - } - return null; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java deleted file mode 100644 index 46be4b64f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.ProcessDefinition; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * æµç¨‹å®šä¹‰æŽ¥å£ - * - * @author yunlong.li - * @author ZJQ - * @author 芋é“æºç  - */ -public interface BpmProcessDefinitionService { - - /** - * 获得æµç¨‹å®šä¹‰åˆ†é¡µ - * - * @param pageReqVO åˆ†é¡µå…¥å‚ - * @return æµç¨‹å®šä¹‰ Page - */ - PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO); - - /** - * 创建æµç¨‹å®šä¹‰ - * - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return æµç¨‹ç¼–å· - */ - String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); - - /** - * æ›´æ–°æµç¨‹å®šä¹‰çŠ¶æ€ - * - * @param id æµç¨‹å®šä¹‰çš„ç¼–å· - * @param state çŠ¶æ€ - */ - void updateProcessDefinitionState(String id, Integer state); - - /** - * 获得æµç¨‹å®šä¹‰å¯¹åº”çš„ BPMN XML - * - * @param id æµç¨‹å®šä¹‰ç¼–å· - * @return BPMN XML - */ - String getProcessDefinitionBpmnXML(String id); - - /** - * 获得需è¦åˆ›å»ºçš„æµç¨‹å®šä¹‰ï¼Œæ˜¯å¦å’Œå½“å‰æ¿€æ´»çš„æµç¨‹å®šä¹‰ç›¸ç­‰ - * - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return 是å¦ç›¸ç­‰ - */ - boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); - - /** - * 获得编å·å¯¹åº”çš„ BpmProcessDefinitionExtDO - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰æ‹“展 - */ - BpmProcessDefinitionExtDO getProcessDefinitionExt(String id); - - /** - * 获得æµç¨‹å®šä¹‰åˆ—表 - * - * @param listReqVO åˆ—è¡¨å…¥å‚ - * @return æµç¨‹å®šä¹‰åˆ—表 - */ - List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO); - - /** - * 获得 Bpmn 模型 - * - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @return Bpmn 模型 - */ - BpmnModel getBpmnModel(String processDefinitionId); - - /** - * 获得编å·å¯¹åº”çš„ ProcessDefinition - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinition(String id); - - /** - * 获得编å·å¯¹åº”çš„ ProcessDefinition - * - * 相比 {@link #getProcessDefinition(String)} 方法,category çš„å–值是正确 - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinition2(String id); - - /** - * 获得æµç¨‹å®šä¹‰æ ‡è¯†å¯¹åº”的激活的æµç¨‹å®šä¹‰ - * - * @param key æµç¨‹å®šä¹‰çš„标识 - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getActiveProcessDefinition(String key); - - /** - * 获得 id 对应的 Deployment - * - * @param id éƒ¨ç½²ç¼–å· - * @return æµç¨‹éƒ¨ç½² - */ - Deployment getDeployment(String id); - - /** - * 获得 ids 对应的 Deployment 数组 - * - * @param ids 部署编å·çš„数组 - * @return æµç¨‹éƒ¨ç½²çš„数组 - */ - List getDeployments(Set ids); - - /** - * 获得 ids 对应的 Deployment Map - * - * @param ids 部署编å·çš„数组 - * @return æµç¨‹éƒ¨ç½² Map - */ - default Map getDeploymentMap(Set ids) { - return CollectionUtils.convertMap(getDeployments(ids), Deployment::getId); - } - - /** - * 获得 deploymentId 对应的 ProcessDefinition - * - * @param deploymentId éƒ¨ç½²ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId); - - /** - * 获得 deploymentIds 对应的 ProcessDefinition 数组 - * - * @param deploymentIds 部署编å·çš„数组 - * @return æµç¨‹å®šä¹‰çš„数组 - */ - List getProcessDefinitionListByDeploymentIds(Set deploymentIds); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java deleted file mode 100644 index 011a948b6..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java +++ /dev/null @@ -1,267 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import lombok.extern.slf4j.Slf4j; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.impl.persistence.entity.SuspensionState; -import org.activiti.engine.repository.Deployment; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.repository.ProcessDefinitionQuery; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; -import static java.util.Collections.emptyList; - -/** - * æµç¨‹å®šä¹‰å®žçŽ° - * 主è¦è¿›è¡Œ Activiti {@link ProcessDefinition} å’Œ {@link Deployment} 的维护 - * - * @author yunlongn - * @author ZJQ - * @author 芋é“æºç  - */ -@Service -@Validated -@Slf4j -public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { - - private static final String BPMN_FILE_SUFFIX = ".bpmn"; - - @Resource - private RepositoryService repositoryService; - @Resource - private BpmFormService formService; - - @Resource - private BpmProcessDefinitionExtMapper processDefinitionMapper; - - @Override - public PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { - ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); - if (StrUtil.isNotBlank(pageVO.getKey())) { - definitionQuery.processDefinitionKey(pageVO.getKey()); - } - // 执行查询 - List processDefinitions = definitionQuery.orderByProcessDefinitionVersion().desc() - .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - if (CollUtil.isEmpty(processDefinitions)) { - return new PageResult<>(emptyList(), definitionQuery.count()); - } - - // 获得 Deployment Map - Set deploymentIds = new HashSet<>(); - processDefinitions.forEach(definition -> addIfNotNull(deploymentIds, definition.getDeploymentId())); - Map deploymentMap = getDeploymentMap(deploymentIds); - - // 获得 BpmProcessDefinitionDO Map - List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( - convertList(processDefinitions, ProcessDefinition::getId)); - Map processDefinitionDOMap = convertMap(processDefinitionDOs, - BpmProcessDefinitionExtDO::getProcessDefinitionId); - - // 获得 Form Map - Set formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId); - Map formMap = formService.getFormMap(formIds); - - // 拼接结果 - long definitionCount = definitionQuery.count(); - return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap, - processDefinitionDOMap, formMap), definitionCount); - } - - @Override - public List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) { - // 拼接查询æ¡ä»¶ - ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), listReqVO.getSuspensionState())) { - definitionQuery.suspended(); - } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), listReqVO.getSuspensionState())) { - definitionQuery.active(); - } - // 执行查询 - List processDefinitions = definitionQuery.list(); - if (CollUtil.isEmpty(processDefinitions)) { - return Collections.emptyList(); - } - - // 获得 BpmProcessDefinitionDO Map - List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( - convertList(processDefinitions, ProcessDefinition::getId)); - Map processDefinitionDOMap = convertMap(processDefinitionDOs, - BpmProcessDefinitionExtDO::getProcessDefinitionId); - // 执行查询,并返回 - return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap); - } - - @Override - public String getProcessDefinitionBpmnXML(String id) { - BpmnModel bpmnModel = repositoryService.getBpmnModel(id); - if (bpmnModel == null) { - return null; - } - return ActivitiUtils.getBpmnXml(bpmnModel); - } - - @Override - public BpmnModel getBpmnModel(String processDefinitionId) { - return repositoryService.getBpmnModel(processDefinitionId); - } - - @Override - public ProcessDefinition getProcessDefinition(String id) { - return repositoryService.getProcessDefinition(id); - } - - @Override - public ProcessDefinition getProcessDefinition2(String id) { - return repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); - } - - @Override - public ProcessDefinition getActiveProcessDefinition(String key) { - return repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).active().singleResult(); - } - - @Override - public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) { - return processDefinitionMapper.selectByProcessDefinitionId(id); - } - - @Override - public Deployment getDeployment(String id) { - if (StrUtil.isEmpty(id)) { - return null; - } - return repositoryService.createDeploymentQuery().deploymentId(id).singleResult(); - } - - @Override - public List getDeployments(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 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 boolean isProcessDefinitionEquals(BpmProcessDefinitionCreateReqDTO createReqDTO) { - // 校验 nameã€description 是å¦æ›´æ–° - ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey()); - if (oldProcessDefinition == null) { - return false; - } - BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId()); - if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName()) - || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription()) - || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) { - return false; - } - // 校验 form ä¿¡æ¯æ˜¯å¦æ›´æ–° - if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType()) - || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId()) - || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf()) - || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields()) - || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath()) - || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) { - return false; - } - // 校验 BPMN XML ä¿¡æ¯ - BpmnModel newModel = ActivitiUtils.buildBpmnModel(createReqDTO.getBpmnBytes()); - BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId()); - if (!ActivitiUtils.equals(oldModel, newModel)) { - return false; - } - // 最终å‘现都一致,则返回 true - return true; - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti æ“作,所以开å¯äº‹åŠ¡ - public String createProcessDefinition(BpmProcessDefinitionCreateReqDTO createReqDTO) { - // 创建 Deployment 部署 - Deployment deploy = repositoryService.createDeployment() - .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) - .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) - .deploy(); - - // 设置 ProcessDefinition çš„ category 分类 - ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), createReqDTO.getCategory()); - // æ³¨æ„ 1,ProcessDefinition çš„ key å’Œ name 是通过 BPMN 中的 çš„ id å’Œ name 决定 - // æ³¨æ„ 2,目å‰è¯¥é¡¹ç›®çš„设计上,需è¦ä¿è¯ Modelã€Deploymentã€ProcessDefinition 使用相åŒçš„ key,ä¿è¯å…³è”性。 - // å¦åˆ™ï¼Œä¼šå¯¼è‡´ ProcessDefinition 的分页无法查询到。 - if (!Objects.equals(definition.getKey(), createReqDTO.getKey())) { - throw exception(PROCESS_DEFINITION_KEY_NOT_MATCH, createReqDTO.getKey(), definition.getKey()); - } - if (!Objects.equals(definition.getName(), createReqDTO.getName())) { - throw exception(PROCESS_DEFINITION_NAME_NOT_MATCH, createReqDTO.getName(), definition.getName()); - } - - // æ’入拓展表 - BpmProcessDefinitionExtDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO) - .setProcessDefinitionId(definition.getId()); - processDefinitionMapper.insert(definitionDO); - return definition.getId(); - } - - @Override - public void updateProcessDefinitionState(String id, Integer state) { - // 激活 - if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { - repositoryService.activateProcessDefinitionById(id, false, null); - return; - } - // 挂起 - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { - // suspendProcessInstances = false,进行中的任务,ä¸è¿›è¡ŒæŒ‚起。 - // 原因:åªè¦æ–°çš„æµç¨‹ä¸å…许å‘èµ·å³å¯ï¼Œè€æµç¨‹ç»§ç»­å¯ä»¥æ‰§è¡Œã€‚ - repositoryService.suspendProcessDefinitionById(id, false, null); - return; - } - log.error("[updateProcessDefinitionState][æµç¨‹å®šä¹‰({}) 修改未知状æ€({})]", id, state); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java deleted file mode 100644 index 079451597..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import org.springframework.lang.Nullable; - -import javax.validation.Valid; -import java.util.List; - -/** - * BPM 任务分é…规则 Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmTaskAssignRuleService { - - /** - * 获得æµç¨‹å®šä¹‰çš„任务分é…规则数组 - * - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @param taskDefinitionKey æµç¨‹ä»»åŠ¡å®šä¹‰çš„ Key。å…许空 - * @return 任务规则数组 - */ - List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, - @Nullable String taskDefinitionKey); - - /** - * 获得æµç¨‹æ¨¡åž‹çš„任务规则数组 - * - * @param modelId æµç¨‹æ¨¡åž‹çš„ç¼–å· - * @return 任务规则数组 - */ - List getTaskAssignRuleListByModelId(String modelId); - - /** - * 获得æµç¨‹å®šä¹‰çš„任务分é…规则数组 - * - * @param modelId æµç¨‹æ¨¡åž‹çš„ç¼–å· - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @return 任务规则数组 - */ - List getTaskAssignRuleList(String modelId, String processDefinitionId); - - /** - * 创建任务分é…规则 - * - * @param reqVO åˆ›å»ºä¿¡æ¯ - * @return è§„åˆ™ç¼–å· - */ - Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO); - - /** - * 更新任务分é…规则 - * - * @param reqVO åˆ›å»ºä¿¡æ¯ - */ - void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO); - - /** - * 判断指定æµç¨‹æ¨¡åž‹å’Œæµç¨‹å®šä¹‰çš„分é…规则是å¦ç›¸ç­‰ - * - * @param modelId æµç¨‹æ¨¡åž‹ç¼–å· - * @param processDefinitionId æµç¨‹å®šä¹‰ç¼–å· - * @return 是å¦ç›¸ç­‰ - */ - boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId); - - /** - * å°†æµç¨‹æµç¨‹æ¨¡åž‹çš„任务分é…规则,å¤åˆ¶ä¸€ä»½ç»™æµç¨‹å®šä¹‰ - * 目的:æ¯æ¬¡æµç¨‹æ¨¡åž‹éƒ¨ç½²æ—¶ï¼Œéƒ½ä¼šç”Ÿæˆä¸€ä¸ªæ–°çš„æµç¨‹å®šä¹‰ï¼Œæ­¤æ—¶è€ƒè™‘到æ¯æ¬¡éƒ¨ç½²çš„æµç¨‹ä¸å¯å˜æ€§ï¼Œæ‰€ä»¥éœ€è¦å¤åˆ¶ä¸€ä»½ç»™è¯¥æµç¨‹å®šä¹‰ - * - * @param fromModelId æµç¨‹æ¨¡åž‹ç¼–å· - * @param toProcessDefinitionId æµç¨‹å®šä¹‰ç¼–å· - */ - void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId); - - /** - * 校验æµç¨‹æ¨¡åž‹çš„任务分é…规则全部都é…置了 - * 目的:如果有规则未é…置,会导致æµç¨‹ä»»åŠ¡æ‰¾ä¸åˆ°è´Ÿè´£äººï¼Œè¿›è€Œæµç¨‹æ— æ³•è¿›è¡Œä¸‹åŽ»ï¼ - * - * @param id æµç¨‹æ¨¡åž‹ç¼–å· - */ - void checkTaskAssignRuleAllConfig(String id); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java deleted file mode 100644 index 93eedb514..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java +++ /dev/null @@ -1,211 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmTaskAssignRuleConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; -import cn.iocoder.yudao.module.bpm.enums.DictTypeConstants; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.PostApi; -import cn.iocoder.yudao.module.system.api.dict.DictDataApi; -import cn.iocoder.yudao.module.system.api.permission.RoleApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import lombok.extern.slf4j.Slf4j; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.bpmn.model.UserTask; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * BPM 任务分é…规则 Service 实现类 - */ -@Service -@Validated -@Slf4j -public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { - - @Resource - private BpmTaskAssignRuleMapper taskRuleMapper; - - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmModelService modelService; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmUserGroupService userGroupService; - @Resource - private RoleApi roleApi; - @Resource - private DeptApi deptApi; - @Resource - private PostApi postApi; - @Resource - private AdminUserApi adminUserApi; - @Resource - private DictDataApi dictDataApi; - - @Override - public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, - String taskDefinitionKey) { - return taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, taskDefinitionKey); - } - - @Override - public List getTaskAssignRuleListByModelId(String modelId) { - return taskRuleMapper.selectListByModelId(modelId); - } - - @Override - public List getTaskAssignRuleList(String modelId, String processDefinitionId) { - // 获得规则 - List rules = Collections.emptyList(); - BpmnModel model = null; - if (StrUtil.isNotEmpty(modelId)) { - rules = getTaskAssignRuleListByModelId(modelId); - model = modelService.getBpmnModel(modelId); - } else if (StrUtil.isNotEmpty(processDefinitionId)) { - rules = getTaskAssignRuleListByProcessDefinitionId(processDefinitionId, null); - model = processDefinitionService.getBpmnModel(processDefinitionId); - } - if (model == null) { - return Collections.emptyList(); - } - - // 获得用户任务,åªæœ‰ç”¨æˆ·ä»»åŠ¡æ‰å¯ä»¥è®¾ç½®åˆ†é…规则 - List userTasks = ActivitiUtils.getBpmnModelElements(model, UserTask.class); - if (CollUtil.isEmpty(userTasks)) { - return Collections.emptyList(); - } - - // 转æ¢æ•°æ® - return BpmTaskAssignRuleConvert.INSTANCE.convertList(userTasks, rules); - } - - @Override - public Long createTaskAssignRule(BpmTaskAssignRuleCreateReqVO reqVO) { - // 校验å‚æ•° - validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); - // 校验是å¦å·²ç»é…ç½® - BpmTaskAssignRuleDO existRule = taskRuleMapper.selectListByModelIdAndTaskDefinitionKey( - reqVO.getModelId(), reqVO.getTaskDefinitionKey()); - if (existRule != null) { - throw exception(TASK_ASSIGN_RULE_EXISTS, reqVO.getModelId(), reqVO.getTaskDefinitionKey()); - } - - // 存储 - BpmTaskAssignRuleDO rule = BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO) - .setProcessDefinitionId(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL); // åªæœ‰æµç¨‹æ¨¡åž‹ï¼Œæ‰å…许新建 - taskRuleMapper.insert(rule); - return rule.getId(); - } - - @Override - public void updateTaskAssignRule(BpmTaskAssignRuleUpdateReqVO reqVO) { - // 校验å‚æ•° - validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); - // 校验是å¦å­˜åœ¨ - BpmTaskAssignRuleDO existRule = taskRuleMapper.selectById(reqVO.getId()); - if (existRule == null) { - throw exception(TASK_ASSIGN_RULE_NOT_EXISTS); - } - // åªå…许修改æµç¨‹æ¨¡åž‹çš„规则 - if (!Objects.equals(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL, existRule.getProcessDefinitionId())) { - throw exception(TASK_UPDATE_FAIL_NOT_MODEL); - } - - // 执行更新 - taskRuleMapper.updateById(BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO)); - } - - @Override - public boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId) { - // 调用 VO 接å£çš„原因是,过滤掉æµç¨‹æ¨¡åž‹ä¸éœ€è¦çš„规则,ä¿æŒå’Œ copyTaskAssignRules 方法的一致性 - List modelRules = getTaskAssignRuleList(modelId, null); - List processInstanceRules = getTaskAssignRuleList(null, processDefinitionId); - if (modelRules.size() != processInstanceRules.size()) { - return false; - } - - // é历,匹é…对应的规则 - Map processInstanceRuleMap = CollectionUtils.convertMap(processInstanceRules, - BpmTaskAssignRuleRespVO::getTaskDefinitionKey); - for (BpmTaskAssignRuleRespVO modelRule : modelRules) { - BpmTaskAssignRuleRespVO processInstanceRule = processInstanceRuleMap.get(modelRule.getTaskDefinitionKey()); - if (processInstanceRule == null) { - return false; - } - if (!ObjectUtil.equals(modelRule.getType(), processInstanceRule.getType()) - || !ObjectUtil.equal(modelRule.getOptions(), processInstanceRule.getOptions())) { - return false; - } - } - return true; - } - - @Override - public void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId) { - List rules = getTaskAssignRuleList(fromModelId, null); - if (CollUtil.isEmpty(rules)) { - return; - } - // 开始å¤åˆ¶ - List newRules = BpmTaskAssignRuleConvert.INSTANCE.convertList2(rules); - newRules.forEach(rule -> rule.setProcessDefinitionId(toProcessDefinitionId).setId(null) - .setCreateTime(null).setUpdateTime(null)); - taskRuleMapper.insertBatch(newRules); - } - - @Override - public void checkTaskAssignRuleAllConfig(String id) { - // 一个用户任务都没é…置,所以无需é…置规则 - List taskAssignRules = getTaskAssignRuleList(id, null); - if (CollUtil.isEmpty(taskAssignRules)) { - return; - } - // 校验未é…置规则的任务 - taskAssignRules.forEach(rule -> { - if (CollUtil.isEmpty(rule.getOptions())) { - throw exception(MODEL_DEPLOY_FAIL_TASK_ASSIGN_RULE_NOT_CONFIG, rule.getTaskDefinitionName()); - } - }); - } - - private void validTaskAssignRuleOptions(Integer type, Set options) { - if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.ROLE.getType())) { - roleApi.validRoles(options); - } else if (ObjectUtils.equalsAny(type, BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), - BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { - deptApi.validDepts(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { - postApi.validPosts(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { - adminUserApi.validUsers(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { - userGroupService.validUserGroups(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { - dictDataApi.validDictDatas(DictTypeConstants.TASK_ASSIGN_SCRIPT, - CollectionUtils.convertSet(options, String::valueOf)); - } else { - throw new IllegalArgumentException(StrUtil.format("未知的规则类型({})", type)); - } - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java deleted file mode 100644 index e7c28648a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; - -import java.util.List; - -/** - * BPM 活动实例 Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmActivityService { - - /** - * 获得指定æµç¨‹å®žä¾‹çš„活动实例列表 - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 活动实例列表 - */ - List getActivityListByProcessInstanceId(String processInstanceId); - - /** - * 生æˆæŒ‡å®šæµç¨‹å®žä¾‹çš„高亮æµç¨‹å›¾ï¼Œåªé«˜äº®è¿›è¡Œä¸­çš„任务 - * - * å‹æƒ…æ示,éžè¯¥æ–¹æ³•çš„注释。如果想实现更高级的高亮æµç¨‹å›¾ï¼ˆå½“å‰èŠ‚点红色 + 完æˆèŠ‚点为绿色),å¯å‚考如下内容: - * åšå®¢ä¸€ï¼šhttps://blog.csdn.net/qq_40109075/article/details/110939639 - * åšå®¢äºŒï¼šhttps://gitee.com/tony2y/RuoYi-flowable/blob/master/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramGenerator.java - * 这里ä¸å®žçŽ°çš„原ç†ï¼Œéœ€è¦è‡ªå®šä¹‰å®žçŽ° ProcessDiagramGenerator å’Œ ProcessDiagramCanvas,代ç é‡æœ‰ç‚¹å¤§ - * - * 如果你想实现高亮已完æˆçš„任务,å¯å‚考 https://blog.csdn.net/qiuxinfa123/article/details/119579863 åšå®¢ã€‚ä¸è¿‡æµ‹è¯•ä¸‹æ¥ï¼Œè²Œä¼¼ä¸å¤ªå¯¹~ - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 图的字节数组 - */ - byte[] generateHighlightDiagram(String processInstanceId); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java deleted file mode 100644 index 2db1dc3e5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import lombok.extern.slf4j.Slf4j; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.engine.HistoryService; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.task.Task; -import org.activiti.image.ProcessDiagramGenerator; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.io.InputStream; -import java.util.Collections; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * BPM 活动实例 Service 实现类 - * - * @author 芋é“æºç  - */ -@Service -@Slf4j -@Validated -public class BpmActivityServiceImpl implements BpmActivityService { - - private static final String FONT_NAME = "宋体"; - - @Resource - private ProcessDiagramGenerator processDiagramGenerator; - @Resource - private HistoryService historyService; - - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmTaskService taskService; - - @Override - public List getActivityListByProcessInstanceId(String processInstanceId) { - List activityList = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId).list(); - return BpmActivityConvert.INSTANCE.convertList(activityList); - } - - @Override - public byte[] generateHighlightDiagram(String processInstanceId) { - // 获得æµç¨‹å®žä¾‹ - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); - if (processInstance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - // 获得æµç¨‹å®šä¹‰çš„ BPMN 模型 - BpmnModel bpmnModel = processDefinitionService.getBpmnModel(processInstance.getProcessDefinitionId()); - if (bpmnModel == null) { - throw exception(PROCESS_DEFINITION_BPMN_MODEL_NOT_EXISTS); - } - - // 如果æµç¨‹å·²ç»ç»“æŸï¼Œåˆ™æ— è¿›è¡Œä¸­çš„任务,无法高亮 - // 如果æµç¨‹æœªç»“æŸï¼Œæ‰éœ€è¦é«˜äº® - List highLightedActivities = Collections.emptyList(); - if (processInstance.getEndTime() == null) { - List tasks = taskService.getTasksByProcessInstanceId(processInstanceId); - highLightedActivities = CollectionUtils.convertList(tasks, Task::getTaskDefinitionKey); - } - - // 生æˆé«˜äº®æµç¨‹å›¾ - InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, Collections.emptyList(), - FONT_NAME, FONT_NAME, FONT_NAME); - return IoUtil.readBytes(inputStream); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java deleted file mode 100644 index 2e9145f3a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.runtime.ProcessInstance; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * æµç¨‹å®žä¾‹ Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmProcessInstanceService { - - /** - * 创建æµç¨‹å®žä¾‹ï¼ˆæ供给å‰ç«¯ï¼‰ - * - * @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 cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO); - - /** - * 删除æµç¨‹å®žä¾‹ - * - * @param id æµç¨‹ç¼–å· - * @param reason 删除原因。å¯é€‰ {@link BpmProcessInstanceDeleteReasonEnum} - */ - @Deprecated - void deleteProcessInstance(String id, String reason); - - /** - * 获得æµç¨‹å®žä¾‹çš„分页 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹å®žä¾‹çš„分页 - */ - PageResult getMyProcessInstancePage(Long userId, - @Valid BpmProcessInstanceMyPageReqVO pageReqVO); - - /** - * 获得æµç¨‹å®žä¾‹ VO ä¿¡æ¯ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹å®žä¾‹ - */ - BpmProcessInstanceRespVO getProcessInstanceVO(String id); - - /** - * 获得æµç¨‹å®žä¾‹ - * - * @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 CollectionUtils.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 CollectionUtils.convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); - } - - /** - * 创建 ProcessInstance 拓展记录 - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void createProcessInstanceExt(org.activiti.api.process.model.ProcessInstance instance); - - /** - * æ›´æ–° ProcessInstance 拓展记录 - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void updateProcessInstanceExt(org.activiti.api.process.model.ProcessInstance instance); - - /** - * æ›´æ–° ProcessInstance 拓展记录为å–消 - * - * @param instance æµç¨‹ä»»åŠ¡ - * @param reason å–消原因 - */ - void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance, String reason); - - /** - * æ›´æ–° ProcessInstance æ‹“å±•è®°å½•ä¸ºå®Œæˆ - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance); - - /** - * æ›´æ–° ProcessInstance 拓展记录为ä¸é€šè¿‡ - * - * @param id æµç¨‹ç¼–å· - * @param reason ç†ç”±ã€‚例如说,审批ä¸é€šè¿‡æ—¶ï¼Œéœ€è¦ä¼ é€’该值 - */ - void updateProcessInstanceExtReject(String id, String reason); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java deleted file mode 100644 index 50dfc8d02..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ /dev/null @@ -1,310 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import lombok.extern.slf4j.Slf4j; -import org.activiti.engine.HistoryService; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Task; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * æµç¨‹å®žä¾‹ Service 实现类 - * - * ProcessDefinition & ProcessInstance & Execution & Task 的关系: - * 1. https://blog.csdn.net/bobozai86/article/details/105210414 - * - * HistoricProcessInstance & ProcessInstance 的关系: - * 1.https://my.oschina.net/843294669/blog/719024 - * 简å•æ¥è¯´ï¼Œå‰è€… = åŽ†å² + è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ï¼ŒåŽè€…仅是è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ - * - * @author 芋é“æºç  - */ -@Service -@Validated -@Slf4j -public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { - - @Resource - private RuntimeService runtimeService; - @Resource - private HistoryService historyService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmTaskService taskService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmMessageService messageService; - - @Resource - private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; - - @Resource - private BpmProcessInstanceExtMapper processInstanceExtMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqVO createReqVO) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); - // å‘èµ·æµç¨‹ - return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); - } - - @Override - public String createProcessInstance(Long userId, BpmProcessInstanceCreateReqDTO createReqDTO) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); - // å‘èµ·æµç¨‹ - return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); - } - - private String createProcessInstance0(Long userId, ProcessDefinition definition, - Map variables, String businessKey) { - // 校验æµç¨‹å®šä¹‰ - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - if (definition.isSuspended()) { - throw exception(PROCESS_DEFINITION_IS_SUSPENDED); - } - - // 创建æµç¨‹å®žä¾‹ - ProcessInstance instance = runtimeService.startProcessInstanceById(definition.getId(), businessKey, variables); - // 设置æµç¨‹åå­— - runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); - - // 补全æµç¨‹å®žä¾‹çš„拓展表 - processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) - .setFormVariables(variables)); - - // 添加åˆå§‹çš„评论 TODO 芋艿:在æ€è€ƒä¸‹ -// Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); -// if (task != null) { -// SysUserDO user = userService.getUser(userId); -// Assert.notNull(user, "用户({})ä¸å­˜åœ¨", userId); -// String type = "normal"; -// taskService.addComment(task.getId(), instance.getProcessInstanceId(), type, -// String.format("%s å‘èµ·æµç¨‹ç”³è¯·", user.getNickname())); -// } - return instance.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelProcessInstance(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) { - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); - } - // åªèƒ½å–消自己的 - if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); - } - - // 通过删除æµç¨‹å®žä¾‹ï¼Œå®žçŽ°æµç¨‹å®žä¾‹çš„å–消 - runtimeService.deleteProcessInstance(cancelReqVO.getId(), - BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); - } - - @Override - public void deleteProcessInstance(String id, String reason) { - runtimeService.deleteProcessInstance(id, reason); - } - - @Override - public PageResult getMyProcessInstancePage(Long userId, - BpmProcessInstanceMyPageReqVO pageReqVO) { - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 - PageResult pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return new PageResult<>(pageResult.getTotal()); - } - - // 获得æµç¨‹ Task Map - List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); - Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); - // 转æ¢è¿”回 - return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); - } - - @Override - public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { - // 获得æµç¨‹å®žä¾‹ - HistoricProcessInstance processInstance = getHistoricProcessInstance(id); - if (processInstance == null) { - return null; - } - BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); - Assert.notNull(processInstanceExt, "æµç¨‹å®žä¾‹æ‹“展({}) ä¸å­˜åœ¨", id); - - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - processInstance.getProcessDefinitionId()); - Assert.notNull(processDefinition, "æµç¨‹å®šä¹‰({}) ä¸å­˜åœ¨", processInstance.getProcessDefinitionId()); - BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( - processInstance.getProcessDefinitionId()); - Assert.notNull(processDefinitionExt, "æµç¨‹å®šä¹‰æ‹“展({}) ä¸å­˜åœ¨", id); - String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); - - // 获得 User - AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); - DeptRespDTO dept = null; - if (startUser != null) { - dept = deptApi.getDept(startUser.getDeptId()); - } - - // 拼接结果 - return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, - processDefinition, processDefinitionExt, bpmnXml, startUser, dept); - } - - @Override - public List getProcessInstances(Set ids) { - return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); - } - - @Override - public ProcessInstance getProcessInstance(String id) { - return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); - } - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 历å²çš„æµç¨‹å®žä¾‹ - */ - @Override - public HistoricProcessInstance getHistoricProcessInstance(String id) { - return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); - } - - @Override - public List getHistoricProcessInstances(Set ids) { - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); - } - - @Override - public void createProcessInstanceExt(org.activiti.api.process.model.ProcessInstance instance) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); - // æ’å…¥ BpmProcessInstanceExtDO 对象 - BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) - .setCategory(definition.getCategory()) - .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - processInstanceExtMapper.insert(instanceExtDO); - } - - @Override - public void updateProcessInstanceExt(org.activiti.api.process.model.ProcessInstance instance) { - BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance); - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - } - - @Override - public void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance, String reason) { - // 判断是å¦ä¸º Reject ä¸é€šè¿‡ã€‚如果是,则ä¸è¿›è¡Œæ›´æ–° - if (BpmProcessInstanceDeleteReasonEnum.isRejectReason(reason)) { - return; - } - - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - // å¦å¤–,此时如果去查询 ProcessInstance çš„è¯ï¼Œå­—段是ä¸å…¨çš„,所以去查询了 HistoricProcessInstance - HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); - // 更新拓展表 - BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) - .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - - @Override - public void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance) { - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - // å¦å¤–,此时如果去查询 ProcessInstance çš„è¯ï¼Œå­—段是ä¸å…¨çš„,所以去查询了 HistoricProcessInstance - HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); - // 更新拓展表 - BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) - .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹è¢«é€šè¿‡çš„æ¶ˆæ¯ - messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2(instance)); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - - @Transactional(rollbackFor = Exception.class) - public void updateProcessInstanceExtReject(String id, String reason) { - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - ProcessInstance processInstance = getProcessInstance(id); - // 删除æµç¨‹å®žä¾‹ï¼Œä»¥å®žçŽ°é©³å›žä»»åŠ¡æ—¶ï¼Œå–消整个审批æµç¨‹ - deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); - - // æ›´æ–° status + result - // 注æ„,ä¸èƒ½å’Œä¸Šé¢çš„逻辑更æ¢ä½ç½®ã€‚因为 deleteProcessInstance 会触å‘æµç¨‹çš„å–消,进而调用 updateProcessInstanceExtCancel 方法, - // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result ä¸ä¸€å®šæ˜¯ä¸€è‡´çš„ - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹è¢«ä¸é€šè¿‡çš„æ¶ˆæ¯ - messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert(processInstance, reason)); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java deleted file mode 100644 index 025ee461f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ /dev/null @@ -1,159 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.activiti.engine.task.Task; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service æŽ¥å£ - * - * @author jason - * @author 芋é“æºç  - */ -public interface BpmTaskService { - - /** - * 获得指定æµç¨‹å®žä¾‹çš„ Running 进行中的æµç¨‹ä»»åŠ¡åˆ—表 - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - */ - List getRunningTaskListByProcessInstanceId(String processInstanceId); - - /** - * 获得指令æµç¨‹å®žä¾‹çš„æµç¨‹ä»»åŠ¡åˆ—表,包括所有状æ€çš„ - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹ä»»åŠ¡åˆ—表 - */ - List getTaskListByProcessInstanceId(String processInstanceId); - - /** - * 获得æµç¨‹ä»»åŠ¡åˆ—表 - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹ä»»åŠ¡åˆ—表 - */ - List getTasksByProcessInstanceId(String processInstanceId); - - /** - * 获得æµç¨‹ä»»åŠ¡åˆ—表 - * - * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ - * @return æµç¨‹ä»»åŠ¡åˆ—表 - */ - List getTasksByProcessInstanceIds(List processInstanceIds); - - /** - * 获得æµç¨‹ä»»åŠ¡ Map - * - * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ - * @return æµç¨‹ä»»åŠ¡ Map - */ - default Map> getTaskMapByProcessInstanceIds(List processInstanceIds) { - return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds), - Task::getProcessInstanceId); - } - - /** - * 获得待办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO); - - /** - * 获得已办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO); - - /** - * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 分é…请求 - */ - void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO); - - /** - * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 - * - * @param id æµç¨‹ä»»åŠ¡ç¼–å· - * @param userId ç”¨æˆ·ç¼–å· - */ - void updateTaskAssignee(String id, Long userId); - - /** - * 通过任务 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 通过请求 - */ - void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); - - /** - * ä¸é€šè¿‡ä»»åŠ¡ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO ä¸é€šè¿‡è¯·æ±‚ - */ - void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); - - // ========== Task 拓展表相关 ========== - - /** - * 创建 Task 拓展记录 - * - * @param task 任务实体 - */ - void createTaskExt(org.activiti.api.task.model.Task task); - - /** - * æ›´æ–° Task 拓展记录 - * - * @param task 任务实体 - */ - void updateTaskExt(org.activiti.api.task.model.Task task); - - /** - * æ›´æ–° Task 拓展记录,并å‘é€é€šçŸ¥ - * - * @param task 任务实体 - */ - void updateTaskExtAssign(org.activiti.api.task.model.Task task); - - /** - * æ›´æ–° Task 拓展记录为å–消 - * - * @param task 任务实体 - */ - void updateTaskExtCancel(org.activiti.api.task.model.Task task); - - /** - * æ›´æ–° Task æ‹“å±•è®°å½•ä¸ºå®Œæˆ - * - * @param task 任务实体 - */ - void updateTaskExtComplete(org.activiti.api.task.model.Task task); - - /** - * 获得æµç¨‹å®žä¾‹å¯¹åº”çš„ Task 拓展列表 - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return Task 拓展列表 - */ - List getTaskExtListByProcessInstanceId(String processInstanceId); - - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java deleted file mode 100644 index bfa71a4e2..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ /dev/null @@ -1,319 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; - -import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import lombok.extern.slf4j.Slf4j; -import org.activiti.engine.HistoryService; -import org.activiti.engine.TaskService; -import org.activiti.engine.history.HistoricProcessInstance; -import org.activiti.engine.history.HistoricTaskInstance; -import org.activiti.engine.history.HistoricTaskInstanceQuery; -import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.Task; -import org.activiti.engine.task.TaskQuery; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service 实现类 - * - * @author jason - * @author 芋é“æºç  - */ -@Slf4j -@Service -public class BpmTaskServiceImpl implements BpmTaskService { - - @Resource - private TaskService taskService; - @Resource - private HistoryService historyService; - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessInstanceService processInstanceService; - @Resource - private BpmMessageService messageService; - - @Resource - private BpmTaskExtMapper taskExtMapper; - - @Override - public List getRunningTaskListByProcessInstanceId(String processInstanceId) { - return taskService.createTaskQuery().processInstanceId(processInstanceId).list(); - } - - @Override - public List getTaskListByProcessInstanceId(String processInstanceId) { - // 获得任务列表 - List tasks = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricTaskInstanceStartTime().desc() // åˆ›å»ºæ—¶é—´å€’åº - .list(); - if (CollUtil.isEmpty(tasks)) { - return Collections.emptyList(); - } - - // 获得 TaskExtDO Map - List bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); - Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); - // 获得 ProcessInstance Map - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); - // 获得 User Map - Set userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee())); - userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); - Map userMap = adminUserApi.getUserMap(userIds); - // 获得 Dept Map - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); - - // æ‹¼æŽ¥æ•°æ® - return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); - } - - @Override - public List getTasksByProcessInstanceId(String processInstanceId) { - if (StrUtil.isEmpty(processInstanceId)) { - return Collections.emptyList(); - } - return taskService.createTaskQuery().processInstanceId(processInstanceId).list(); - } - - @Override - public List getTasksByProcessInstanceIds(List processInstanceIds) { - if (CollUtil.isEmpty(processInstanceIds)) { - return Collections.emptyList(); - } - return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list(); - } - - @Override - public PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { - // 查询待办任务 - TaskQuery taskQuery = taskService.createTaskQuery() - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .orderByTaskCreateTime().desc(); // åˆ›å»ºæ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (pageVO.getBeginCreateTime() != null) { - taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime()); - } - if (pageVO.getEndCreateTime() != null) { - taskQuery.taskCreatedBefore(pageVO.getEndCreateTime()); - } - // 执行查询 - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - if (CollUtil.isEmpty(tasks)) { - return PageResult.empty(taskQuery.count()); - } - - // 获得 ProcessInstance Map - Map processInstanceMap = processInstanceService.getProcessInstanceMap( - convertSet(tasks, Task::getProcessInstanceId)); - // 获得 User Map - Map userMap = adminUserApi.getUserMap( - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - // 拼接结果 - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), - taskQuery.count()); - } - - @Override - public PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { - // 查询已办任务 - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() - .finished() // å·²å®Œæˆ - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .orderByHistoricTaskInstanceEndTime().desc(); // å®¡æ‰¹æ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (pageVO.getBeginCreateTime() != null) { - taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime()); - } - if (pageVO.getEndCreateTime() != null) { - taskQuery.taskCreatedBefore(pageVO.getEndCreateTime()); - } - // 执行查询 - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - if (CollUtil.isEmpty(tasks)) { - return PageResult.empty(taskQuery.count()); - } - - // 获得 TaskExtDO Map - List bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); - Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); - // 获得 ProcessInstance Map - Map historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( - convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); - // 获得 User Map - Map userMap = adminUserApi.getUserMap( - convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - // 拼接结果 - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), - taskQuery.count()); - } - - @Override - public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) { - // 校验任务存在 - Task task = getTask(reqVO.getId()); - if (task == null) { - throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); - } - if (!ActivitiUtils.equals(task.getAssignee(), userId)) { - throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); - } - - // 更新负责人 - updateTaskAssignee(task.getId(), reqVO.getAssigneeUserId()); - } - - @Override - public void updateTaskAssignee(String id, Long userId) { - taskService.setAssignee(id, String.valueOf(userId)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void approveTask(Long userId, BpmTaskApproveReqVO reqVO) { - // 校验任务存在 - Task task = getTask(reqVO.getId()); - if (task == null) { - throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); - } - if (!ActivitiUtils.equals(task.getAssignee(), userId)) { - throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); - } - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - - // 完æˆä»»åŠ¡ï¼Œå®¡æ‰¹é€šè¿‡ - taskService.complete(task.getId(), instance.getProcessVariables()); // TODO 芋艿:variables 的选择 - // 更新任务拓展表为通过 - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()).setReason(reqVO.getReason())); - - // TODO 芋艿:添加评论 -// taskService.addComment(task.getId(), task.getProcessInstanceId(), reqVO.getComment()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { - // 校验任务存在 - Task task = getTask(reqVO.getId()); - if (task == null) { - throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); - } - if (!ActivitiUtils.equals(task.getAssignee(), userId)) { - throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); - } - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - - // æ›´æ–°æµç¨‹å®žä¾‹ä¸ºä¸é€šè¿‡ - processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getReason()); - - // 更新任务拓展表为ä¸é€šè¿‡ - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()).setReason(reqVO.getReason())); - - // TODO 芋艿:添加评论 -// taskService.addComment(task.getId(), task.getProcessInstanceId(), reqVO.getComment()); - } - - private Task getTask(String id) { - return taskService.createTaskQuery().taskId(id).singleResult(); - } - - // ========== Task 拓展表相关 ========== - - @Override - public void createTaskExt(org.activiti.api.task.model.Task task) { - // æ’å…¥ BpmTaskExtDO 记录 - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert(task) - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - taskExtMapper.insert(taskExtDO); - } - - @Override - public void updateTaskExt(org.activiti.api.task.model.Task task) { - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert(task); - taskExtMapper.updateByTaskId(taskExtDO); - } - - @Override - public void updateTaskExtAssign(org.activiti.api.task.model.Task task) { - // æ›´æ–° - updateTaskExt(task); - // å‘é€é€šçŸ¥ã€‚由于 Activiti æ“作是在事务æ交时,批é‡æ‰§è¡Œæ“作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监å¬äº‹åŠ¡çš„æ交æ¥å®žçŽ°ã€‚ - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public void afterCommit() { - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); - messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); - } - }); - } - - @Override - public void updateTaskExtCancel(org.activiti.api.task.model.Task task) { - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert(task) - .setEndTime(new Date()) // 由于 Task 里没有办法拿到 endTime,所以这里设置 - .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); - taskExtMapper.updateByTaskId(taskExtDO); - } - - @Override - public void updateTaskExtComplete(org.activiti.api.task.model.Task task) { - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert(task) - .setEndTime(new Date()) // 此时ä¸èƒ½ä½¿ç”¨ task çš„ completeData,因为还是空的。 - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); - taskExtMapper.updateByTaskId(taskExtDO); - } - - @Override - public List getTaskExtListByProcessInstanceId(String processInstanceId) { - return taskExtMapper.selectListByProcessInstanceId(processInstanceId); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java deleted file mode 100644 index 0ffb3a894..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * task 包下,存放的都是 xxx 实例。例如说: - * 1. ProcessInstance 是 ProcessDefinition 创建而æ¥çš„实例; - * 2. TaskInstance 是 TaskDefinition 创建而æ¥çš„实例; - * 3. ActivityInstance 是 BPMN æµç¨‹å›¾çš„æ¯ä¸ªå…ƒç´ åˆ›å»ºçš„实例; - * - * 考虑到 Task å’Œ Activity å¯ä»¥æ¯”较明确表示å字,所以对应的 Service 就没有使用 Instance åŽç¼€~ - * 嘿嘿,其实也是实现到比较åŽé¢çš„阶段,所以就暂时没去统一和修改了~ - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.service.task; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehaviorTest.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehaviorTest.java deleted file mode 100644 index dad383a59..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/BpmUserTaskActivityBehaviorTest.java +++ /dev/null @@ -1,214 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Collections.singleton; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -public class BpmUserTaskActivityBehaviorTest extends BaseMockitoUnitTest { - - @InjectMocks - private BpmUserTaskActivityBehavior behavior; - @Mock - private BpmTaskAssignRuleService bpmTaskRuleService; - @Mock - private BpmUserGroupService userGroupService; - - @Mock - private DeptApi deptApi; - @Mock - private AdminUserApi adminUserApi; - @Mock - private PermissionApi permissionApi; - - @Test - public void testCalculateTaskCandidateUsers_Role() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.ROLE.getType()); - // mock 方法 - when(permissionApi.getUserRoleIdListByRoleIds(eq(rule.getOptions()))) - .thenReturn(asSet(11L, 22L)); - mockGetUserMap(asSet(11L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 22L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_DeptMember() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType()); - // mock 方法 - List users = CollectionUtils.convertList(asSet(11L, 22L), - id -> new AdminUserRespDTO().setId(id)); - when(adminUserApi.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users); - mockGetUserMap(asSet(11L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 22L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_DeptLeader() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType()); - // mock 方法 - DeptRespDTO dept1 = randomPojo(DeptRespDTO.class, o -> o.setLeaderUserId(11L)); - DeptRespDTO dept2 = randomPojo(DeptRespDTO.class, o -> o.setLeaderUserId(22L)); - when(deptApi.getDepts(eq(rule.getOptions()))).thenReturn(Arrays.asList(dept1, dept2)); - mockGetUserMap(asSet(11L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 22L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_Post() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.POST.getType()); - // mock 方法 - List users = CollectionUtils.convertList(asSet(11L, 22L), - id -> new AdminUserRespDTO().setId(id)); - when(adminUserApi.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users); - mockGetUserMap(asSet(11L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 22L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_User() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.USER.getType()); - // mock 方法 - mockGetUserMap(asSet(1L, 2L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(1L, 2L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_UserGroup() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(1L, 2L)) - .setType(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType()); - // mock 方法 - BpmUserGroupDO userGroup1 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(11L, 12L))); - BpmUserGroupDO userGroup2 = randomPojo(BpmUserGroupDO.class, o -> o.setMemberUserIds(asSet(21L, 22L))); - when(userGroupService.getUserGroupList(eq(rule.getOptions()))).thenReturn(Arrays.asList(userGroup1, userGroup2)); - mockGetUserMap(asSet(11L, 12L, 21L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 12L, 21L, 22L), results); - } - - @Test - public void testCalculateTaskCandidateUsers_Script() { - // 准备å‚æ•° - BpmTaskAssignRuleDO rule = new BpmTaskAssignRuleDO().setOptions(asSet(20L, 21L)) - .setType(BpmTaskAssignRuleTypeEnum.SCRIPT.getType()); - // mock 方法 - BpmTaskAssignScript script1 = new BpmTaskAssignScript() { - - @Override - public Set calculateTaskCandidateUsers(TaskEntity task) { - return singleton(11L); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X1; - } - }; - BpmTaskAssignScript script2 = new BpmTaskAssignScript() { - - @Override - public Set calculateTaskCandidateUsers(TaskEntity task) { - return singleton(22L); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X2; - } - }; - behavior.setScripts(Arrays.asList(script1, script2)); - mockGetUserMap(asSet(11L, 22L)); - - // 调用 - Set results = behavior.calculateTaskCandidateUsers(null, rule); - // 断言 - assertEquals(asSet(11L, 22L), results); - } - - @Test - public void testRemoveDisableUsers() { - // 准备å‚æ•°. 1L å¯ä»¥æ‰¾åˆ°ï¼›2L 是ç¦ç”¨çš„ï¼›3L 找ä¸åˆ° - Set assigneeUserIds = asSet(1L, 2L, 3L); - // mock 方法 - AdminUserRespDTO user1 = randomPojo(AdminUserRespDTO.class, o -> o.setId(1L) - .setStatus(CommonStatusEnum.ENABLE.getStatus())); - AdminUserRespDTO user2 = randomPojo(AdminUserRespDTO.class, o -> o.setId(2L) - .setStatus(CommonStatusEnum.DISABLE.getStatus())); - Map userMap = MapUtil.builder(user1.getId(), user1) - .put(user2.getId(), user2).build(); - when(adminUserApi.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); - - // 调用 - behavior.removeDisableUsers(assigneeUserIds); - // 断言 - assertEquals(asSet(1L), assigneeUserIds); - } - - private void mockGetUserMap(Set assigneeUserIds) { - Map userMap = CollectionUtils.convertMap(assigneeUserIds, id -> id, - id -> new AdminUserRespDTO().setId(id).setStatus(CommonStatusEnum.ENABLE.getStatus())); - when(adminUserApi.getUserMap(eq(assigneeUserIds))).thenReturn(userMap); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java deleted file mode 100644 index d44c5c806..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/framework/activiti/core/behavior/script/impl/BpmTaskAssignLeaderX2ScriptTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.activiti.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl; -import org.activiti.engine.impl.persistence.entity.TaskEntity; -import org.activiti.engine.impl.persistence.entity.TaskEntityImpl; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.boot.test.mock.mockito.MockBean; - -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -class BpmTaskAssignLeaderX2ScriptTest extends BaseMockitoUnitTest { - - @InjectMocks - private BpmTaskAssignLeaderX2Script script; - - @Mock - private AdminUserApi adminUserApi; - @Mock - private DeptApi deptApi; - - @Test - public void testCalculateTaskCandidateUsers_noDept() { - // 准备å‚æ•° - TaskEntity task = buildTaskEntity(1L); - // mock 方法(startUser) - AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); - when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); - - // 调用 - Set result = script.calculateTaskCandidateUsers(task); - // 断言 - assertEquals(0, result.size()); - } - - @Test - public void testCalculateTaskCandidateUsers_noParentDept() { - // 准备å‚æ•° - TaskEntity task = buildTaskEntity(1L); - // mock 方法(startUser) - AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); - when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); - DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) - .setLeaderUserId(20L)); - when(deptApi.getDept(eq(10L))).thenReturn(startUserDept); - - // 调用 - Set result = script.calculateTaskCandidateUsers(task); - // 断言 - assertEquals(asSet(20L), result); - } - - @Test - public void testCalculateTaskCandidateUsers_existParentDept() { - // 准备å‚æ•° - TaskEntity task = buildTaskEntity(1L); - // mock 方法(startUser) - AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); - when(adminUserApi.getUser(eq(1L))).thenReturn(startUser); - DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) - .setLeaderUserId(20L)); - when(deptApi.getDept(eq(10L))).thenReturn(startUserDept); - // mock 方法(父 dept) - DeptRespDTO parentDept = randomPojo(DeptRespDTO.class, o -> o.setId(100L).setParentId(1000L) - .setLeaderUserId(200L)); - when(deptApi.getDept(eq(100L))).thenReturn(parentDept); - - // 调用 - Set result = script.calculateTaskCandidateUsers(task); - // 断言 - assertEquals(asSet(200L), result); - } - - @SuppressWarnings("SameParameterValue") - private TaskEntity buildTaskEntity(Long startUserId) { - TaskEntityImpl task = new TaskEntityImpl(); - task.setProcessInstance(new ExecutionEntityImpl()); - task.getProcessInstance().setStartUserId(String.valueOf(startUserId)); - return task; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java deleted file mode 100644 index bda0cb8ca..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/java/cn/iocoder/yudao/module/bpm/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/application-unit-test.yaml b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/application-unit-test.yaml deleted file mode 100644 index 60914d97f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -spring: - main: - lazy-initialization: true # å¼€å¯æ‡’加载,加快速度 - banner-mode: off # å•å…ƒæµ‹è¯•ï¼Œç¦ç”¨ Banner - ---- #################### æ•°æ®åº“相关é…ç½® #################### - -spring: - # æ•°æ®æºé…置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模å¼ï¼›DATABASE_TO_UPPER é…置表和字段使用å°å†™ - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # å•å…ƒæµ‹è¯•ï¼Œå¼‚æ­¥åˆå§‹åŒ– Druid 连接池,æå‡å¯åŠ¨é€Ÿåº¦ - initial-size: 1 # å•å…ƒæµ‹è¯•ï¼Œé…置为 1,æå‡å¯åŠ¨é€Ÿåº¦ - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis é…置。Redisson 默认的é…置足够使用,一般ä¸éœ€è¦è¿›è¡Œè°ƒä¼˜ - redis: - host: 127.0.0.1 # åœ°å€ - port: 16379 # 端å£ï¼ˆå•å…ƒæµ‹è¯•ï¼Œä½¿ç”¨ 16379 端å£ï¼‰ - database: 0 # æ•°æ®åº“索引 - -mybatis: - lazy-initialization: true # å•å…ƒæµ‹è¯•ï¼Œè®¾ç½® MyBatis Mapper 延迟加载,加速æ¯ä¸ªå•å…ƒæµ‹è¯• - ---- #################### 定时任务相关é…ç½® #################### - ---- #################### é…置中心相关é…ç½® #################### - ---- #################### æœåŠ¡ä¿éšœç›¸å…³é…ç½® #################### - -# Lock4j é…置项(å•å…ƒæµ‹è¯•ï¼Œç¦ç”¨ Lock4j) - -# Resilience4j é…置项 - ---- #################### 监控相关é…ç½® #################### - ---- #################### 芋é“相关é…ç½® #################### - -# 芋é“é…置项,设置当å‰é¡¹ç›®æ‰€æœ‰è‡ªå®šä¹‰çš„é…ç½® -yudao: - info: - base-package: cn.iocoder.yudao.module diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/logback.xml b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/logback.xml deleted file mode 100644 index daf756bff..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/clean.sql b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/clean.sql deleted file mode 100644 index e69de29bb..000000000 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/create_tables.sql b/yudao-module-bpm/yudao-module-bpm-biz-activiti/src/test/resources/sql/create_tables.sql deleted file mode 100644 index e69de29bb..000000000 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/pom.xml b/yudao-module-bpm/yudao-module-bpm-biz-flowable/pom.xml deleted file mode 100644 index 5eb41963a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - cn.iocoder.boot - yudao-module-bpm - ${revision} - - 4.0.0 - yudao-module-bpm-biz-flowable - jar - - ${project.artifactId} - - bpm-flowable 模å—,基于 Flowable 6 å®žçŽ°å·¥ä½œæµ - - - - - cn.iocoder.boot - yudao-module-bpm-base - ${revision} - - - - - cn.iocoder.boot - yudao-spring-boot-starter-flowable - - - - - cn.iocoder.boot - yudao-spring-boot-starter-test - test - - - - junit - junit - 4.11 - test - - - com.h2database - h2 - 1.4.196 - test - - - - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java deleted file mode 100644 index 2137e2203..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * bpm API 实现类,定义暴露给其它模å—çš„ API - */ -package cn.iocoder.yudao.module.bpm.api; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java deleted file mode 100644 index 596c9981a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.bpm.api.task; - -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; - -/** - * Flowable æµç¨‹å®žä¾‹ Api 实现类 - * - * @author 芋é“æºç  - * @author jason - */ -@Service -@Validated -public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { - - @Resource - private BpmProcessInstanceService processInstanceService; - - @Override - public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) { - return processInstanceService.createProcessInstance(userId, reqDTO); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java deleted file mode 100644 index 3dd0a0a4d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.io.IoUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import java.io.IOException; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹æ¨¡åž‹") -@RestController -@RequestMapping("/bpm/model") -@Validated -public class BpmModelController { - - @Resource - private BpmModelService modelService; - - @GetMapping("/page") - @ApiOperation(value = "获得模型分页") - public CommonResult> getModelPage(BpmModelPageReqVO pageVO) { - return success(modelService.getModelPage(pageVO)); - } - - @GetMapping("/get") - @ApiOperation("获得模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:query')") - public CommonResult getModel(@RequestParam("id") String id) { - BpmModelRespVO model = modelService.getModel(id); - return success(model); - } - - @PostMapping("/create") - @ApiOperation(value = "新建模型") - @PreAuthorize("@ss.hasPermission('bpm:model:create')") - public CommonResult createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) { - return success(modelService.createModel(createRetVO, null)); - } - - @PutMapping("/update") - @ApiOperation(value = "修改模型") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) { - modelService.updateModel(modelVO); - return success(true); - } - - @PostMapping("/import") - @ApiOperation(value = "导入模型") - @PreAuthorize("@ss.hasPermission('bpm:model:import')") - public CommonResult importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException { - BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO); - // 读å–文件 - String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false); - return success(modelService.createModel(createReqVO, bpmnXml)); - } - - @PostMapping("/deploy") - @ApiOperation(value = "部署模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:deploy')") - public CommonResult deployModel(@RequestParam("id") String id) { - modelService.deployModel(id); - return success(true); - } - - @PutMapping("/update-state") - @ApiOperation(value = "修改模型的状æ€", notes = "实际更新的部署的æµç¨‹å®šä¹‰çš„状æ€") - @PreAuthorize("@ss.hasPermission('bpm:model:update')") - public CommonResult updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) { - modelService.updateModelState(reqVO.getId(), reqVO.getState()); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除模型") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:model:delete')") - public CommonResult deleteModel(@RequestParam("id") String id) { - modelService.deleteModel(id); - return success(true); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java deleted file mode 100644 index ebcaad05b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -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 javax.annotation.Resource; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹å®šä¹‰") -@RestController -@RequestMapping("/bpm/process-definition") -@Validated -public class BpmProcessDefinitionController { - - @Resource - private BpmProcessDefinitionService bpmDefinitionService; - - @GetMapping("/page") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰åˆ†é¡µ") - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult> getProcessDefinitionPage( - BpmProcessDefinitionPageReqVO pageReqVO) { - return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO)); - } - - @GetMapping ("/list") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰åˆ—表") - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult> getProcessDefinitionList( - BpmProcessDefinitionListReqVO listReqVO) { - return success(bpmDefinitionService.getProcessDefinitionList(listReqVO)); - } - - @GetMapping ("/get-bpmn-xml") - @ApiOperation(value = "获得æµç¨‹å®šä¹‰çš„ BPMN XML") - @ApiImplicitParam(name = "id", value = "ç¼–å·", required = true, example = "1024", dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") - public CommonResult getProcessDefinitionBpmnXML(@RequestParam("id") String id) { - String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id); - return success(bpmnXML); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java deleted file mode 100644 index 3e946707a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmTaskAssignRuleController.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - 任务分é…规则") -@RestController -@RequestMapping("/bpm/task-assign-rule") -@Validated -public class BpmTaskAssignRuleController { - - @Resource - private BpmTaskAssignRuleService taskAssignRuleService; - - @GetMapping("/list") - @ApiOperation(value = "获得任务分é…规则列表") - @ApiImplicitParams({ - @ApiImplicitParam(name = "modelId", value = "模型编å·", example = "1024", dataTypeClass = String.class), - @ApiImplicitParam(name = "processDefinitionId", value = "æµç¨‹å®šä¹‰çš„ç¼–å·", example = "2048", dataTypeClass = String.class) - }) - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:query')") - public CommonResult> getTaskAssignRuleList( - @RequestParam(value = "modelId", required = false) String modelId, - @RequestParam(value = "processDefinitionId", required = false) String processDefinitionId) { - return success(taskAssignRuleService.getTaskAssignRuleList(modelId, processDefinitionId)); - } - - @PostMapping("/create") - @ApiOperation(value = "创建任务分é…规则") - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:create')") - public CommonResult createTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleCreateReqVO reqVO) { - return success(taskAssignRuleService.createTaskAssignRule(reqVO)); - } - - @PutMapping("/update") - @ApiOperation(value = "更新任务分é…规则") - @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:update')") - public CommonResult updateTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleUpdateReqVO reqVO) { - taskAssignRuleService.updateTaskAssignRule(reqVO); - return success(true); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java deleted file mode 100644 index 24d89cd36..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -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 javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "管ç†åŽå° - æµç¨‹æ´»åŠ¨å®žä¾‹") -@RestController -@RequestMapping("/bpm/activity") -@Validated -public class BpmActivityController { - - @Resource - private BpmActivityService activityService; - - @GetMapping("/list") - @ApiOperation(value = "生æˆæŒ‡å®šæµç¨‹å®žä¾‹çš„高亮æµç¨‹å›¾", - notes = "åªé«˜äº®è¿›è¡Œä¸­çš„任务。ä¸è¿‡è¦æ³¨æ„,该接å£æš‚时没用,通过å‰ç«¯çš„ ProcessViewer.vue ç•Œé¢çš„ highlightDiagram 方法生æˆ") - @ApiImplicitParam(name = "processInstanceId", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getActivityList( - @RequestParam("processInstanceId") String processInstanceId) { - return success(activityService.getActivityListByProcessInstanceId(processInstanceId)); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java deleted file mode 100644 index 851a83ce5..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Api(tags = "管ç†åŽå° - æµç¨‹å®žä¾‹") // æµç¨‹å®žä¾‹ï¼Œé€šè¿‡æµç¨‹å®šä¹‰åˆ›å»ºçš„一次“申请†-@RestController -@RequestMapping("/bpm/process-instance") -@Validated -public class BpmProcessInstanceController { - @Resource - private BpmProcessInstanceService processInstanceService; - - @GetMapping("/my-page") - @ApiOperation(value = "获得我的实例分页列表", notes = "在ã€æˆ‘çš„æµç¨‹ã€‘èœå•ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult> getMyProcessInstancePage( - @Valid BpmProcessInstanceMyPageReqVO pageReqVO) { - return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO)); - } - - @PostMapping("/create") - @ApiOperation("新建æµç¨‹å®žä¾‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { - return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); - } - - @GetMapping("/get") - @ApiOperation(value = "获得指定æµç¨‹å®žä¾‹", notes = "在ã€æµç¨‹è¯¦ç»†ã€‘ç•Œé¢ä¸­ï¼Œè¿›è¡Œè°ƒç”¨") - @ApiImplicitParam(name = "id", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult getProcessInstance(@RequestParam("id") String id) { - return success(processInstanceService.getProcessInstanceVO(id)); - } - - @DeleteMapping("/cancel") - @ApiOperation(value = "å–消æµç¨‹å®žä¾‹", notes = "撤回å‘èµ·çš„æµç¨‹") - @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')") - public CommonResult cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { - processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO); - return success(true); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java deleted file mode 100644 index d3318c963..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.task; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.TaskService; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; - -@Api(tags = "管ç†åŽå° - æµç¨‹ä»»åŠ¡å®žä¾‹") -@RestController -@RequestMapping("/bpm/task") -@Validated -public class BpmTaskController { - - @Resource - private BpmTaskService taskService; - - @GetMapping("todo-page") - @ApiOperation("èŽ·å– Todo 待办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) { - return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO)); - } - - @GetMapping("done-page") - @ApiOperation("èŽ·å– Done 已办任务分页") - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) { - return success(taskService.getDoneTaskPage(getLoginUserId(), pageVO)); - } - - @GetMapping("/list-by-process-instance-id") - @ApiOperation(value = "获得指定æµç¨‹å®žä¾‹çš„任务列表", notes = "包括完æˆçš„ã€æœªå®Œæˆçš„") - @ApiImplicitParam(name = "processInstanceId", value = "æµç¨‹å®žä¾‹çš„ç¼–å·", required = true, dataTypeClass = String.class) - @PreAuthorize("@ss.hasPermission('bpm:task:query')") - public CommonResult> getTaskListByProcessInstanceId( - @RequestParam("processInstanceId") String processInstanceId) { - return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); - } - - @PutMapping("/approve") - @ApiOperation("通过任务") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) { - taskService.approveTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/reject") - @ApiOperation("ä¸é€šè¿‡ä»»åŠ¡") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) { - taskService.rejectTask(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-assignee") - @ApiOperation(value = "更新任务的负责人", notes = "用于ã€æµç¨‹è¯¦æƒ…】的ã€è½¬æ´¾ã€‘按钮") - @PreAuthorize("@ss.hasPermission('bpm:task:update')") - public CommonResult updateTaskAssignee(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { - taskService.updateTaskAssignee(getLoginUserId(), reqVO); - return success(true); - } - @PutMapping("/back") - @ApiOperation(value = "回退") -// @PreAuthorize("@ss.hasPermission('bpm:task:back')") - public CommonResult backTask(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { - //先硬编ç åˆ° 回退到第一个审批节点 - String destinationTaskDefKey = "task01"; - taskService.backTask(reqVO.getId(),destinationTaskDefKey); - return success(true); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java deleted file mode 100644 index e8d285e35..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/app/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * å ä½ - */ -package cn.iocoder.yudao.module.bpm.controller.app; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java deleted file mode 100644 index d1930bd6a..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› RESTful API ç»™å‰ç«¯ï¼š - * 1. admin 包:æ供给管ç†åŽå° yudao-ui-admin å‰ç«¯é¡¹ç›® - * 2. app 包:æ供给用户 APP yudao-ui-app å‰ç«¯é¡¹ç›®ï¼Œå®ƒçš„ Controller å’Œ VO 都è¦æ·»åŠ  App å‰ç¼€ï¼Œç”¨äºŽå’Œç®¡ç†åŽå°è¿›è¡ŒåŒºåˆ† - */ -package cn.iocoder.yudao.module.bpm.controller; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java deleted file mode 100644 index 4d1b2a003..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java +++ /dev/null @@ -1,140 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -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.MappingTarget; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * æµç¨‹æ¨¡åž‹ Convert - * - * @author yunlongn - */ -@Mapper -public interface BpmModelConvert { - - BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); - - default List convertList(List list, Map formMap, - Map deploymentMap, - Map processDefinitionMap) { - return CollectionUtils.convertList(list, model -> { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; - Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; - ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; - return convert(model, form, deployment, processDefinition); - }); - } - - default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) { - BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO(); - modelRespVO.setId(model.getId()); - modelRespVO.setCreateTime(model.getCreateTime()); - // 通用 copy - copyTo(model, modelRespVO); - // Form - if (form != null) { - modelRespVO.setFormId(form.getId()); - modelRespVO.setFormName(form.getName()); - } - // ProcessDefinition - modelRespVO.setProcessDefinition(this.convert(processDefinition)); - if (modelRespVO.getProcessDefinition() != null) { - modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ? - SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - modelRespVO.getProcessDefinition().setDeploymentTime(deployment.getDeploymentTime()); - } - return modelRespVO; - } - - default BpmModelRespVO convert(Model model) { - BpmModelRespVO modelRespVO = new BpmModelRespVO(); - modelRespVO.setId(model.getId()); - modelRespVO.setCreateTime(model.getCreateTime()); - // 通用 copy - copyTo(model, modelRespVO); - return modelRespVO; - } - - default void copyTo(Model model, BpmModelBaseVO to) { - to.setName(model.getName()); - to.setKey(model.getKey()); - to.setCategory(model.getCategory()); - // metaInfo - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - copyTo(metaInfo, to); - } - - BpmModelCreateReqVO convert(BpmModeImportReqVO bean); - - default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) { - BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO(); - createReqDTO.setModelId(model.getId()); - createReqDTO.setName(model.getName()); - createReqDTO.setKey(model.getKey()); - createReqDTO.setCategory(model.getCategory()); - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - // metaInfo - copyTo(metaInfo, createReqDTO); - // form - if (form != null) { - createReqDTO.setFormConf(form.getConf()); - createReqDTO.setFormFields(form.getFields()); - } - return createReqDTO; - } - - void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmProcessDefinitionCreateReqDTO to); - - void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); - - BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean); - - default void copy(Model model, BpmModelCreateReqVO bean) { - model.setName(bean.getName()); - model.setKey(bean.getKey()); - model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null, - null, null)); - } - - default void copy(Model model, BpmModelUpdateReqVO bean) { - model.setName(bean.getName()); - model.setCategory(bean.getCategory()); - model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class), - bean.getDescription(), bean.getFormType(), bean.getFormId(), - bean.getFormCustomCreatePath(), bean.getFormCustomViewPath())); - } - - default String buildMetaInfoStr(BpmModelMetaInfoRespDTO metaInfo, String description, Integer formType, - Long formId, String formCustomCreatePath, String formCustomViewPath) { - if (metaInfo == null) { - metaInfo = new BpmModelMetaInfoRespDTO(); - } - // åªæœ‰éžç©ºï¼Œæ‰è¿›è¡Œè®¾ç½®ï¼Œé¿å…更新时的覆盖 - if (StrUtil.isNotEmpty(description)) { - metaInfo.setDescription(description); - } - if (Objects.nonNull(formType)) { - metaInfo.setFormType(formType); - metaInfo.setFormId(formId); - metaInfo.setFormCustomCreatePath(formCustomCreatePath); - metaInfo.setFormCustomViewPath(formCustomViewPath); - } - return JsonUtils.toJsonString(metaInfo); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java deleted file mode 100644 index 8f5bfcd26..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -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.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * Bpm æµç¨‹å®šä¹‰çš„ Convert - * - * @author yunlong.li - */ -@Mapper -public interface BpmProcessDefinitionConvert { - - BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); - - BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean); - - BpmProcessDefinitionExtDO convert2(BpmProcessDefinitionCreateReqDTO bean); - - default List convertList(List list, Map deploymentMap, - Map processDefinitionDOMap, Map formMap) { - return CollectionUtils.convertList(list, definition -> { - Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; - BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId()); - BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; - return convert(definition, deployment, definitionDO, form); - }); - } - - default List convertList3(List list, - Map processDefinitionDOMap) { - return CollectionUtils.convertList(list, processDefinition -> { - BpmProcessDefinitionRespVO respVO = convert3(processDefinition); - BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId()); - // å¤åˆ¶é€šç”¨å±žæ€§ - copyTo(processDefinitionExtDO, respVO); - return respVO; - }); - } - - @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") - BpmProcessDefinitionRespVO convert3(ProcessDefinition bean); - - @Named("convertSuspendedToSuspensionState") - default Integer convertSuspendedToSuspensionState(boolean suspended) { - return suspended ? SuspensionState.SUSPENDED.getStateCode() : - SuspensionState.ACTIVE.getStateCode(); - } - - default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, - BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { - BpmProcessDefinitionPageItemRespVO respVO = convert(bean); - respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); - if (deployment != null) { - respVO.setDeploymentTime(deployment.getDeploymentTime()); - } - if (form != null) { - respVO.setFormName(form.getName()); - } - // å¤åˆ¶é€šç”¨å±žæ€§ - copyTo(processDefinitionExtDO, respVO); - return respVO; - } - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to); -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java deleted file mode 100644 index c616e90b0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.definition; - -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import org.flowable.bpmn.model.UserTask; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface BpmTaskAssignRuleConvert { - BpmTaskAssignRuleConvert INSTANCE = Mappers.getMapper(BpmTaskAssignRuleConvert.class); - - default List convertList(List tasks, List rules) { - Map ruleMap = CollectionUtils.convertMap(rules, BpmTaskAssignRuleDO::getTaskDefinitionKey); - // 以 UserTask 为主维度,原因是:æµç¨‹å›¾ç¼–辑åŽï¼Œä¸€äº›è§„则实际就没用了。 - return CollectionUtils.convertList(tasks, task -> { - BpmTaskAssignRuleRespVO respVO = convert(ruleMap.get(task.getId())); - if (respVO == null) { - respVO = new BpmTaskAssignRuleRespVO(); - respVO.setTaskDefinitionKey(task.getId()); - } - respVO.setTaskDefinitionName(task.getName()); - return respVO; - }); - } - - BpmTaskAssignRuleRespVO convert(BpmTaskAssignRuleDO bean); - - BpmTaskAssignRuleDO convert(BpmTaskAssignRuleCreateReqVO bean); - - BpmTaskAssignRuleDO convert(BpmTaskAssignRuleUpdateReqVO bean); - - List convertList2(List list); -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java deleted file mode 100644 index 6db6ebc46..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * æä¾› POJO ç±»çš„å®žä½“è½¬æ¢ - * - * ç›®å‰ä½¿ç”¨ MapStruct 框架 - */ -package cn.iocoder.yudao.module.bpm.convert; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java deleted file mode 100644 index 509408457..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmActivityConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import org.flowable.engine.history.HistoricActivityInstance; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * BPM 活动 Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmActivityConvert { - - BpmActivityConvert INSTANCE = Mappers.getMapper(BpmActivityConvert.class); - - List convertList(List list); - - @Mappings({ - @Mapping(source = "activityId", target = "key"), - @Mapping(source = "activityType", target = "type") - }) - BpmActivityRespVO convert(HistoricActivityInstance bean); -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java deleted file mode 100644 index a1eea62e9..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -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.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * æµç¨‹å®žä¾‹ Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmProcessInstanceConvert { - - BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); - - default PageResult convertPage(PageResult page, - Map> taskMap) { - List list = convertList(page.getList()); - list.forEach(respVO -> respVO.setTasks(convertList2(taskMap.get(respVO.getId())))); - return new PageResult<>(list, page.getTotal()); - } - - List convertList(List list); - - @Mapping(source = "processInstanceId", target = "id") - BpmProcessInstancePageItemRespVO convert(BpmProcessInstanceExtDO bean); - - List convertList2(List tasks); - - default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt, - ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt, - String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) { - BpmProcessInstanceRespVO respVO = convert2(processInstance); - copyTo(processInstanceExt, respVO); - // definition - respVO.setProcessDefinition(convert2(processDefinition)); - copyTo(processDefinitionExt, respVO.getProcessDefinition()); - respVO.getProcessDefinition().setBpmnXml(bpmnXml); - // user - if (startUser != null) { - respVO.setStartUser(convert2(startUser)); - if (dept != null) { - respVO.getStartUser().setDeptName(dept.getName()); - } - } - return respVO; - } - - BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean); - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessInstanceExtDO from, @MappingTarget BpmProcessInstanceRespVO to); - - BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean); - - @Mapping(source = "from.id", target = "to.id", ignore = true) - void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); - - BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean); - - default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) { - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); - event.setId(instance.getId()); - event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); - event.setBusinessKey(instance.getBusinessKey()); - event.setResult(result); - return event; - } - - default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) { - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); - event.setId(instance.getId()); - event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); - event.setBusinessKey(instance.getBusinessKey()); - event.setResult(result); - return event; - } - - default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){ - return new BpmMessageSendWhenProcessInstanceApproveReqDTO() - .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())) - .setProcessInstanceId(instance.getId()) - .setProcessInstanceName(instance.getName()); - } - - default BpmMessageSendWhenProcessInstanceRejectReqDTO convert2RejectReq(ProcessInstance instance, String reason) { - return new BpmMessageSendWhenProcessInstanceRejectReqDTO() - .setProcessInstanceName(instance.getName()) - .setProcessInstanceId(instance.getId()) - .setReason(reason) - .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java deleted file mode 100644 index d128dba2c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.iocoder.yudao.module.bpm.convert.task; - -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskDonePageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageItemRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; - -import org.flowable.common.engine.impl.db.SuspensionState; -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.mapstruct.*; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * Bpm 任务 Convert - * - * @author 芋é“æºç  - */ -@Mapper -public interface BpmTaskConvert { - - BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); - - default List convertList1(List tasks, Map processInstanceMap, - Map userMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskTodoPageItemRespVO respVO = convert1(task); - ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId()); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - return respVO; - }); - } - - @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") - BpmTaskTodoPageItemRespVO convert1(Task bean); - - @Named("convertSuspendedToSuspensionState") - default Integer convertSuspendedToSuspensionState(boolean suspended) { - return suspended ? SuspensionState.SUSPENDED.getStateCode() : - SuspensionState.ACTIVE.getStateCode(); - } - - default List convertList2(List tasks, Map bpmTaskExtDOMap, - Map historicProcessInstanceMap, - Map userMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskDonePageItemRespVO respVO = convert2(task); - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); - copyTo(taskExtDO, respVO); - HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - return respVO; - }); - } - - BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean); - - @Mappings({ - @Mapping(source = "processInstance.id", target = "id"), - @Mapping(source = "processInstance.name", target = "name"), - @Mapping(source = "processInstance.startUserId", target = "startUserId"), - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), - @Mapping(source = "startUser.nickname", target = "startUserNickname") - }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); - - default List convertList3(List tasks, Map bpmTaskExtDOMap, - HistoricProcessInstance processInstance, Map userMap, - Map deptMap) { - return CollectionUtils.convertList(tasks, task -> { - BpmTaskRespVO respVO = convert3(task); - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); - copyTo(taskExtDO, respVO); - if (processInstance != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); - respVO.setProcessInstance(convert(processInstance, startUser)); - } - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); - if (assignUser != null) { - respVO.setAssigneeUser(convert3(assignUser)); - DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); - if (dept != null) { - respVO.getAssigneeUser().setDeptName(dept.getName()); - } - } - return respVO; - }); - } - - @Mapping(source = "taskDefinitionKey", target = "definitionKey") - BpmTaskRespVO convert3(HistoricTaskInstance bean); - - BpmTaskRespVO.User convert3(AdminUserRespDTO bean); - - @Mapping(target = "id", ignore = true) - void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); - - @Mappings({ - @Mapping(source = "processInstance.id", target = "id"), - @Mapping(source = "processInstance.name", target = "name"), - @Mapping(source = "processInstance.startUserId", target = "startUserId"), - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), - @Mapping(source = "startUser.nickname", target = "startUserNickname") - }) - BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); - - default BpmTaskExtDO convert2TaskExt(Task task){ - BpmTaskExtDO taskExtDO = new BpmTaskExtDO() - .setTaskId(task.getId()) - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())) - .setName(task.getName()) - .setProcessDefinitionId(task.getProcessDefinitionId()) - .setProcessInstanceId(task.getProcessInstanceId()); - taskExtDO.setCreateTime(task.getCreateTime()); - return taskExtDO; - } - - 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; - } -} - - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md deleted file mode 100644 index 8153487b7..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/ã€ŠèŠ‹é“ Spring Boot å¯¹è±¡è½¬æ¢ MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java deleted file mode 100644 index bf2feb840..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.config; - -import cn.hutool.core.collection.ListUtil; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.BpmActivityBehaviorFactory; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import org.flowable.common.engine.api.delegate.event.FlowableEventListener; -import org.flowable.spring.SpringProcessEngineConfiguration; -import org.flowable.spring.boot.EngineConfigurationConfigurer; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * BPM 模å—çš„ Flowable é…置类 - * - * @author jason - */ -@Configuration -public class BpmFlowableConfiguration { - - /** - * BPM 模å—çš„ ProcessEngineConfigurationConfigurer 实现类: - * - * 1. 设置å„ç§ç›‘å¬å™¨ - * 2. 设置自定义的 ActivityBehaviorFactory 实现 - */ - @Bean - public EngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( - ObjectProvider listeners, - BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { - return configuration -> { - // 注册监å¬å™¨ï¼Œä¾‹å¦‚说 BpmActivitiEventListener - configuration.setEventListeners(ListUtil.toList(listeners.iterator())); - // 设置 ActivityBehaviorFactory 实现类,用于æµç¨‹ä»»åŠ¡çš„审核人的自定义 - configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); - }; - } - - @Bean - public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService, - BpmUserGroupService userGroupService, - PermissionApi permissionApi, - DeptApi deptApi, - AdminUserApi adminUserApi, - List scripts) { - BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); - bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); - bpmActivityBehaviorFactory.setUserGroupService(userGroupService); - bpmActivityBehaviorFactory.setAdminUserApi(adminUserApi); - bpmActivityBehaviorFactory.setPermissionApi(permissionApi); - bpmActivityBehaviorFactory.setDeptApi(deptApi); - bpmActivityBehaviorFactory.setScripts(scripts); - return bpmActivityBehaviorFactory; - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java deleted file mode 100644 index 0d8de4f62..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior; - -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.Setter; -import lombok.ToString; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior; -import org.flowable.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; - -import java.util.List; - -/** - * 自定义的 ActivityBehaviorFactory 实现类,目的如下: - * 1. 自定义 {@link #createUserTaskActivityBehavior(UserTask)}:实现自定义的æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * - * @author 芋é“æºç  - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { - - @Setter - private BpmTaskAssignRuleService bpmTaskRuleService; - @Setter - private BpmUserGroupService userGroupService; - - @Setter - private PermissionApi permissionApi; - @Setter - private DeptApi deptApi; - @Setter - private AdminUserApi adminUserApi; - @Setter - private List scripts; - - @Override - public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { - BpmUserTaskActivityBehavior userTaskActivityBehavior = new BpmUserTaskActivityBehavior(userTask); - userTaskActivityBehavior.setBpmTaskRuleService(bpmTaskRuleService); - userTaskActivityBehavior.setPermissionApi(permissionApi); - userTaskActivityBehavior.setDeptApi(deptApi); - userTaskActivityBehavior.setUserGroupService(userGroupService); - userTaskActivityBehavior.setAdminUserApi(adminUserApi); - userTaskActivityBehavior.setScripts(scripts); - return userTaskActivityBehavior; - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java deleted file mode 100644 index f6b476368..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java +++ /dev/null @@ -1,203 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.definition.BpmTaskAssignRuleService; -import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.permission.PermissionApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import com.google.common.annotations.VisibleForTesting; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.UserTask; -import org.flowable.common.engine.api.FlowableException; -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.util.TaskHelper; -import org.flowable.task.service.TaskService; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; - -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_ASSIGN_SCRIPT_NOT_EXISTS; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.TASK_CREATE_FAIL_NO_CANDIDATE_USER; - -/** - * 自定义的æµç¨‹ä»»åŠ¡çš„ assignee è´Ÿè´£äººçš„åˆ†é… - * 第一步,获得对应的分é…规则; - * 第二步,根æ®åˆ†é…规则,计算出分é…任务的候选人。如果找ä¸åˆ°ï¼Œåˆ™ç›´æŽ¥æŠ¥ä¸šåŠ¡å¼‚常,ä¸ç»§ç»­æ‰§è¡ŒåŽç»­çš„æµç¨‹ï¼› - * 第三步,éšæœºé€‰æ‹©ä¸€ä¸ªå€™é€‰äººï¼Œåˆ™é€‰æ‹©ä½œä¸º assignee 负责人。 - * - * @author 芋é“æºç  - */ -@Slf4j -public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior { - - @Setter - private BpmTaskAssignRuleService bpmTaskRuleService; - @Setter - private BpmUserGroupService userGroupService; - @Setter - private DeptApi deptApi; - @Setter - private AdminUserApi adminUserApi; - @Setter - private PermissionApi permissionApi; - - /** - * 任务分é…脚本 - */ - private Map scriptMap = Collections.emptyMap(); - - public BpmUserTaskActivityBehavior(UserTask userTask) { - super(userTask); - } - - public void setScripts(List scripts) { - this.scriptMap = convertMap(scripts, script -> script.getEnum().getId()); - } - - @Override - @DataPermission(enable = false) // ä¸éœ€è¦å¤„ç†æ•°æ®æƒé™ï¼Œ ä¸ç„¶ä¼šæœ‰é—®é¢˜ï¼ŒæŸ¥è¯¢ä¸åˆ°æ•°æ® - protected void handleAssignments(TaskService taskService, String assignee, String owner, List candidateUsers, List candidateGroups, TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution, ProcessEngineConfigurationImpl processEngineConfiguration) { - boolean isMultiInstance = hasMultiInstanceCharacteristics(); - if(isMultiInstance){ - //多实例 会签/或签,执行多次æ¯ä¸ªäºº 待办人都在execution里é¢èŽ·å– - Integer assigneeUserId = execution.getVariableLocal("user", Integer.class); - TaskHelper.changeTaskAssignee(task, String.valueOf(assigneeUserId)); - }else { - // 第一步,获得任务的规则 - BpmTaskAssignRuleDO rule = getTaskRule(task); - // 第二步,获得任务的候选用户们 - Set candidateUserIds = calculateTaskCandidateUsers(task, rule); - // 第三步,设置一个作为负责人 - Long assigneeUserId = chooseTaskAssignee(candidateUserIds); - TaskHelper.changeTaskAssignee(task, String.valueOf(assigneeUserId)); - } - - } - - private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) { - List taskRules = bpmTaskRuleService.getTaskAssignRuleListByProcessDefinitionId(task.getProcessDefinitionId(), - task.getTaskDefinitionKey()); - if (CollUtil.isEmpty(taskRules)) { - throw new FlowableException(StrUtil.format("æµç¨‹ä»»åŠ¡({}/{}/{}) 找ä¸åˆ°ç¬¦åˆçš„任务规则", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey())); - } - if (taskRules.size() > 1) { - throw new FlowableException(StrUtil.format("æµç¨‹ä»»åŠ¡({}/{}/{}) 找到过多任务规则({})", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), taskRules.size())); - } - return taskRules.get(0); - } - - Set calculateTaskCandidateUsers(TaskEntity task, BpmTaskAssignRuleDO rule) { - Set assigneeUserIds = null; - if (Objects.equals(BpmTaskAssignRuleTypeEnum.ROLE.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByRole(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByDeptMember(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByDeptLeader(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.POST.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByPost(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByUser(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByUserGroup(task, rule); - } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.SCRIPT.getType(), rule.getType())) { - assigneeUserIds = calculateTaskCandidateUsersByScript(task, rule); - } - - // 移除被ç¦ç”¨çš„用户 - removeDisableUsers(assigneeUserIds); - // 如果候选人为空,抛出异常 TODO 芋艿:没候选人的策略选择。1 - 挂起;2 - 直接结æŸï¼›3 - 强制一个兜底人 - if (CollUtil.isEmpty(assigneeUserIds)) { - log.error("[calculateTaskCandidateUsers][æµç¨‹ä»»åŠ¡({}/{}/{}) 任务规则({}) 找ä¸åˆ°å€™é€‰äºº]", - task.getId(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), toJsonString(rule)); - throw exception(TASK_CREATE_FAIL_NO_CANDIDATE_USER); - } - return assigneeUserIds; - } - - private Set calculateTaskCandidateUsersByRole(TaskEntity task, BpmTaskAssignRuleDO rule) { - return permissionApi.getUserRoleIdListByRoleIds(rule.getOptions()); - } - - private Set calculateTaskCandidateUsersByDeptMember(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = adminUserApi.getUsersByDeptIds(rule.getOptions()); - return convertSet(users, AdminUserRespDTO::getId); - } - - private Set calculateTaskCandidateUsersByDeptLeader(TaskEntity task, BpmTaskAssignRuleDO rule) { - List depts = deptApi.getDepts(rule.getOptions()); - return convertSet(depts, DeptRespDTO::getLeaderUserId); - } - - private Set calculateTaskCandidateUsersByPost(TaskEntity task, BpmTaskAssignRuleDO rule) { - List users = adminUserApi.getUsersByPostIds(rule.getOptions()); - return convertSet(users, AdminUserRespDTO::getId); - } - - private Set calculateTaskCandidateUsersByUser(TaskEntity task, BpmTaskAssignRuleDO rule) { - return rule.getOptions(); - } - - private Set calculateTaskCandidateUsersByUserGroup(TaskEntity task, BpmTaskAssignRuleDO rule) { - List userGroups = userGroupService.getUserGroupList(rule.getOptions()); - Set userIds = new HashSet<>(); - userGroups.forEach(group -> userIds.addAll(group.getMemberUserIds())); - return userIds; - } - - private Set calculateTaskCandidateUsersByScript(TaskEntity task, BpmTaskAssignRuleDO rule) { - // 获得对应的脚本 - List scripts = new ArrayList<>(rule.getOptions().size()); - rule.getOptions().forEach(id -> { - BpmTaskAssignScript script = scriptMap.get(id); - if (script == null) { - throw exception(TASK_ASSIGN_SCRIPT_NOT_EXISTS, id); - } - scripts.add(script); - }); - // é€ä¸ªè®¡ç®—任务 - Set userIds = new HashSet<>(); - scripts.forEach(script -> CollUtil.addAll(userIds, script.calculateTaskCandidateUsers(task))); - return userIds; - } - - private Long chooseTaskAssignee(Set candidateUserIds) { - // TODO 芋艿:未æ¥å¯ä»¥ä¼˜åŒ–下,改æˆè½®è¯¢çš„ç­–ç•¥ - int index = RandomUtil.randomInt(candidateUserIds.size()); - return CollUtil.get(candidateUserIds, index); - } - - @VisibleForTesting - void removeDisableUsers(Set assigneeUserIds) { - if (CollUtil.isEmpty(assigneeUserIds)) { - return; - } - //TODO 芋艿 这里有数æ®æƒé™çš„问题。默认会加上数æ®æƒé™ dept_id IN (deptId). 导致查询ä¸åˆ°æ•°æ® - Map userMap = adminUserApi.getUserMap(assigneeUserIds); - assigneeUserIds.removeIf(id -> { - AdminUserRespDTO user = userMap.get(id); - return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus()); - }); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java deleted file mode 100644 index 10392c714..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script; - -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; - -import java.util.Set; - -/** - * Bpm 任务分é…的自定义 Script 脚本 - * 使用场景: - * 1. 设置审批人为å‘起人 - * 2. 设置审批人为å‘起人的 Leader - * 3. 甚至审批人为å‘起人的 Leader çš„ Leader - * - * @author 芋é“æºç  - */ -public interface BpmTaskAssignScript { - - /** - * 基于æµç¨‹ä»»åŠ¡ï¼ŒèŽ·å¾—任务的候选用户们 - * - * @param task 任务 - * @return 候选人用户的编å·æ•°ç»„ - */ - Set calculateTaskCandidateUsers(TaskEntity task); - - /** - * 获得枚举值 - * - * @return 枚举值 - */ - BpmTaskRuleScriptEnum getEnum(); -} - diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java deleted file mode 100644 index 06b8c52f0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; - -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.context.annotation.Lazy; -import org.springframework.util.Assert; - -import javax.annotation.Resource; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; -import static java.util.Collections.emptySet; - -/** - * 分é…ç»™å‘起人的 Leader 审批的 Script 实现类 - * ç›®å‰ Leader 的定义是, - * - * @author 芋é“æºç  - */ -public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssignScript { - - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessInstanceService bpmProcessInstanceService; - - protected Set calculateTaskCandidateUsers(TaskEntity task, int level) { - Assert.isTrue(level > 0, "level 必须大于 0"); - // 获得å‘起人 - ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(task.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()); - if (parentDept == null) { // 找ä¸åˆ°çˆ¶çº§éƒ¨é—¨ï¼Œæ‰€ä»¥åªå¥½ç»“æŸå¯»æ‰¾ã€‚原因是:例如说,级别比较高的人,所在部门层级比较少 - break; - } - dept = parentDept; - } - } - return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet(); - } - - private DeptRespDTO getStartUserDept(Long startUserId) { - AdminUserRespDTO startUser = adminUserApi.getUser(startUserId); - if (startUser.getDeptId() == null) { // 找ä¸åˆ°éƒ¨é—¨ï¼Œæ‰€ä»¥æ— æ³•ä½¿ç”¨è¯¥è§„则 - return null; - } - return deptApi.getDept(startUser.getDeptId()); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java deleted file mode 100644 index adcece67b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人的一级 Leader 审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignLeaderX1Script extends BpmTaskAssignLeaderAbstractScript { - - @Override - @DataPermission(enable = false) // ä¸éœ€è¦å¤„ç†æ•°æ®æƒé™ï¼Œ ä¸ç„¶ä¼šæœ‰é—®é¢˜ï¼ŒæŸ¥è¯¢ä¸åˆ°æ•°æ® - public Set calculateTaskCandidateUsers(TaskEntity task) { - return calculateTaskCandidateUsers(task, 1); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X1; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java deleted file mode 100644 index 9ead7a6f3..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * 分é…ç»™å‘起人的二级 Leader 审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignLeaderX2Script extends BpmTaskAssignLeaderAbstractScript { - - @Override - @DataPermission(enable = false) // ä¸éœ€è¦å¤„ç†æ•°æ®æƒé™ï¼Œ ä¸ç„¶ä¼šæœ‰é—®é¢˜ï¼ŒæŸ¥è¯¢ä¸åˆ°æ•°æ® - public Set calculateTaskCandidateUsers(TaskEntity task) { - return calculateTaskCandidateUsers(task, 2); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.LEADER_X2; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java deleted file mode 100644 index 653918b0b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.impl; - -import cn.iocoder.yudao.framework.common.util.collection.SetUtils; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskRuleScriptEnum; - -import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Set; - -/** - * 分é…ç»™å‘起人审批的 Script 实现类 - * - * @author 芋é“æºç  - */ -@Component -public class BpmTaskAssignStartUserScript implements BpmTaskAssignScript { - - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessInstanceService bpmProcessInstanceService; - - @Override - public Set calculateTaskCandidateUsers(TaskEntity task) { - ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(task.getProcessInstanceId()); - Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); - return SetUtils.asSet(startUserId); - } - - @Override - public BpmTaskRuleScriptEnum getEnum() { - return BpmTaskRuleScriptEnum.START_USER; - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java deleted file mode 100644 index 82d5e9be6..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; - -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import com.google.common.collect.ImmutableSet; -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.delegate.event.FlowableProcessStartedEvent; -import org.flowable.engine.runtime.ProcessInstance; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Set; -/** - * ç›‘å¬ {@link ProcessInstance} 的开始与完æˆï¼Œåˆ›å»ºä¸Žæ›´æ–°å¯¹åº”çš„ {@link BpmProcessInstanceExtDO} 记录 - * - * @author jason - */ -@Component -public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEventListener { - - @Resource - @Lazy - private BpmProcessInstanceService processInstanceService; - - public static final Set PROCESS_INSTANCE_EVENTS = ImmutableSet.builder() - .add(FlowableEngineEventType.PROCESS_CREATED) - .add(FlowableEngineEventType.PROCESS_CANCELLED) - .add(FlowableEngineEventType.PROCESS_COMPLETED) - .build(); - - public BpmProcessInstanceEventListener(){ - super(PROCESS_INSTANCE_EVENTS); - } - - @Override - protected void processCreated(FlowableEngineEntityEvent event) { - processInstanceService.createProcessInstanceExt((ProcessInstance)event.getEntity()); - } - - @Override - protected void processCancelled(FlowableCancelledEvent event) { - processInstanceService.updateProcessInstanceExtCancel(event); - } - - @Override - protected void processCompleted(FlowableEngineEntityEvent event) { - processInstanceService.updateProcessInstanceExtComplete((ProcessInstance)event.getEntity()); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java deleted file mode 100644 index f9c9cb769..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; - -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; -import com.google.common.collect.ImmutableSet; -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.task.api.Task; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Set; - -/** - * ç›‘å¬ {@link org.flowable.task.api.Task} 的开始与完æˆï¼Œåˆ›å»ºä¸Žæ›´æ–°å¯¹åº”çš„ {@link BpmTaskExtDO} 记录 - * - * @author jason - */ -@Component -public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { - - @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) - .build(); - - public BpmTaskEventListener(){ - super(TASK_EVENTS); - } - - @Override - protected void taskCreated(FlowableEngineEntityEvent event) { - taskService.createTaskExt((Task) event.getEntity()); - } - - @Override - protected void taskCompleted(FlowableEngineEntityEvent event) { - taskService.updateTaskExtComplete((Task)event.getEntity()); - } - - @Override - protected void taskAssigned(FlowableEngineEntityEvent event) { - taskService.updateTaskExtAssign((Task)event.getEntity()); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java deleted file mode 100644 index 52fdb7f93..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 bpm 模å—çš„ framework å°è£… - * - * @author 芋é“æºç  - */ -package cn.iocoder.yudao.module.bpm.framework; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java deleted file mode 100644 index 5713e495c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * bpm 包下,业务æµç¨‹ç®¡ç†ï¼ˆBusiness Process Management),我们放工作æµçš„功能,基于 activiti 7 版本实现。 - * 例如说:æµç¨‹å®šä¹‰ã€è¡¨å•é…ç½®ã€å®¡æ ¸ä¸­å¿ƒï¼ˆæˆ‘的申请ã€æˆ‘的待办ã€æˆ‘的已办)等等 - * - * bpm 解释:https://baike.baidu.com/item/BPM/1933 - * - * 1. Controller URL:以 /bpm/ 开头,é¿å…和其它 Module å†²çª - * 2. DataObject 表å:以 bpm_ 开头,方便在数æ®åº“中区分 - * - * 注æ„,由于 Bpm 模å—下,容易和其它模å—é‡å,所以类å都加载 Pay çš„å‰ç¼€~ - */ -package cn.iocoder.yudao.module.bpm; diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java deleted file mode 100644 index a4e4f83d1..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import org.flowable.bpmn.model.BpmnModel; - -import javax.validation.Valid; - -/** - * Flowableæµç¨‹æ¨¡åž‹æŽ¥å£ - * - * @author yunlongn - */ -public interface BpmModelService { - /** - * 获得æµç¨‹æ¨¡åž‹åˆ†é¡µ - * - * @param pageVO 分页查询 - * @return æµç¨‹æ¨¡åž‹åˆ†é¡µ - */ - PageResult getModelPage(BpmModelPageReqVO pageVO); - - /** - * 创建æµç¨‹æ¨¡åž‹ - * - * @param modelVO åˆ›å»ºä¿¡æ¯ - * @param bpmnXml BPMN XML - * @return 创建的æµç¨‹æ¨¡åž‹çš„ç¼–å· - */ - String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml); - - /** - * 获得æµç¨‹æ¨¡å— - * - * @param id ç¼–å· - * @return æµç¨‹æ¨¡åž‹ - */ - BpmModelRespVO getModel(String id); - - /** - * 修改æµç¨‹æ¨¡åž‹ - * - * @param updateReqVO æ›´æ–°ä¿¡æ¯ - */ - void updateModel(@Valid BpmModelUpdateReqVO updateReqVO); - - /** - * å°†æµç¨‹æ¨¡åž‹ï¼Œéƒ¨ç½²æˆä¸€ä¸ªæµç¨‹å®šä¹‰ - * - * @param id ç¼–å· - */ - void deployModel(String id); - - /** - * 删除模型 - * - * @param id ç¼–å· - */ - void deleteModel(String id); - - /** - * 修改模型的状æ€ï¼Œå®žé™…更新的部署的æµç¨‹å®šä¹‰çš„çŠ¶æ€ - * - * @param id ç¼–å· - * @param state çŠ¶æ€ - */ - void updateModelState(String id, Integer state); - - /** - * 获得æµç¨‹æ¨¡åž‹ç¼–å·å¯¹åº”çš„ BPMN Model - * - * @param id æµç¨‹æ¨¡åž‹ç¼–å· - * @return BPMN Model - */ - BpmnModel getBpmnModel(String id); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java deleted file mode 100644 index dcb0b9e47..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ /dev/null @@ -1,286 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.common.engine.impl.util.io.BytesStreamSource; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ModelQuery; -import org.flowable.engine.repository.ProcessDefinition; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.ObjectUtils; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * Flowableæµç¨‹æ¨¡åž‹å®žçŽ° - * 主è¦è¿›è¡Œ Flowable {@link Model} 的维护 - * - * @author yunlongn - * @author 芋é“æºç  - * @author jason - */ -@Service -@Validated -@Slf4j -public class BpmModelServiceImpl implements BpmModelService { - - @Resource - private RepositoryService repositoryService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmFormService bpmFormService; - @Resource - private BpmTaskAssignRuleService taskAssignRuleService; - - @Override - public PageResult getModelPage(BpmModelPageReqVO pageVO) { - ModelQuery modelQuery = repositoryService.createModelQuery(); - if (StrUtil.isNotBlank(pageVO.getKey())) { - modelQuery.modelKey(pageVO.getKey()); - } - if (StrUtil.isNotBlank(pageVO.getName())) { - modelQuery.modelNameLike("%" + pageVO.getName() + "%"); // æ¨¡ç³ŠåŒ¹é… - } - if (StrUtil.isNotBlank(pageVO.getCategory())) { - modelQuery.modelCategory(pageVO.getCategory()); - } - // 执行查询 - List models = modelQuery.orderByCreateTime().desc() - .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - - // 获得 Form Map - Set formIds = CollectionUtils.convertSet(models, model -> { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); - return metaInfo != null ? metaInfo.getFormId() : null; - }); - Map formMap = bpmFormService.getFormMap(formIds); - - // 获得 Deployment Map - Set deploymentIds = new HashSet<>(); - models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId())); - Map deploymentMap = processDefinitionService.getDeploymentMap(deploymentIds); - // 获得 ProcessDefinition Map - List processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds); - Map processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId); - - // 拼接结果 - long modelCount = modelQuery.count(); - return new PageResult<>(BpmModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) { - checkKeyNCName(createReqVO.getKey()); - // 校验æµç¨‹æ ‡è¯†å·²ç»å­˜åœ¨ - Model keyModel = this.getModelByKey(createReqVO.getKey()); - if (keyModel != null) { - throw exception(MODEL_KEY_EXISTS, createReqVO.getKey()); - } - - // 创建æµç¨‹å®šä¹‰ - Model model = repositoryService.newModel(); - BpmModelConvert.INSTANCE.copy(model, createReqVO); - // ä¿å­˜æµç¨‹å®šä¹‰ - repositoryService.saveModel(model); - // ä¿å­˜ BPMN XML - saveModelBpmnXml(model, bpmnXml); - return model.getId(); - } - - private Model getModelByKey(String key) { - return repositoryService.createModelQuery().modelKey(key).singleResult(); - } - - @Override - public BpmModelRespVO getModel(String id) { - Model model = repositoryService.getModel(id); - if (model == null) { - return null; - } - BpmModelRespVO modelRespVO = BpmModelConvert.INSTANCE.convert(model); - // 拼接 bpmn XML - byte[] bpmnBytes = repositoryService.getModelEditorSource(id); - modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes)); - return modelRespVO; - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个æ“作,所以开å¯äº‹åŠ¡ - public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(updateReqVO.getId()); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - - // 修改æµç¨‹å®šä¹‰ - BpmModelConvert.INSTANCE.copy(model, updateReqVO); - // 更新模型 - repositoryService.saveModel(model); - // æ›´æ–° BPMN XML - saveModelBpmnXml(model, updateReqVO.getBpmnXml()); - } - - @Override - @Transactional(rollbackFor = Exception.class) // 因为进行多个æ“作,所以开å¯äº‹åŠ¡ - public void deployModel(String id) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (ObjectUtils.isEmpty(model)) { - throw exception(MODEL_NOT_EXISTS); - } - // 校验æµç¨‹å›¾ - byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId()); - if (bpmnBytes == null) { - throw exception(MODEL_NOT_EXISTS); - } - // TODO 芋艿:校验æµç¨‹å›¾çš„有效性;例如说,是å¦æœ‰å¼€å§‹çš„元素,是å¦æœ‰ç»“æŸçš„元素; - // 校验表å•å·²é… - BpmFormDO form = checkFormConfig(model.getMetaInfo()); - //校验任务分é…规则已é…ç½® - taskAssignRuleService.checkTaskAssignRuleAllConfig(id); - - BpmProcessDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model, form).setBpmnBytes(bpmnBytes); - //校验模型是å¦å‘生修改。如果未修改,则ä¸å…许创建 - if (processDefinitionService.isProcessDefinitionEquals(definitionCreateReqDTO)) { // æµç¨‹å®šä¹‰çš„ä¿¡æ¯ç›¸ç­‰ - ProcessDefinition oldProcessInstance = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); - if (oldProcessInstance != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessInstance.getId())) { - throw exception(MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS); - } - } - // 创建æµç¨‹å®šä¹‰ - String definitionId = processDefinitionService.createProcessDefinition(definitionCreateReqDTO); - - // å°†è€çš„æµç¨‹å®šä¹‰è¿›è¡ŒæŒ‚起。也就是说,åªæœ‰æœ€æ–°éƒ¨ç½²çš„æµç¨‹å®šä¹‰ï¼Œæ‰å¯ä»¥å‘起任务。 - updateProcessDefinitionSuspended(model.getDeploymentId()); - - // æ›´æ–° model çš„ deploymentIdï¼Œè¿›è¡Œå…³è” - ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId); - model.setDeploymentId(definition.getDeploymentId()); - repositoryService.saveModel(model); - - //å¤åˆ¶ä»»åŠ¡åˆ†é…规则 - taskAssignRuleService.copyTaskAssignRules(id, definition.getId()); - } - - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteModel(String id) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - // 执行删除 - repositoryService.deleteModel(id); - // ç¦ç”¨æµç¨‹å®žä¾‹ - updateProcessDefinitionSuspended(model.getDeploymentId()); - } - - @Override - public void updateModelState(String id, Integer state) { - // 校验æµç¨‹æ¨¡åž‹å­˜åœ¨ - Model model = repositoryService.getModel(id); - if (model == null) { - throw exception(MODEL_NOT_EXISTS); - } - // 校验æµç¨‹å®šä¹‰å­˜åœ¨ - ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - - // æ›´æ–°çŠ¶æ€ - processDefinitionService.updateProcessDefinitionState(definition.getId(), state); - } - - @Override - public BpmnModel getBpmnModel(String id) { - byte[] bpmnBytes = repositoryService.getModelEditorSource(id); - if (ArrayUtil.isEmpty(bpmnBytes)) { - return null; - } - BpmnXMLConverter converter = new BpmnXMLConverter(); - return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true); - } - - private void checkKeyNCName(String key) { - if (!ValidationUtils.isXmlNCName(key)) { - throw exception(MODEL_KEY_VALID); - } - } - - /** - * 校验æµç¨‹è¡¨å•å·²é…ç½® - * - * @param metaInfoStr æµç¨‹æ¨¡åž‹ metaInfo 字段 - * @return æµç¨‹è¡¨å• - */ - private BpmFormDO checkFormConfig(String metaInfoStr) { - BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class); - if (metaInfo == null || metaInfo.getFormType() == null) { - throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); - } - // 校验表å•å­˜åœ¨ - if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { - BpmFormDO form = bpmFormService.getForm(metaInfo.getFormId()); - if (form == null) { - throw exception(FORM_NOT_EXISTS); - } - return form; - } - return null; - } - - private void saveModelBpmnXml(Model model, String bpmnXml) { - if (StrUtil.isEmpty(bpmnXml)) { - return; - } - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(bpmnXml)); - } - - /** - * 挂起 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()); - } - - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java deleted file mode 100644 index 7c26b644e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java +++ /dev/null @@ -1,159 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.ProcessDefinition; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; -import java.util.Set; -/** - * Flowableæµç¨‹å®šä¹‰æŽ¥å£ - * - * @author yunlong.li - * @author ZJQ - * @author 芋é“æºç  - */ -public interface BpmProcessDefinitionService { - - /** - * 获得æµç¨‹å®šä¹‰åˆ†é¡µ - * - * @param pageReqVO åˆ†é¡µå…¥å‚ - * @return æµç¨‹å®šä¹‰ Page - */ - PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO); - - /** - * 获得æµç¨‹å®šä¹‰åˆ—表 - * - * @param listReqVO åˆ—è¡¨å…¥å‚ - * @return æµç¨‹å®šä¹‰åˆ—表 - */ - List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO); - - /** - * 创建æµç¨‹å®šä¹‰ - * - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return æµç¨‹ç¼–å· - */ - String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); - - /** - * æ›´æ–°æµç¨‹å®šä¹‰çŠ¶æ€ - * - * @param id æµç¨‹å®šä¹‰çš„ç¼–å· - * @param state çŠ¶æ€ - */ - void updateProcessDefinitionState(String id, Integer state); - - /** - * 获得æµç¨‹å®šä¹‰å¯¹åº”çš„ BPMN XML - * - * @param id æµç¨‹å®šä¹‰ç¼–å· - * @return BPMN XML - */ - String getProcessDefinitionBpmnXML(String id); - - /** - * 获得需è¦åˆ›å»ºçš„æµç¨‹å®šä¹‰ï¼Œæ˜¯å¦å’Œå½“å‰æ¿€æ´»çš„æµç¨‹å®šä¹‰ç›¸ç­‰ - * - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return 是å¦ç›¸ç­‰ - */ - boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); - - /** - * 获得编å·å¯¹åº”çš„ BpmProcessDefinitionExtDO - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰æ‹“展 - */ - BpmProcessDefinitionExtDO getProcessDefinitionExt(String id); - - /** - * 获得编å·å¯¹åº”çš„ ProcessDefinition - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinition(String id); - - /** - * 获得编å·å¯¹åº”çš„ ProcessDefinition - * - * 相比 {@link #getProcessDefinition(String)} 方法,category çš„å–值是正确 - * - * @param id ç¼–å· - * @return æµç¨‹å®šä¹‰ - */ - ProcessDefinition getProcessDefinition2(String id); - - /** - * 获得 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); - - /** - * 获得 ids 对应的 Deployment Map - * - * @param ids 部署编å·çš„数组 - * @return æµç¨‹éƒ¨ç½² Map - */ - default Map getDeploymentMap(Set ids) { - return CollectionUtils.convertMap(getDeployments(ids), Deployment::getId); - } - - /** - * 获得 ids 对应的 Deployment 数组 - * - * @param ids 部署编å·çš„数组 - * @return æµç¨‹éƒ¨ç½²çš„数组 - */ - List getDeployments(Set ids); - - /** - * 获得 id 对应的 Deployment - * - * @param id éƒ¨ç½²ç¼–å· - * @return æµç¨‹éƒ¨ç½² - */ - Deployment getDeployment(String id); - - /** - * 获得 Bpmn 模型 - * - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @return Bpmn 模型 - */ - BpmnModel getBpmnModel(String processDefinitionId); -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java deleted file mode 100644 index b54e95813..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java +++ /dev/null @@ -1,287 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; -import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.common.engine.impl.db.SuspensionState; -import org.flowable.common.engine.impl.util.io.BytesStreamSource; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.repository.ProcessDefinitionQuery; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; -import static java.util.Collections.emptyList; - -/** - * æµç¨‹å®šä¹‰å®žçŽ° - * 主è¦è¿›è¡Œ Flowable {@link ProcessDefinition} å’Œ {@link Deployment} 的维护 - * - * @author yunlongn - * @author ZJQ - * @author 芋é“æºç  - */ -@Service -@Validated -@Slf4j -public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { - - private static final String BPMN_FILE_SUFFIX = ".bpmn"; - - @Resource - private RepositoryService repositoryService; - - @Resource - private BpmProcessDefinitionExtMapper processDefinitionMapper; - - @Resource - private BpmFormService formService; - - @Override - public ProcessDefinition getProcessDefinition(String id) { - return repositoryService.getProcessDefinition(id); - } - - @Override - public ProcessDefinition getProcessDefinition2(String id) { - return repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); - } - - @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().processDefinitionKey(key).active().singleResult(); - } - - @Override - public List getDeployments(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 BpmnModel getBpmnModel(String processDefinitionId) { - return repositoryService.getBpmnModel(processDefinitionId); - } - - @Override - public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) { - // 创建 Deployment 部署 - Deployment deploy = repositoryService.createDeployment() - .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) - .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) - .deploy(); - - // 设置 ProcessDefinition çš„ category 分类 - ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), createReqDTO.getCategory()); - // æ³¨æ„ 1,ProcessDefinition çš„ key å’Œ name 是通过 BPMN 中的 çš„ id å’Œ name 决定 - // æ³¨æ„ 2,目å‰è¯¥é¡¹ç›®çš„设计上,需è¦ä¿è¯ Modelã€Deploymentã€ProcessDefinition 使用相åŒçš„ key,ä¿è¯å…³è”性。 - // å¦åˆ™ï¼Œä¼šå¯¼è‡´ ProcessDefinition 的分页无法查询到。 - if (!Objects.equals(definition.getKey(), createReqDTO.getKey())) { - throw exception(PROCESS_DEFINITION_KEY_NOT_MATCH, createReqDTO.getKey(), definition.getKey()); - } - if (!Objects.equals(definition.getName(), createReqDTO.getName())) { - throw exception(PROCESS_DEFINITION_NAME_NOT_MATCH, createReqDTO.getName(), definition.getName()); - } - - // æ’入拓展表 - BpmProcessDefinitionExtDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO) - .setProcessDefinitionId(definition.getId()); - processDefinitionMapper.insert(definitionDO); - return definition.getId(); - } - - @Override - public void updateProcessDefinitionState(String id, Integer state) { - // 激活 - if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { - repositoryService.activateProcessDefinitionById(id, false, null); - return; - } - // 挂起 - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { - // suspendProcessInstances = false,进行中的任务,ä¸è¿›è¡ŒæŒ‚起。 - // 原因:åªè¦æ–°çš„æµç¨‹ä¸å…许å‘èµ·å³å¯ï¼Œè€æµç¨‹ç»§ç»­å¯ä»¥æ‰§è¡Œã€‚ - repositoryService.suspendProcessDefinitionById(id, false, null); - return; - } - log.error("[updateProcessDefinitionState][æµç¨‹å®šä¹‰({}) 修改未知状æ€({})]", id, state); - } - - @Override - public String getProcessDefinitionBpmnXML(String id) { - BpmnModel bpmnModel = repositoryService.getBpmnModel(id); - if (bpmnModel == null) { - return null; - } - BpmnXMLConverter converter = new BpmnXMLConverter(); - return StrUtil.utf8Str(converter.convertToXML(bpmnModel)); - } - - @Override - public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) { - // 校验 nameã€description 是å¦æ›´æ–° - ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey()); - if (oldProcessDefinition == null) { - return false; - } - BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId()); - if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName()) - || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription()) - || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) { - return false; - } - // 校验 form ä¿¡æ¯æ˜¯å¦æ›´æ–° - if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType()) - || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId()) - || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf()) - || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields()) - || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath()) - || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) { - return false; - } - // 校验 BPMN XML ä¿¡æ¯ - BpmnModel newModel = buildBpmnModel(createReqDTO.getBpmnBytes()); - BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId()); - //TODO 貌似 flowable ä¸ä¿®æ”¹è¿™ä¸ªä¹Ÿä¸åŒã€‚需è¦çœ‹çœ‹ã€‚ sourceSystemId ä¸åŒ - if (FlowableUtils.equals(oldModel, newModel)) { - return false; - } - // 最终å‘现都一致,则返回 true - return true; - } - - /** - * 构建对应的 BPMN Model - * - * @param bpmnBytes 原始的 BPMN XML 字节数组 - * @return BPMN Model - */ - private BpmnModel buildBpmnModel(byte[] bpmnBytes) { - // 转æ¢æˆ BpmnModel 对象 - BpmnXMLConverter converter = new BpmnXMLConverter(); - return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true); - } - - - - @Override - public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) { - return processDefinitionMapper.selectByProcessDefinitionId(id); - } - - @Override - public List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) { - // 拼接查询æ¡ä»¶ - ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); - if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), listReqVO.getSuspensionState())) { - definitionQuery.suspended(); - } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), listReqVO.getSuspensionState())) { - definitionQuery.active(); - } - // 执行查询 - List processDefinitions = definitionQuery.list(); - if (CollUtil.isEmpty(processDefinitions)) { - return Collections.emptyList(); - } - - // 获得 BpmProcessDefinitionDO Map - List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( - convertList(processDefinitions, ProcessDefinition::getId)); - Map processDefinitionDOMap = convertMap(processDefinitionDOs, - BpmProcessDefinitionExtDO::getProcessDefinitionId); - // 执行查询,并返回 - return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap); - } - - @Override - public PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { - ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); - if (StrUtil.isNotBlank(pageVO.getKey())) { - definitionQuery.processDefinitionKey(pageVO.getKey()); - } - - // 执行查询 - List processDefinitions = definitionQuery.orderByProcessDefinitionVersion().desc() - .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - - if (CollUtil.isEmpty(processDefinitions)) { - return new PageResult<>(emptyList(), definitionQuery.count()); - } - // 获得 Deployment Map - Set deploymentIds = new HashSet<>(); - processDefinitions.forEach(definition -> addIfNotNull(deploymentIds, definition.getDeploymentId())); - Map deploymentMap = getDeploymentMap(deploymentIds); - - // 获得 BpmProcessDefinitionDO Map - List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( - convertList(processDefinitions, ProcessDefinition::getId)); - Map processDefinitionDOMap = convertMap(processDefinitionDOs, - BpmProcessDefinitionExtDO::getProcessDefinitionId); - - // 获得 Form Map - Set formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId); - Map formMap = formService.getFormMap(formIds); - - // 拼接结果 - long definitionCount = definitionQuery.count(); - return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap, - processDefinitionDOMap, formMap), definitionCount); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java deleted file mode 100644 index 079451597..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleService.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import org.springframework.lang.Nullable; - -import javax.validation.Valid; -import java.util.List; - -/** - * BPM 任务分é…规则 Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmTaskAssignRuleService { - - /** - * 获得æµç¨‹å®šä¹‰çš„任务分é…规则数组 - * - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @param taskDefinitionKey æµç¨‹ä»»åŠ¡å®šä¹‰çš„ Key。å…许空 - * @return 任务规则数组 - */ - List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, - @Nullable String taskDefinitionKey); - - /** - * 获得æµç¨‹æ¨¡åž‹çš„任务规则数组 - * - * @param modelId æµç¨‹æ¨¡åž‹çš„ç¼–å· - * @return 任务规则数组 - */ - List getTaskAssignRuleListByModelId(String modelId); - - /** - * 获得æµç¨‹å®šä¹‰çš„任务分é…规则数组 - * - * @param modelId æµç¨‹æ¨¡åž‹çš„ç¼–å· - * @param processDefinitionId æµç¨‹å®šä¹‰çš„ç¼–å· - * @return 任务规则数组 - */ - List getTaskAssignRuleList(String modelId, String processDefinitionId); - - /** - * 创建任务分é…规则 - * - * @param reqVO åˆ›å»ºä¿¡æ¯ - * @return è§„åˆ™ç¼–å· - */ - Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO); - - /** - * 更新任务分é…规则 - * - * @param reqVO åˆ›å»ºä¿¡æ¯ - */ - void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO); - - /** - * 判断指定æµç¨‹æ¨¡åž‹å’Œæµç¨‹å®šä¹‰çš„分é…规则是å¦ç›¸ç­‰ - * - * @param modelId æµç¨‹æ¨¡åž‹ç¼–å· - * @param processDefinitionId æµç¨‹å®šä¹‰ç¼–å· - * @return 是å¦ç›¸ç­‰ - */ - boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId); - - /** - * å°†æµç¨‹æµç¨‹æ¨¡åž‹çš„任务分é…规则,å¤åˆ¶ä¸€ä»½ç»™æµç¨‹å®šä¹‰ - * 目的:æ¯æ¬¡æµç¨‹æ¨¡åž‹éƒ¨ç½²æ—¶ï¼Œéƒ½ä¼šç”Ÿæˆä¸€ä¸ªæ–°çš„æµç¨‹å®šä¹‰ï¼Œæ­¤æ—¶è€ƒè™‘到æ¯æ¬¡éƒ¨ç½²çš„æµç¨‹ä¸å¯å˜æ€§ï¼Œæ‰€ä»¥éœ€è¦å¤åˆ¶ä¸€ä»½ç»™è¯¥æµç¨‹å®šä¹‰ - * - * @param fromModelId æµç¨‹æ¨¡åž‹ç¼–å· - * @param toProcessDefinitionId æµç¨‹å®šä¹‰ç¼–å· - */ - void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId); - - /** - * 校验æµç¨‹æ¨¡åž‹çš„任务分é…规则全部都é…置了 - * 目的:如果有规则未é…置,会导致æµç¨‹ä»»åŠ¡æ‰¾ä¸åˆ°è´Ÿè´£äººï¼Œè¿›è€Œæµç¨‹æ— æ³•è¿›è¡Œä¸‹åŽ»ï¼ - * - * @param id æµç¨‹æ¨¡åž‹ç¼–å· - */ - void checkTaskAssignRuleAllConfig(String id); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java deleted file mode 100644 index 7ed096cc0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java +++ /dev/null @@ -1,207 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.definition; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; -import cn.iocoder.yudao.module.bpm.convert.definition.BpmTaskAssignRuleConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; -import cn.iocoder.yudao.module.bpm.enums.DictTypeConstants; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.PostApi; -import cn.iocoder.yudao.module.system.api.dict.DictDataApi; -import cn.iocoder.yudao.module.system.api.permission.RoleApi; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.UserTask; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * BPM 任务分é…规则 Service 实现类 - */ -@Service -@Validated -@Slf4j -public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService{ - - @Resource - private BpmTaskAssignRuleMapper taskRuleMapper; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmModelService modelService; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmProcessDefinitionService processDefinitionService; - @Resource - private BpmUserGroupService userGroupService; - @Resource - private RoleApi roleApi; - @Resource - private DeptApi deptApi; - @Resource - private PostApi postApi; - @Resource - private AdminUserApi adminUserApi; - @Resource - private DictDataApi dictDataApi; - - @Override - public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, String taskDefinitionKey) { - return taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, taskDefinitionKey); - } - - @Override - public List getTaskAssignRuleListByModelId(String modelId) { - return taskRuleMapper.selectListByModelId(modelId); - } - - @Override - public List getTaskAssignRuleList(String modelId, String processDefinitionId) { - // 获得规则 - List rules = Collections.emptyList(); - BpmnModel model = null; - if (StrUtil.isNotEmpty(modelId)) { - rules = getTaskAssignRuleListByModelId(modelId); - model = modelService.getBpmnModel(modelId); - } else if (StrUtil.isNotEmpty(processDefinitionId)) { - rules = getTaskAssignRuleListByProcessDefinitionId(processDefinitionId, null); - model = processDefinitionService.getBpmnModel(processDefinitionId); - } - if (model == null) { - return Collections.emptyList(); - } - // 获得用户任务,åªæœ‰ç”¨æˆ·ä»»åŠ¡æ‰å¯ä»¥è®¾ç½®åˆ†é…规则 - List userTasks = FlowableUtils.getBpmnModelElements(model, UserTask.class); - if (CollUtil.isEmpty(userTasks)) { - return Collections.emptyList(); - } - // 转æ¢æ•°æ® - return BpmTaskAssignRuleConvert.INSTANCE.convertList(userTasks, rules); - } - - @Override - public Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO) { - // 校验å‚æ•° - validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); - // 校验是å¦å·²ç»é…ç½® - BpmTaskAssignRuleDO existRule = taskRuleMapper.selectListByModelIdAndTaskDefinitionKey( - reqVO.getModelId(), reqVO.getTaskDefinitionKey()); - if (existRule != null) { - throw exception(TASK_ASSIGN_RULE_EXISTS, reqVO.getModelId(), reqVO.getTaskDefinitionKey()); - } - - // 存储 - BpmTaskAssignRuleDO rule = BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO) - .setProcessDefinitionId(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL); // åªæœ‰æµç¨‹æ¨¡åž‹ï¼Œæ‰å…许新建 - taskRuleMapper.insert(rule); - return rule.getId(); - } - - @Override - public void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO) { - // 校验å‚æ•° - validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); - // 校验是å¦å­˜åœ¨ - BpmTaskAssignRuleDO existRule = taskRuleMapper.selectById(reqVO.getId()); - if (existRule == null) { - throw exception(TASK_ASSIGN_RULE_NOT_EXISTS); - } - // åªå…许修改æµç¨‹æ¨¡åž‹çš„规则 - if (!Objects.equals(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL, existRule.getProcessDefinitionId())) { - throw exception(TASK_UPDATE_FAIL_NOT_MODEL); - } - - // 执行更新 - taskRuleMapper.updateById(BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO)); - } - - @Override - public boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId) { - // 调用 VO 接å£çš„原因是,过滤掉æµç¨‹æ¨¡åž‹ä¸éœ€è¦çš„规则,ä¿æŒå’Œ copyTaskAssignRules 方法的一致性 - List modelRules = getTaskAssignRuleList(modelId, null); - List processInstanceRules = getTaskAssignRuleList(null, processDefinitionId); - if (modelRules.size() != processInstanceRules.size()) { - return false; - } - - // é历,匹é…对应的规则 - Map processInstanceRuleMap = CollectionUtils.convertMap(processInstanceRules, - BpmTaskAssignRuleRespVO::getTaskDefinitionKey); - for (BpmTaskAssignRuleRespVO modelRule : modelRules) { - BpmTaskAssignRuleRespVO processInstanceRule = processInstanceRuleMap.get(modelRule.getTaskDefinitionKey()); - if (processInstanceRule == null) { - return false; - } - if (!ObjectUtil.equals(modelRule.getType(), processInstanceRule.getType()) - || !ObjectUtil.equal(modelRule.getOptions(), processInstanceRule.getOptions())) { - return false; - } - } - return true; - } - - @Override - public void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId) { - List rules = getTaskAssignRuleList(fromModelId, null); - if (CollUtil.isEmpty(rules)) { - return; - } - // 开始å¤åˆ¶ - List newRules = BpmTaskAssignRuleConvert.INSTANCE.convertList2(rules); - newRules.forEach(rule -> rule.setProcessDefinitionId(toProcessDefinitionId).setId(null) - .setCreateTime(null).setUpdateTime(null)); - taskRuleMapper.insertBatch(newRules); - } - - @Override - public void checkTaskAssignRuleAllConfig(String id) { - // 一个用户任务都没é…置,所以无需é…置规则 - List taskAssignRules = getTaskAssignRuleList(id, null); - if (CollUtil.isEmpty(taskAssignRules)) { - return; - } - // 校验未é…置规则的任务 - taskAssignRules.forEach(rule -> { - if (CollUtil.isEmpty(rule.getOptions())) { - throw exception(MODEL_DEPLOY_FAIL_TASK_ASSIGN_RULE_NOT_CONFIG, rule.getTaskDefinitionName()); - } - }); - } - - private void validTaskAssignRuleOptions(Integer type, Set options) { - if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.ROLE.getType())) { - roleApi.validRoles(options); - } else if (ObjectUtils.equalsAny(type, BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), - BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { - deptApi.validDepts(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { - postApi.validPosts(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { - adminUserApi.validUsers(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { - userGroupService.validUserGroups(options); - } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { - dictDataApi.validDictDatas(DictTypeConstants.TASK_ASSIGN_SCRIPT, - CollectionUtils.convertSet(options, String::valueOf)); - } else { - throw new IllegalArgumentException(StrUtil.format("未知的规则类型({})", type)); - } - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java deleted file mode 100644 index 20d71ec24..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; - -import java.util.List; - -/** - * BPM 活动实例 Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmActivityService { - - /** - * 获得指定æµç¨‹å®žä¾‹çš„活动实例列表 - * - * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 活动实例列表 - */ - List getActivityListByProcessInstanceId(String processInstanceId); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java deleted file mode 100644 index fdab5a884..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.activity.BpmActivityRespVO; -import cn.iocoder.yudao.module.bpm.convert.task.BpmActivityConvert; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import lombok.extern.slf4j.Slf4j; - -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.HistoryService; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.image.ProcessDiagramGenerator; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.io.InputStream; -import java.util.Collections; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_BPMN_MODEL_NOT_EXISTS; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS; - -/** - * BPM 活动实例 Service 实现类 - * - * @author 芋é“æºç  - */ -@Service -@Slf4j -@Validated -public class BpmActivityServiceImpl implements BpmActivityService { - - @Resource - private HistoryService historyService; - - @Override - public List getActivityListByProcessInstanceId(String processInstanceId) { - List activityList = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId).list(); - return BpmActivityConvert.INSTANCE.convertList(activityList); - } - - - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java deleted file mode 100644 index c14866f8c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ /dev/null @@ -1,149 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; -import org.flowable.engine.delegate.event.FlowableCancelledEvent; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * æµç¨‹å®žä¾‹ Service æŽ¥å£ - * - * @author 芋é“æºç  - */ -public interface BpmProcessInstanceService { - - /** - * 获得æµç¨‹å®žä¾‹ - * - * @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 CollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); - } - - /** - * 获得æµç¨‹å®žä¾‹çš„分页 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹å®žä¾‹çš„分页 - */ - PageResult getMyProcessInstancePage(Long userId, - @Valid BpmProcessInstanceMyPageReqVO pageReqVO); - /** - * 创建æµç¨‹å®žä¾‹ï¼ˆæ供给å‰ç«¯ï¼‰ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqVO åˆ›å»ºä¿¡æ¯ - * @return å®žä¾‹çš„ç¼–å· - */ - String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO); - - /** - * 创建æµç¨‹å®žä¾‹ï¼ˆæ供给内部) - * - * @param userId ç”¨æˆ·ç¼–å· - * @param createReqDTO åˆ›å»ºä¿¡æ¯ - * @return å®žä¾‹çš„ç¼–å· - */ - String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO); - - /** - * 获得æµç¨‹å®žä¾‹ VO ä¿¡æ¯ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹å®žä¾‹ - */ - BpmProcessInstanceRespVO getProcessInstanceVO(String id); - - /** - * å–消æµç¨‹å®žä¾‹ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param cancelReqVO å–æ¶ˆä¿¡æ¯ - */ - void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO); - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹ - * - * @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 CollectionUtils.convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); - } - - /** - * 创建 ProcessInstance 拓展记录 - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void createProcessInstanceExt(ProcessInstance instance); - - /** - * æ›´æ–° ProcessInstance 拓展记录为å–消 - * - * @param event æµç¨‹å–消事件 - */ - void updateProcessInstanceExtCancel(FlowableCancelledEvent event); - - /** - * æ›´æ–° ProcessInstance æ‹“å±•è®°å½•ä¸ºå®Œæˆ - * - * @param instance æµç¨‹ä»»åŠ¡ - */ - void updateProcessInstanceExtComplete(ProcessInstance instance); - - /** - * æ›´æ–° ProcessInstance 拓展记录为ä¸é€šè¿‡ - * - * @param id æµç¨‹ç¼–å· - * @param reason ç†ç”±ã€‚例如说,审批ä¸é€šè¿‡æ—¶ï¼Œéœ€è¦ä¼ é€’该值 - */ - void updateProcessInstanceExtReject(String id, String reason); - - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java deleted file mode 100644 index daabf267f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ /dev/null @@ -1,309 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; -import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; -import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; -import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; -import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.delegate.event.FlowableCancelledEvent; -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.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF; - -/** - * æµç¨‹å®žä¾‹ Service 实现类 - * - * ProcessDefinition & ProcessInstance & Execution & Task 的关系: - * 1. https://blog.csdn.net/bobozai86/article/details/105210414 - * - * HistoricProcessInstance & ProcessInstance 的关系: - * 1.https://my.oschina.net/843294669/blog/719024 - * 简å•æ¥è¯´ï¼Œå‰è€… = åŽ†å² + è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ï¼ŒåŽè€…仅是è¿è¡Œä¸­çš„æµç¨‹å®žä¾‹ - * - * @author 芋é“æºç  - */ -@Service -@Validated -@Slf4j -public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { - - @Resource - private RuntimeService runtimeService; - @Resource - private BpmProcessInstanceExtMapper processInstanceExtMapper; - @Resource - @Lazy // 解决循环ä¾èµ– - private BpmTaskService taskService; - @Resource - private BpmProcessDefinitionService processDefinitionService; - @Resource - private HistoryService historyService; - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - @Resource - private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; - @Resource - private BpmMessageService messageService; - @Override - public ProcessInstance getProcessInstance(String id) { - return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); - } - - @Override - public List getProcessInstances(Set ids) { - return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); - } - - @Override - public PageResult getMyProcessInstancePage(Long userId, - BpmProcessInstanceMyPageReqVO pageReqVO) { - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 - PageResult pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return new PageResult<>(pageResult.getTotal()); - } - - // 获得æµç¨‹ Task Map - List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); - Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); - // 转æ¢è¿”回 - return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); - } - - @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); - } - - @Override - public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); - // å‘èµ·æµç¨‹ - return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); - } - - @Override - public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { - // 获得æµç¨‹å®žä¾‹ - HistoricProcessInstance processInstance = getHistoricProcessInstance(id); - if (processInstance == null) { - return null; - } - BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); - Assert.notNull(processInstanceExt, "æµç¨‹å®žä¾‹æ‹“展({}) ä¸å­˜åœ¨", id); - - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition processDefinition = processDefinitionService - .getProcessDefinition(processInstance.getProcessDefinitionId()); - Assert.notNull(processDefinition, "æµç¨‹å®šä¹‰({}) ä¸å­˜åœ¨", processInstance.getProcessDefinitionId()); - BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( - processInstance.getProcessDefinitionId()); - Assert.notNull(processDefinitionExt, "æµç¨‹å®šä¹‰æ‹“展({}) ä¸å­˜åœ¨", id); - String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); - - // 获得 User - AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); - DeptRespDTO dept = null; - if (startUser != null) { - dept = deptApi.getDept(startUser.getDeptId()); - } - - // 拼接结果 - return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, - processDefinition, processDefinitionExt, bpmnXml, startUser, dept); - } - - @Override - public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); - } - // åªèƒ½å–消自己的 - if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { - throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); - } - - // 通过删除æµç¨‹å®žä¾‹ï¼Œå®žçŽ°æµç¨‹å®žä¾‹çš„å–消, - // 删除æµç¨‹å®žä¾‹ï¼Œæ­£åˆ™æ‰§è¡Œä»»åŠ¡ACT_RU_TASK. 任务会被删除。通过历å²è¡¨æŸ¥è¯¢ - deleteProcessInstance(cancelReqVO.getId(), - BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); - } - - /** - * 获得历å²çš„æµç¨‹å®žä¾‹ - * - * @param id æµç¨‹å®žä¾‹çš„ç¼–å· - * @return 历å²çš„æµç¨‹å®žä¾‹ - */ - @Override - public HistoricProcessInstance getHistoricProcessInstance(String id) { - return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); - } - - @Override - public List getHistoricProcessInstances(Set ids) { - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); - } - - @Override - public void createProcessInstanceExt(ProcessInstance instance) { - // 获得æµç¨‹å®šä¹‰ - ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); - // æ’å…¥ BpmProcessInstanceExtDO 对象 - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() - .setProcessInstanceId(instance.getId()) - .setProcessDefinitionId(definition.getId()) - .setName(instance.getProcessDefinitionName()) - .setStartUserId(Long.valueOf(instance.getStartUserId())) - .setCategory(definition.getCategory()) - .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - - processInstanceExtMapper.insert(instanceExtDO); - } - - @Override - public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { - // 判断是å¦ä¸º Reject ä¸é€šè¿‡ã€‚如果是,则ä¸è¿›è¡Œæ›´æ–° - if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { - return; - } - - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - // å¦å¤–,此时如果去查询 ProcessInstance çš„è¯ï¼Œå­—段是ä¸å…¨çš„,所以去查询了 HistoricProcessInstance - HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); - // 更新拓展表 - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() - .setProcessInstanceId(event.getProcessInstanceId()) - .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); - - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - - @Override - public void updateProcessInstanceExtComplete(ProcessInstance instance) { - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - // å¦å¤–,此时如果去查询 ProcessInstance çš„è¯ï¼Œå­—段是ä¸å…¨çš„,所以去查询了 HistoricProcessInstance - HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); - // 更新拓展表 - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() - .setProcessInstanceId(instance.getProcessInstanceId()) - .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹è¢«é€šè¿‡çš„æ¶ˆæ¯ - messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance)); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - - @Transactional(rollbackFor = Exception.class) - public void updateProcessInstanceExtReject(String id, String reason) { - // 需è¦ä¸»åŠ¨æŸ¥è¯¢ï¼Œå› ä¸º instance åªæœ‰ id 属性 - ProcessInstance processInstance = getProcessInstance(id); - // 删除æµç¨‹å®žä¾‹ï¼Œä»¥å®žçŽ°é©³å›žä»»åŠ¡æ—¶ï¼Œå–消整个审批æµç¨‹ - deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); - - // æ›´æ–° status + result - // 注æ„,ä¸èƒ½å’Œä¸Šé¢çš„逻辑更æ¢ä½ç½®ã€‚因为 deleteProcessInstance 会触å‘æµç¨‹çš„å–消,进而调用 updateProcessInstanceExtCancel 方法, - // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result ä¸ä¸€å®šæ˜¯ä¸€è‡´çš„ - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - - // å‘é€æµç¨‹è¢«ä¸é€šè¿‡çš„æ¶ˆæ¯ - messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); - - // å‘é€æµç¨‹å®žä¾‹çš„状æ€äº‹ä»¶ - processInstanceResultEventPublisher.sendProcessInstanceResultEvent( - BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); - } - - private void deleteProcessInstance(String id, String reason) { - runtimeService.deleteProcessInstance(id, reason); - } - - private String createProcessInstance0(Long userId, ProcessDefinition definition, - Map variables, String businessKey) { - // 校验æµç¨‹å®šä¹‰ - if (definition == null) { - throw exception(PROCESS_DEFINITION_NOT_EXISTS); - } - if (definition.isSuspended()) { - throw exception(PROCESS_DEFINITION_IS_SUSPENDED); - } - - // 创建æµç¨‹å®žä¾‹ - ProcessInstance instance = runtimeService.startProcessInstanceById(definition.getId(), businessKey, variables); - // 设置æµç¨‹åå­— - runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); - - // 补全æµç¨‹å®žä¾‹çš„拓展表 - //TODO startProcessInstanceæµç¨‹é‡Œé¢ä¿®æ”¹äº† BpmProcessInstanceExt,没有æ交,和下é¢çš„æ›´æ–° é”æŒæœ‰å†²çªäº†ï¼Œå¼‚步更新这个表 -// processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()).setFormVariables(variables)); - BpmProcessInstanceExtDO bpmProcessInstanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()).setFormVariables(variables); - asyncUpdateProcesInstance(bpmProcessInstanceExtDO); - return instance.getId(); - } - - @Async - public void asyncUpdateProcesInstance(BpmProcessInstanceExtDO bpmProcessInstanceExtDO){ - log.info("asyncUpdateProcesInstance ,cause MySQL Dead Lock"); - processInstanceExtMapper.updateByProcessInstanceId(bpmProcessInstanceExtDO); - - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java deleted file mode 100644 index 00a0a8662..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ /dev/null @@ -1,123 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import org.flowable.task.api.Task; - - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service æŽ¥å£ - * - * @author jason - * @author 芋é“æºç  - */ -public interface BpmTaskService { - /** - * 获得待办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO); - /** - * 获得已办的æµç¨‹ä»»åŠ¡åˆ†é¡µ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param pageReqVO 分页请求 - * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ - */ - PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO 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 æµç¨‹å®žä¾‹çš„ç¼–å· - * @return æµç¨‹ä»»åŠ¡åˆ—表 - */ - List getTaskListByProcessInstanceId(String processInstanceId); - - /** - * 通过任务 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 通过请求 - */ - void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); - - /** - * ä¸é€šè¿‡ä»»åŠ¡ - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO ä¸é€šè¿‡è¯·æ±‚ - */ - void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); - /** - * 回退任务 - * - * @param taskId ä»»åŠ¡ç¼–å· - */ - void backTask(String taskId,String destinationTaskDefKey); - - /** - * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 - * - * @param userId ç”¨æˆ·ç¼–å· - * @param reqVO 分é…请求 - */ - void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO); - - /** - * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 - * - * @param id æµç¨‹ä»»åŠ¡ç¼–å· - * @param userId ç”¨æˆ·ç¼–å· - */ - void updateTaskAssignee(String id, Long userId); - - /** - * 创建 Task 拓展记录 - * - * @param task 任务实体 - */ - void createTaskExt(Task task); - - /** - * æ›´æ–° Task æ‹“å±•è®°å½•ä¸ºå®Œæˆ - * - * @param task 任务实体 - */ - void updateTaskExtComplete(Task task); - - /** - * æ›´æ–° Task 拓展记录,并å‘é€é€šçŸ¥ - * - * @param task 任务实体 - */ - void updateTaskExtAssign(Task task); - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java deleted file mode 100644 index ac1f80907..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ /dev/null @@ -1,283 +0,0 @@ -package cn.iocoder.yudao.module.bpm.service.task; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.framework.common.util.object.PageUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; -import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; -import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; - -/** - * æµç¨‹ä»»åŠ¡å®žä¾‹ Service 实现类 - * - * @author 芋é“æºç  - * @author jason - */ -@Slf4j -@Service -public class BpmTaskServiceImpl implements BpmTaskService{ - - @Resource - private TaskService taskService; - @Resource - private RuntimeService runtimeService; - @Resource - private HistoryService historyService; - - @Resource - private BpmProcessInstanceService processInstanceService; - @Resource - private AdminUserApi adminUserApi; - @Resource - private DeptApi deptApi; - @Resource - private BpmTaskExtMapper taskExtMapper; - @Resource - private BpmMessageService messageService; - - @Override - public PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { - // 查询待办任务 - TaskQuery taskQuery = taskService.createTaskQuery() - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .orderByTaskCreateTime().desc(); // åˆ›å»ºæ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (pageVO.getBeginCreateTime() != null) { - taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime()); - } - if (pageVO.getEndCreateTime() != null) { - taskQuery.taskCreatedBefore(pageVO.getEndCreateTime()); - } - // 执行查询 - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - if (CollUtil.isEmpty(tasks)) { - return PageResult.empty(taskQuery.count()); - } - - // 获得 ProcessInstance Map - Map processInstanceMap = processInstanceService.getProcessInstanceMap( - convertSet(tasks, Task::getProcessInstanceId)); - // 获得 User Map - Map userMap = adminUserApi.getUserMap( - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - // 拼接结果 - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), - taskQuery.count()); - } - - @Override - public PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { - // 查询已办任务 - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() - .finished() // å·²å®Œæˆ - .taskAssignee(String.valueOf(userId)) // 分é…给自己 - .orderByHistoricTaskInstanceEndTime().desc(); // å®¡æ‰¹æ—¶é—´å€’åº - if (StrUtil.isNotBlank(pageVO.getName())) { - taskQuery.taskNameLike("%" + pageVO.getName() + "%"); - } - if (pageVO.getBeginCreateTime() != null) { - taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime()); - } - if (pageVO.getEndCreateTime() != null) { - taskQuery.taskCreatedBefore(pageVO.getEndCreateTime()); - } - // 执行查询 - List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); - if (CollUtil.isEmpty(tasks)) { - return PageResult.empty(taskQuery.count()); - } - - // 获得 TaskExtDO Map - List bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); - Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); - // 获得 ProcessInstance Map - Map historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( - convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); - // 获得 User Map - Map userMap = adminUserApi.getUserMap( - convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - // 拼接结果 - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), - taskQuery.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) { - // 获得任务列表 - List tasks = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricTaskInstanceStartTime().desc() // åˆ›å»ºæ—¶é—´å€’åº - .list(); - if (CollUtil.isEmpty(tasks)) { - return Collections.emptyList(); - } - - // 获得 TaskExtDO Map - List bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); - Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); - // 获得 ProcessInstance Map - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); - // 获得 User Map - Set userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee())); - userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); - Map userMap = adminUserApi.getUserMap(userIds); - // 获得 Dept Map - Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); - - // æ‹¼æŽ¥æ•°æ® - return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { - // 校验任务存在 - Task task = checkTask(userId, reqVO.getId()); - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - - // 完æˆä»»åŠ¡ï¼Œå®¡æ‰¹é€šè¿‡ - taskService.complete(task.getId(), instance.getProcessVariables()); - // 更新任务拓展表为通过 - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()).setReason(reqVO.getReason())); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { - Task task = checkTask(userId, reqVO.getId()); - // 校验æµç¨‹å®žä¾‹å­˜åœ¨ - ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - if (instance == null) { - throw exception(PROCESS_INSTANCE_NOT_EXISTS); - } - - // æ›´æ–°æµç¨‹å®žä¾‹ä¸ºä¸é€šè¿‡ - processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getReason()); - - // 更新任务拓展表为ä¸é€šè¿‡ - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()).setReason(reqVO.getReason())); - } - - @Override - public void backTask(String taskId,String destinationTaskDefKey) { - Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); - - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(currentTask.getProcessInstanceId()) - .moveActivityIdTo(currentTask.getTaskDefinitionKey(), destinationTaskDefKey) - .changeState(); - } - - @Override - public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) { - // 校验任务存在 - Task task = checkTask(userId, reqVO.getId()); - // 更新负责人 - updateTaskAssignee(task.getId(), reqVO.getAssigneeUserId()); - } - - @Override - public void updateTaskAssignee(String id, Long userId) { - taskService.setAssignee(id, String.valueOf(userId)); - } - - - @Override - public void createTaskExt(Task task) { - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - taskExtMapper.insert(taskExtDO); - } - - @Override - public void updateTaskExtComplete(Task task) { - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) - .setEndTime(new Date()); - taskExtMapper.updateByTaskId(taskExtDO); - } - - @Override - public void updateTaskExtAssign(Task task) { - BpmTaskExtDO taskExtDO = new BpmTaskExtDO() - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())) - .setTaskId(task.getId()); - taskExtMapper.updateByTaskId(taskExtDO); - // å‘é€é€šçŸ¥ã€‚在事务æ交时,批é‡æ‰§è¡Œæ“作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监å¬äº‹åŠ¡çš„æ交æ¥å®žçŽ°ã€‚ - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public void afterCommit() { - ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); - messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); - } - }); - } - - /** - * 校验任务是å¦å­˜åœ¨ï¼Œ 并且是å¦æ˜¯åˆ†é…给自己的任务 - * @param userId 用户 id - * @param taskId task id - */ - private Task checkTask(Long userId, String taskId) { - Task task = getTask(taskId); - if (task == null) { - throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); - } - if (!Objects.equals(userId, NumberUtils.parseLong(task.getAssignee()))) { - throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); - } - return task; - } - - private Task getTask(String id) { - return taskService.createTaskQuery().taskId(id).singleResult(); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/AbstractOATest.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/AbstractOATest.java deleted file mode 100644 index f8dae183b..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/AbstractOATest.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.iocoder.yudao.module.bpm; - -import org.flowable.engine.*; -import org.flowable.engine.impl.ProcessEngineImpl; -import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.flowable.engine.impl.test.TestHelper; -import org.flowable.engine.test.FlowableRule; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; - -/** - * 抽象测试基类 - * - * @author henryyan cuicui - */ -public abstract class AbstractOATest { - - protected String configurationResource = "flowable.cfg.xml"; - - /** - * 专门用于测试套件 - */ - @Rule - public FlowableRule activitiRule = new FlowableRule("flowable.cfg.xml"); - - protected ProcessEngineConfigurationImpl processEngineConfiguration; - - protected ProcessEngine processEngine; - protected RepositoryService repositoryService; - protected RuntimeService runtimeService; - protected TaskService taskService; - protected HistoryService historyService; - protected IdentityService identityService; - protected ManagementService managementService; - protected FormService formService; - - /** - * 开始测试 - */ - @BeforeClass - public static void setUpForClass() throws Exception { - System.out.println("++++++++ 开始测试 ++++++++"); - } - - /** - * 结æŸæµ‹è¯• - */ - @AfterClass - public static void testOverForClass() throws Exception { - System.out.println("-------- 结æŸæµ‹è¯• --------"); - } - - protected void initializeProcessEngine() { - processEngine = TestHelper.getProcessEngine(configurationResource); - } - - /** - * åˆå§‹åŒ–å˜é‡ - */ - @Before - public void setUp() throws Exception { - if (processEngine == null) { - initializeProcessEngine(); - } - - processEngineConfiguration = ((ProcessEngineImpl) processEngine).getProcessEngineConfiguration(); - repositoryService = processEngine.getRepositoryService(); - runtimeService = processEngine.getRuntimeService(); - taskService = processEngine.getTaskService(); - historyService = processEngine.getHistoryService(); - identityService = processEngine.getIdentityService(); - managementService = processEngine.getManagementService(); - formService = processEngine.getFormService(); - } - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/ConditionTest.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/ConditionTest.java deleted file mode 100644 index 1dd73e712..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/ConditionTest.java +++ /dev/null @@ -1,226 +0,0 @@ -package cn.iocoder.yudao.module.bpm; - -import org.flowable.engine.history.HistoricDetail; -import org.flowable.engine.history.HistoricFormProperty; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricVariableUpdate; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.test.Deployment; -import org.flowable.task.api.Task; -import org.joda.time.DateTime; -import org.junit.Test; - -import java.text.SimpleDateFormat; -import java.util.*; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * æ¡ä»¶æµ‹è¯• - * 1 æŸä¸ªèŠ‚点-支付é¢åº¦éœ€è¦å¤§äºŽ70% - * 2 支付æ¡ä»¶å®ŒæˆåŽ,开始倒计时15天,è¦å®Œæˆæµç¨‹å¤„ç† - * @author cuicui - */ -public class ConditionTest extends AbstractOATest { - - @Test - @Deployment(resources = {"chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn", "chapter6/leave-timeLimit-money/leave-start.form", - "chapter6/leave-timeLimit-money/approve-deptLeader.form", "chapter6/leave-timeLimit-money/approve-hr.form", "chapter6/leave-timeLimit-money/report-back.form", - "chapter6/leave-timeLimit-money/modify-apply.form"}) - public void allPass() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Map variables = new HashMap(); - Calendar ca = Calendar.getInstance(); - String startDate = sdf.format(ca.getTime()); - ca.add(Calendar.DAY_OF_MONTH, 2); // 当å‰æ—¥æœŸåŠ 2天 - String endDate = sdf.format(ca.getTime()); - - // å¯åŠ¨æµç¨‹ - variables.put("startDate", startDate); - variables.put("endDate", endDate); - variables.put("reason", "公休"); - - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult(); - - // 读å–å¯åŠ¨è¡¨å• - Object renderedStartForm = formService.getRenderedStartForm(processDefinition.getId()); - assertNotNull(renderedStartForm); - - // å¯åŠ¨æµç¨‹ - // 设置当å‰ç”¨æˆ· - String currentUserId = "henryyan"; - identityService.setAuthenticatedUserId(currentUserId); - ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), variables); - assertNotNull(processInstance); - - // 部门领导审批通过 - Task deptLeaderTask = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult(); - assertNotNull(formService.getRenderedTaskForm(deptLeaderTask.getId())); - variables = new HashMap(); - variables.put("deptLeaderApproved", "true"); - formService.submitTaskFormData(deptLeaderTask.getId(), variables); - - // 人事审批通过 - Task hrTask = taskService.createTaskQuery().taskCandidateGroup("hr").singleResult(); - assertNotNull(formService.getRenderedTaskForm(hrTask.getId())); - variables = new HashMap(); - variables.put("hrApproved", "true"); - //æ‰‹åŠ¨è®¾ç½®æ”¯ä»˜é‡‘é¢ - variables.put("amountMoney", "19999"); - formService.submitTaskFormData(hrTask.getId(), variables); - //判断支付金é¢æ˜¯å¦>1万元 - // 财务打款通过 - Task caiwuTask = taskService.createTaskQuery().taskCandidateGroup("caiwu").singleResult(); - printTask(caiwuTask); - taskService.complete(caiwuTask.getId()); - //判断倒计时15天 - Task chuNaTask = taskService.createTaskQuery().taskCandidateGroup("chuNa").singleResult(); - printTask(chuNaTask); - taskService.complete(chuNaTask.getId()); - - // 销å‡ï¼ˆæ ¹æ®ç”³è¯·äººçš„用户ID读å–) -// Task reportBackTask = taskService.createTaskQuery().taskAssignee(currentUserId).singleResult(); -// assertNotNull(formService.getRenderedTaskForm(reportBackTask.getId())); -// variables = new HashMap(); -// variables.put("reportBackDate", sdf.format(ca.getTime())); -// formService.submitTaskFormData(reportBackTask.getId(), variables); - - // 验è¯æµç¨‹æ˜¯å¦å·²ç»ç»“æŸ - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().finished().singleResult(); - assertNotNull(historicProcessInstance); - - // 读å–历å²å˜é‡ - Map historyVariables = packageVariables(processInstance); - - // 验è¯æ‰§è¡Œç»“æžœ - assertEquals("ok", historyVariables.get("result")); - - } - - /** - * 查询过期任务 - * @throws Exception - */ - @Test - @Deployment(resources = {"chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn", "chapter6/leave-timeLimit-money/leave-start.form", - "chapter6/leave-timeLimit-money/approve-deptLeader.form", "chapter6/leave-timeLimit-money/approve-hr.form", "chapter6/leave-timeLimit-money/report-back.form", - "chapter6/leave-timeLimit-money/modify-apply.form"}) - public void dueDate() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Map variables = new HashMap(); - Calendar ca = Calendar.getInstance(); - String startDate = sdf.format(ca.getTime()); - ca.add(Calendar.DAY_OF_MONTH, 2); // 当å‰æ—¥æœŸåŠ 2天 - String endDate = sdf.format(ca.getTime()); - - // å¯åŠ¨æµç¨‹ - variables.put("startDate", startDate); - variables.put("endDate", endDate); - variables.put("reason", "公休"); - - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult(); - - // 读å–å¯åŠ¨è¡¨å• - Object renderedStartForm = formService.getRenderedStartForm(processDefinition.getId()); - assertNotNull(renderedStartForm); - - // å¯åŠ¨æµç¨‹ - // 设置当å‰ç”¨æˆ· - String currentUserId = "henryyan"; - identityService.setAuthenticatedUserId(currentUserId); - ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), variables); - assertNotNull(processInstance); - - // 部门领导审批通过 - Task deptLeaderTask = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult(); - assertNotNull(formService.getRenderedTaskForm(deptLeaderTask.getId())); - variables = new HashMap(); - variables.put("deptLeaderApproved", "true"); - formService.submitTaskFormData(deptLeaderTask.getId(), variables); - - // 人事审批通过 - Task hrTask = taskService.createTaskQuery().taskCandidateGroup("hr").singleResult(); - assertNotNull(formService.getRenderedTaskForm(hrTask.getId())); - variables = new HashMap(); - variables.put("hrApproved", "true"); - //æ‰‹åŠ¨è®¾ç½®æ”¯ä»˜é‡‘é¢ - variables.put("amountMoney", "19999"); - formService.submitTaskFormData(hrTask.getId(), variables); - //判断支付金é¢æ˜¯å¦>1万元 - // 财务打款通过 - Task caiwuTask = taskService.createTaskQuery().taskCandidateGroup("caiwu").singleResult(); - printTask(caiwuTask); - - //设置5天å‰å°±è¿‡æœŸäº† - DateTime dateTime = DateTime.now(); - DateTime minusDays = dateTime.minusDays(5); - taskService.setDueDate(caiwuTask.getId(),minusDays.toDate()); - //查询今天以å‰çš„过期任务 - List listTask = taskService.createTaskQuery().taskDueBefore(new Date()).list(); - for (Task task : listTask) { - printTask(task); - } - - // 销å‡ï¼ˆæ ¹æ®ç”³è¯·äººçš„用户ID读å–) -// Task reportBackTask = taskService.createTaskQuery().taskAssignee(currentUserId).singleResult(); -// assertNotNull(formService.getRenderedTaskForm(reportBackTask.getId())); -// variables = new HashMap(); -// variables.put("reportBackDate", sdf.format(ca.getTime())); -// formService.submitTaskFormData(reportBackTask.getId(), variables); - - // 验è¯æµç¨‹æ˜¯å¦å·²ç»ç»“æŸ - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().finished().singleResult(); - assertNotNull(historicProcessInstance); - - // 读å–历å²å˜é‡ - Map historyVariables = packageVariables(processInstance); - - // 验è¯æ‰§è¡Œç»“æžœ - assertEquals("ok", historyVariables.get("result")); - - } - - /** - * ä»»æ„æµç¨‹çš„跳转 - */ - @Test - public void taskJump(){ - // 当å‰ä»»åŠ¡ - String taskId="ddd"; - Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); - String assignee = "下一个自由跳转人"; - taskService.setAssignee(taskId,assignee); - // 自由跳转 - String taskDefKey="目标-任务å称"; - //moveActivityIdTo的两个å‚数,æºä»»åŠ¡key,目标任务key - runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(), taskDefKey).changeState(); - - } - - - /** - * 读å–历å²å˜é‡å¹¶å°è£…到Map中 - */ - private Map packageVariables(ProcessInstance processInstance) { - Map historyVariables = new HashMap(); - List list = historyService.createHistoricDetailQuery().processInstanceId(processInstance.getId()).list(); - for (HistoricDetail historicDetail : list) { - if (historicDetail instanceof HistoricFormProperty) { - // 表å•ä¸­çš„字段 - HistoricFormProperty field = (HistoricFormProperty) historicDetail; - historyVariables.put(field.getPropertyId(), field.getPropertyValue()); - System.out.println("form field: taskId=" + field.getTaskId() + ", " + field.getPropertyId() + " = " + field.getPropertyValue()); - } else if (historicDetail instanceof HistoricVariableUpdate) { - HistoricVariableUpdate variable = (HistoricVariableUpdate) historicDetail; - historyVariables.put(variable.getVariableName(), variable.getValue()); - System.out.println("variable: " + variable.getVariableName() + " = " + variable.getValue()); - } - } - return historyVariables; - } - private void printTask(Task task){ - System.out.println(task.getName()+" : " + task.getDueDate()); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/LeaveFormKeyTest.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/LeaveFormKeyTest.java deleted file mode 100644 index da99fec3d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/LeaveFormKeyTest.java +++ /dev/null @@ -1,177 +0,0 @@ -package cn.iocoder.yudao.module.bpm; - -import org.flowable.engine.history.HistoricDetail; -import org.flowable.engine.history.HistoricFormProperty; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricVariableUpdate; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.test.Deployment; -import org.flowable.task.api.Task; -import org.junit.Test; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * @author henryyan - */ -public class LeaveFormKeyTest extends AbstractOATest { - - @Test - @Deployment(resources = {"chapter6/leave-formkey/leave-formkey.bpmn", "chapter6/leave-formkey/leave-start.form", - "chapter6/leave-formkey/approve-deptLeader.form", "chapter6/leave-formkey/approve-hr.form", "chapter6/leave-formkey/report-back.form", - "chapter6/leave-formkey/modify-apply.form"}) - public void allPass() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Map variables = new HashMap(); - Calendar ca = Calendar.getInstance(); - String startDate = sdf.format(ca.getTime()); - ca.add(Calendar.DAY_OF_MONTH, 2); // 当å‰æ—¥æœŸåŠ 2天 - String endDate = sdf.format(ca.getTime()); - - // å¯åŠ¨æµç¨‹ - variables.put("startDate", startDate); - variables.put("endDate", endDate); - variables.put("reason", "公休"); - - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult(); - - // 读å–å¯åŠ¨è¡¨å• - Object renderedStartForm = formService.getRenderedStartForm(processDefinition.getId()); - assertNotNull(renderedStartForm); - - // å¯åŠ¨æµç¨‹ - // 设置当å‰ç”¨æˆ· - String currentUserId = "henryyan"; - identityService.setAuthenticatedUserId(currentUserId); - ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), variables); - assertNotNull(processInstance); - - // 部门领导审批通过 - Task deptLeaderTask = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult(); - assertNotNull(formService.getRenderedTaskForm(deptLeaderTask.getId())); - variables = new HashMap(); - variables.put("deptLeaderApproved", "true"); - formService.submitTaskFormData(deptLeaderTask.getId(), variables); - - // 人事审批通过 - Task hrTask = taskService.createTaskQuery().taskCandidateGroup("hr").singleResult(); - assertNotNull(formService.getRenderedTaskForm(hrTask.getId())); - variables = new HashMap(); - variables.put("hrApproved", "true"); - formService.submitTaskFormData(hrTask.getId(), variables); - - // 销å‡ï¼ˆæ ¹æ®ç”³è¯·äººçš„用户ID读å–) - Task reportBackTask = taskService.createTaskQuery().taskAssignee(currentUserId).singleResult(); - assertNotNull(formService.getRenderedTaskForm(reportBackTask.getId())); - variables = new HashMap(); - variables.put("reportBackDate", sdf.format(ca.getTime())); - formService.submitTaskFormData(reportBackTask.getId(), variables); - - // 验è¯æµç¨‹æ˜¯å¦å·²ç»ç»“æŸ - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().finished().singleResult(); - assertNotNull(historicProcessInstance); - - // 读å–历å²å˜é‡ - Map historyVariables = packageVariables(processInstance); - - // 验è¯æ‰§è¡Œç»“æžœ - assertEquals("ok", historyVariables.get("result")); - - } - - /** - * ä»»æ„æµç¨‹çš„跳转 - */ - @Test - public void taskJump(){ - // 当å‰ä»»åŠ¡ - String taskId="ddd"; - Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); - String assignee = "下一个自由跳转人"; - taskService.setAssignee(taskId,assignee); - // 自由跳转 - String taskDefKey="目标-任务å称"; - //moveActivityIdTo的两个å‚数,æºä»»åŠ¡key,目标任务key - runtimeService.createChangeActivityStateBuilder().processInstanceId(task.getProcessInstanceId()).moveActivityIdTo(task.getTaskDefinitionKey(), taskDefKey).changeState(); - - } - - /** - * 领导驳回åŽç”³è¯·äººå–消申请 - */ - @Test - @Deployment(resources = "chapter6/dynamic-form/leave.bpmn") - public void cancelApply() throws Exception { - - // 设置当å‰ç”¨æˆ· - String currentUserId = "henryyan"; - identityService.setAuthenticatedUserId(currentUserId); - - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave").singleResult(); - - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Map variables = new HashMap(); - Calendar ca = Calendar.getInstance(); - String startDate = sdf.format(ca.getTime()); - ca.add(Calendar.DAY_OF_MONTH, 2); - String endDate = sdf.format(ca.getTime()); - - // å¯åŠ¨æµç¨‹ - variables.put("startDate", startDate); - variables.put("endDate", endDate); - variables.put("reason", "公休"); - ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), variables); - assertNotNull(processInstance); - - // 部门领导审批通过 - Task deptLeaderTask = taskService.createTaskQuery().taskCandidateGroup("deptLeader").singleResult(); - variables = new HashMap(); - variables.put("deptLeaderApproved", "false"); - formService.submitTaskFormData(deptLeaderTask.getId(), variables); - - // 调整申请 - Task modifyApply = taskService.createTaskQuery().taskAssignee(currentUserId).singleResult(); - variables = new HashMap(); - variables.put("reApply", "false"); - variables.put("startDate", startDate); - variables.put("endDate", endDate); - variables.put("reason", "公休"); - formService.submitTaskFormData(modifyApply.getId(), variables); - - // 读å–历å²å˜é‡ - Map historyVariables = packageVariables(processInstance); - - // 验è¯æ‰§è¡Œç»“æžœ - assertEquals("canceled", historyVariables.get("result")); - - } - - /** - * 读å–历å²å˜é‡å¹¶å°è£…到Map中 - */ - private Map packageVariables(ProcessInstance processInstance) { - Map historyVariables = new HashMap(); - List list = historyService.createHistoricDetailQuery().processInstanceId(processInstance.getId()).list(); - for (HistoricDetail historicDetail : list) { - if (historicDetail instanceof HistoricFormProperty) { - // 表å•ä¸­çš„字段 - HistoricFormProperty field = (HistoricFormProperty) historicDetail; - historyVariables.put(field.getPropertyId(), field.getPropertyValue()); - System.out.println("form field: taskId=" + field.getTaskId() + ", " + field.getPropertyId() + " = " + field.getPropertyValue()); - } else if (historicDetail instanceof HistoricVariableUpdate) { - HistoricVariableUpdate variable = (HistoricVariableUpdate) historicDetail; - historyVariables.put(variable.getVariableName(), variable.getValue()); - System.out.println("variable: " + variable.getVariableName() + " = " + variable.getValue()); - } - } - return historyVariables; - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/MultiInstancesTest.java b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/MultiInstancesTest.java deleted file mode 100644 index 4244db086..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/java/cn/iocoder/yudao/module/bpm/MultiInstancesTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package cn.iocoder.yudao.module.bpm; - -import org.flowable.engine.history.HistoricDetail; -import org.flowable.engine.history.HistoricFormProperty; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricVariableUpdate; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.test.Deployment; -import org.flowable.task.api.Task; -import org.junit.Test; - -import java.text.SimpleDateFormat; -import java.util.*; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * @author henryyan - * testMultiInstanceForUserTask 会签 - * cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.BpmUserTaskActivityBehavior#handleAssignments(org.flowable.task.service.TaskService, java.lang.String, java.lang.String, java.util.List, java.util.List, org.flowable.task.service.impl.persistence.entity.TaskEntity, org.flowable.common.engine.impl.el.ExpressionManager, org.flowable.engine.delegate.DelegateExecution, org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl) - * - * å‘ç”Ÿäº†æ­»é” - * cn.iocoder.yudao.module.bpm.controller.admin.task.BpmProcessInstanceController#createProcessInstance(cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO) - * 执行了两次,任务分é…到了åŒä¸€ä¸ªäºº - */ -public class MultiInstancesTest extends AbstractOATest { - - /** - * Java Service多实例(是å¦é¡ºåºç»“果一样) - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceFixedNumbers.bpmn"}) - public void testParallel() throws Exception { - Map variables = new HashMap(); - long loop = 3; - variables.put("loop", loop); - variables.put("counter", 0); // 计数器 - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testMultiInstanceFixedNumbers", variables); - Object variable = runtimeService.getVariable(processInstance.getId(), "counter"); - assertEquals(loop, variable); - } - - /** - * 用户任务多实例--é¡ºåº - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.sequential.bpmn"}) - public void testForUserSequence() throws Exception { - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask"); - long count = taskService.createTaskQuery().processInstanceId(processInstance.getId()).count(); - assertEquals(1, count); - - Task task = taskService.createTaskQuery().singleResult(); - taskService.complete(task.getId()); - count = taskService.createTaskQuery().processInstanceId(processInstance.getId()).count(); - assertEquals(1, count); - - task = taskService.createTaskQuery().singleResult(); - taskService.complete(task.getId()); - count = taskService.createTaskQuery().processInstanceId(processInstance.getId()).count(); - assertEquals(1, count); - - task = taskService.createTaskQuery().singleResult(); - taskService.complete(task.getId()); - count = taskService.createTaskQuery().processInstanceId(processInstance.getId()).count(); - assertEquals(0, count); - } - - /** - * 用户任务多实例--并行 - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.nosequential.bpmn"}) - public void testForUserNoSequential() throws Exception { - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask"); - long count = taskService.createTaskQuery().processInstanceId(processInstance.getId()).count(); - assertEquals(3, count); - } - - /** - * 用户任务多实例,通过用户数é‡å†³å®šå®žä¾‹ä¸ªæ•°--并行 - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.users.nosequential.bpmn"}) - public void testForUserCreateByUsersNoSequential() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("user1", "user2", "user3"); - variables.put("users", users); - runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask", variables); - for (String userId : users) { - assertEquals(1, taskService.createTaskQuery().taskAssignee(userId).count()); - } - } - - /** - * 用户任务多实例,通过用户数é‡å†³å®šå®žä¾‹ä¸ªæ•°--é¡ºåº - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.bpmn"}) - public void testForUserCreateByUsersSequential() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("user1", "user2", "user3"); - variables.put("users", users); - runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask", variables); - for (String userId : users) { - Task task = taskService.createTaskQuery().taskAssignee(userId).singleResult(); - taskService.complete(task.getId()); - } - } - - /** - * 用户任务多实例,按照任务完æˆçš„百分比比率决定是å¦æå‰ç»“æŸæµç¨‹ - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.bpmn"}) - public void testForUserCreateByUsersSequentialWithCompleteCondition() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("user1", "user2", "user3"); - variables.put("users", users); - variables.put("rate", 0.6d); - runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask", variables); - - Task task = taskService.createTaskQuery().taskAssignee("user1").singleResult(); - taskService.complete(task.getId()); - - task = taskService.createTaskQuery().taskAssignee("user2").singleResult(); - taskService.complete(task.getId()); - - long count = historyService.createHistoricProcessInstanceQuery().finished().count(); - assertEquals(1, count); - - } - - /** - * 用户任务多实例,按照任务完æˆçš„百分比比率决定是å¦æå‰ç»“æŸæµç¨‹ - */ - @Test - @Deployment(resources = {"diagrams/chapter9/testMultiInstanceForUserTask.exception.bpmn"}) - public void testForUserCreateByUsersException() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("user1", "user2", "user3"); - variables.put("users", users); - runtimeService.startProcessInstanceByKey("testMultiInstanceForUserTask", variables); - - Task task = taskService.createTaskQuery().taskAssignee("user1").singleResult(); - taskService.complete(task.getId()); - - task = taskService.createTaskQuery().taskAssignee("user2").singleResult(); - taskService.complete(task.getId()); - - task = taskService.createTaskQuery().taskAssignee("user3").singleResult(); - taskService.complete(task.getId()); - - List list = taskService.createTaskQuery().list(); - for (Task task2 : list) { - System.out.println("============" + task2.getName()); - } - - } - ///////////////////////////////////////////////// - /** - * 全部通过 - */ - @Test - @Deployment(resources = {"diagrams/chapter9/leave-countersign.bpmn"}) - public void testAllApproved() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("groupLeader", "deptLeader", "hr"); - variables.put("users", users); - identityService.setAuthenticatedUserId("henryyan"); - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave-countersign", variables); - for (String user : users) { - Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskAssignee(user).singleResult(); - Map taskVariables = new HashMap(); - taskVariables.put("approved", "true"); - taskService.complete(task.getId(), taskVariables); - } - - Task task = taskService.createTaskQuery().taskAssignee("henryyan").singleResult(); - assertNotNull(task); - assertEquals("销å‡", task.getName()); - } - - /** - * 部分通过 - */ - @Test - @Deployment(resources = {"diagrams/chapter9/leave-countersign.bpmn"}) - public void testNotAllApproved() throws Exception { - Map variables = new HashMap(); - List users = Arrays.asList("groupLeader", "deptLeader", "hr"); - variables.put("users", users); - identityService.setAuthenticatedUserId("henryyan"); - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave-countersign", variables); - for (String user : users) { - Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskAssignee(user).singleResult(); - Map taskVariables = new HashMap(); - taskVariables.put("approved", "false"); - taskService.complete(task.getId(), taskVariables); - } - - Task task = taskService.createTaskQuery().taskAssignee("henryyan").singleResult(); - assertNotNull(task); - assertEquals("调整申请", task.getName()); - } -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form-with-javascript.zip b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form-with-javascript.zip deleted file mode 100644 index 0d5addbddaec78f3bce93da07a0ed2218ba2a6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25020 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 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form.zip b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave-dynamic-form.zip deleted file mode 100644 index 5f66312ad0da9b752ce8354da8a23211764266dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24967 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 p - - - 请å‡æµç¨‹æ¼”示-动æ€è¡¨å• - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 请求被驳回åŽå‘˜å·¥å¯ä»¥é€‰æ‹©ç»§ç»­ç”³è¯·ï¼Œæˆ–者å–消本次申请 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/dynamic-form/leave.png deleted file mode 100644 index cd36f9855cdad36e24517f824c2cdcc8013bc720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28282 zcmdSBbySpF|2~W;AfX(k+XAG!OF=+Dx?4%n8Dz_5QR_w1>LXY%F@jt(*WTmX{UAvf!i;$pJj_NkboeIa9DfEw;Kv&Z*Jav5b~BcU!LgG1D)4zAKOi#X1!h- z#4i*SRa6`x3|xASHoIXzDk}PTrUmLZt5vRnn}bilSG}7vfBlV-FXeRm&#&)s62t%e z3j_22KVKpV?%cW4+uLhc?`}6$ZC9vOtoNKm%w71pEA6UnztEj?t83Ta3bnk9_<-NW z7U+bJf$>sMC0T%(p1!radvh^TB2~g4Ia2t0La1(pubh&C&Ds7p)vej0Cd28y5k5Xw z>{U@gLE%9m3SrmBDRk*+5B?xuxw-Oz{MEF{G}ugX24eWF(C~1-jp7=u5(8aTT{$bN z`1ZUpZi=qolsab4jdn|Wu1a85BRPsx5)u;WX^;OP_}d7qV1%y?S<<1T_wU~~xU2pH zmXpzIwmvzn$6n~=9lG)$=ro`iLs%hZ4G-b^27^4IZ%iHYaP ziya*7)WXl2U1s1ZnDum|HgbfY81=NAzRy~al4OUStt5F8W(~iL01I)ajjfFhn86z< zr;?uTZrkNf5`$4mCWUP1{nCOiQ|l==eddYdNlv-8QoX7{*IzHw(|A3z|90QzbU}Z4 zGc&W`+ceCDw5rw*GNn^$`=RAIB|W4R`dw!-v1W@b%v~bxn*n{NvA4VLbl>4>sco&r z!ocA4ecYS206t4gkD@glb!4{Au+Q2TyO>0aEL_EpR^^0Auv^6`bDrEThEFH)vOO-?ig z%%+{pB6Tz0H|cu#E`I3i=sBGaBzy;1Kl~69=P~DZ^0OmaquHRrQ+0LwCV|V(Un?J; zy%%UJ{v56k+%$8Tpw-L3Ai2K2{^Liv8vB{aYP*XzDu@2W$w2H|8C#Vn%lM}!MUoU)2YJUE6zn{s<1_uY{W@lST53&mg2>2a7CHwNQjaSyFXP5uow{Rz$7gx5c1M_q; z($j;!{Qfpl{5;RJJ>p=c=U{ISmoV~IZ%1)KNjhH@tN~^vvV~}uKtBCUJQs!-CE6y5 z3g#ACc3iH^Ns3%5$iUMK&)}c`9*9F#y=_qKZex!$gfgiYSl9k!-_-Nn@~aaWrOkp! z(d;gr$`C0>8rCu@M)E3S2mX`f=?Kj0Fejdx-uu$cB zqWZSD(|13uhH}*}-`}EIZR|mkC*C>1!=sR}zGKQ@JjI$CpfqEKm9n}@jp+4Ze zJzdw_{6tUvqBEA|_U+r1HDzU-3=AvhM;j|ED~FltYHA?lNb_}vQwac9lb4rItl?2? zrsj$e+Gh^_^C=d|(NEE~Rp-C6vb^kf&?CUWz@XtQQNcRKJb-hHdu}LJzk3>WWy|wZ+mPZQON7hA*a3c#~rRUpKHta;+Cd$#DyT2p6>4aEHA%&Gi}GV7WCMju60^WEW9qmu`zs&%96bx3wWo}M(*bnJ8XH_;UhvM@(ELXXE@TY5QlpG6u6 zep0Dp<|?dZG-0;&_Lh{DskHj#{AlnxSSRCbdaVOY`W-G&;&SfBZI@@mF3&#ww!3Lc zwWu|WcE=|VToJIO_;}#LA{-p0@kQMe&WGdQ`0Xai=P#z}9&KKWFIRc1Hkb*I#O)Bs zBvNl#RFgCX|At!ba=(2TUBWPn_ff8%I+~I)iIO%g&XdP-s>JVMPtOF*%$CjPt5>wm z*i6yY92GHhebzE^G1~?PzJ0{B0H)j($F_+7C0ik0?fb#L#CaV^QXUaE`5JD$vNfF! z@jxfq=fO%%9>7VPKqia#67WHoFL!Fr)O!e2_608@Yd-Bq-DMX^AI>uCP1a>|<@7yu zB;_d8H=}GHuzgK4C%6#)@Qu&xpfnv;_bkjOo>jLcBpPvXVnfPVS67#-l;Z5>R$Ne! zDCEN6vxB>(sHo^SA&V5{lzk>FdxLuRJ!dtSy|l1BD4HHg=g!qr3E1;;aapx>CbI=% zC)kdcJ)Mi(t#iaR`1Zo+kv2zb5nFWr)O4a<(M*QDqy8TbH*gIQgUhpsw+u3+E3+0% zFY|~ye*Nm7eBRpe77Jg;=kj#V%F1dJ)+jA4jYJ}SjyG}f@Yd&={2>rz*X1hwtqElywX}|BeRjllEGst3`?=PBVILvj)B1Gyb(`;^VkHxbs(Ty; z8amARgFfU+Z=xsB+B$Ny`~dNr%3U{(tG zgWU-{Nic59uFAEcGcsj@YbWdSuL48E9DY&W{^Z<{M^uZgKz1B4ij7aM1uY9$DejZL z=JL$I<;IVs@3kaj=rZ9`jwNaq9r)8D<9p7?`XnxQe`xOty8Wbg#NyVyRy=Y`$cDJn zhRU~oH=nbkJyhV0O@^ygS-=3RVOVLv0M^Qf4=Xp{3lJ`9J-agR^3**a0e1EhkY>CK zx+ezHrEt!fN>>KNiQ=1Q;89T*ZWP^q?CQS-W*s=6EbKi{oTt2$H7H(qRuPbI3@wB8 zAW`u51TN25!6fyG+KP3qN~jpI#gmfy`U~J=hkD6VlM@5VUi5@oiVV@kMzHhdH`g~6 z{3?g(9c}B{*%AeI#`L%Er;-NB&nH4cyu$rF-Aw62P;~(ecvL;o4Oj$$LMFe!@bz5e zHSa~y#`c7)?-XWZVzRKfm^rpE-8JRY|Me-DbW}8>a(TnS(U@^fMMYsr$>?+!y`#s5 z8d0OFzv_JJq@*^aWtk~`hKHIkdQEPb+T%s(5sSp`v?4tH->Vj;UJ=>MxZHPVSZc1Izwez zGmj`n#5O%?@|L}W;S0OVKpX)(JIk`NmX@XA;WGW2jHu|+n0U*znKQBE?R$ac=;9HIg?a-`D3j_B`|a zb8$7He!pD;vBDylA;UY@Y2fMD!_ND_)#yYR_q&;jx4$ z%iYdqnjx-@bHImNKJWF=4C(R$3pYcFMOl*H3Q=c^z z`||9dz0~L^n_f)p0mF)~!88_hWg}n0q@nsc=nP<%m$P;toNBp87=<2eCQlQJpU#hn z>gA~CDkWO20{=oHPUhfCOL^8rwZ803>28gZDc`4m*F5H}t_b&)V(3Z|_q)spa=AF( zdV0i@tvgjyN-5wz4t3i$_T8Jv+<$>rSk(P7Y&VU|6m!{3OG}-a#*)K;b8OO^8S9`u zO`tC-c|PQsX|;c6VBdMgiVK0<0U@m*3nrI7UY5Mn-C^41W~MhH<`{ z`P$N`U5WxVQTT0196I63rszd#>+y-6&4I<>h6X{r!u&eL_T2Xs6?QT*kN9N5DfclW zwOMBS@76M;ni$H*Tat42u^JLo2Ml}`U-@;=hB{q5(c9C=BcK!iuo4PG6k#0{i@2?? zE}5A-2t-%+9}f?!P%iOe+1lo~sK30Ogn9dR+$FJ!@<^iS@d<}L-n0Ha*+|-gNaTjY z)t>y(W*4{@ge8~eKf5;nosI0R(w8rXY|Qc${I)MOHGBKhua_7%W!;WmCZwJ2n?pSg zw^QyDJ1l%tf(j;dpyHW)L5H}rQ$+(Br&{2++f)t>s+xwtvyvl}nT8iyLz6ry;F@Z1 zdc3%lrLi2QBYWml+rGu?&MqZev#EgPMv;NA@1F<;a1c6x(i&IfB08-*jJ>w zlhU=iIYrj=h;Vmt_{nDxOdtLD`9Sp;%TxB{s zYTt$CH$C*NOrfL`W%Yeu#Es|>UL{T!*3Nf8oKcZGh&>oB)~_(wDz2HO6tFh{?PGU$ z_o=ovFaszkh9Wp(mu>dxlFsp7+^t)k+|E*c`^=WJf%8W1TvJ%4_agcBb4HdTl_d_P;7 zX3ZgDmE71U6}cRbDxjmI@v}d#bc$zB$;g(CqN zuMeL4L~)Dw3-8AyO#3SJmrKu&h{?HH9!W@4*PWM+3BCP2L;k%T7(W-+HPrbSqicto zN1DfS$Vq=XA|=I6CLw9?=H}E%J1}##?ypZ_`GQT3zXkcIsV#uvj&?ZlhtFCKwek7* zKl8K00X?{V)J57sZLMG&>}X@G)B&udi2LEm3H+phNbt-~s757lkQicEuln7Y%zAic zsXF*wa-xta=*E|Qb0@U4qAh!pIen^wg4;*AOyB3^7+LJCFI;N98{IpwH?F8omE1Z! zEEDlqc-_^TQfOoSI4!KaCXIsluzgMaVx=cZT7c<&NbpA@8I^{S7n-MM3VvTf+UzhvaFa~*{|5f~Qq z^#njslOsvQ`Kc{lndi1K|L{pR)2CRH4m$tAXGg@2&feTuEiDa6HK_BXhvc*2T<@Hw zbS_~&xURnym2NY!D^ZHpI!H@fm@gN1hP+T8f^h3@e||WXXP?I9XW+QIcO8dc^%8OM zQNZE7g~j{aEQ7cX=R}yq1K3}A!C&vfih~123U|GHbKQ6*w+aUfOSO8hM_{f2aXbYY zJcm^xKNlul)!`i0y7i>0jj8G5Nq0jXb~-vTGSFcx82cM4*>oQH^-^aoTt1bHO3+0W zbm|jZI7lpNt!Q3(hMgT>0?kmHMZu4T1dZSRhXbh73!m;JfuX(=59L0?+qWy6T{4_q zGD{4E{I(MPeGTp*SoPZ5aZ2>z)|LVY>v0OVqmo)0n&qhqIAKXibqRYlh`JrEt?%O; z8qcCejt?tFi=5WR_tGwoi;Zjhg?SE`kNk%p50UvaB<^9yHuE8fc@)Vw+s>Uvg$L)* z`FDRwb&QCkf4(TcV>B$+%jtBtl$S{fsAqDc^PrV zYxeAUxlc;YVT^T&>M!pIU@h6=@p_<+1Y|iIs7!AzR)0SYX{TV(Vm?#}go$WiI9Hmc`_%~sivY-L}_ z$fg*Uo6!Q-a2qKW&xwtdwzq#&#SxsmdxG*S4-%@HF|gy|$xqF{<@2V!ux{qhq)bb~ ziLTzV8gJ@(cqcv-ZVNUNGPe*}ZW_AGlZR~AG)j@G4ZMg@oVTglSOWzxh^ zDIy-_k$u-f!XipiFe}4o?K-z@_=1x#_mjKgl}|55l&%#_@$g8Fyt2*VHAWqYp*Q5= zX008o5kr@}5?(6jD;vzH^ zOxKL;?W=oc=~RuUK*<|61&YzO)>gO8an;gRFOVTta~l$6FJ2g6#upnA+oq`dRM=-; z%IU)t7A=k)nu;@HLMNTRAvZ?rPLt1ieweyw3{P-n20xQNS80IFxR%gD)=$?LraRx- zi8`6UBWRjlkW0K^?}GYE*q>~VtgHl?eiZkdFCYRqI)h zsjHXA7lA-Xl0g#$SXYE}5U%%n(5h~ znRMKvvQ^BSHf-H8-4$lsdt?kRXJIyNVf@)9FWbVt6>4+rA5SW@3XxzyAUHY!DKo?R zHIh{k{ul09RaIF2moxR+;gsfTT5%e>pDj#zCgxCoklfdJ-et{wh7^S)%X=BQX$n_~ zp~f5iQNqXojUSAR#xDhA!^nRv@Nl!o$LH=MYRbr;-V&M0Ct@IQaZZ$eo)bNx}4mDrWAgq zMBbLxR%rQtj@Bi}pgN14vC%<6dsXW5+kEzTc{PQ(7-XefSi@6ntTN&Wm=U&k(|EVV zb5b!m2K=ulgOnhO2-l}sY>(uj;?CMhmr8ow(@sb+7}*+6%-GKn@%8J&b?x3|T|znr znEO|A8xudBQKj}-b85xj znzwx2PPMe}{F0Q!?fvAL*XI~h1oA?LFj6sbZzwmsG1g1^;MB5rb7SJbrvwUduG}rm zjijBKZ1Rr;e~pv&NmQ#2l#HZ_oPD128w2o)e{0(*|9F}a3|U;Y_i7>>G&D|KarDF0 z6-kL-93v>3P>ojWF{&|GvmKG%U{NRNR2dx=i8*gI7Hd}oa3u~(dvNf`CPp;*p4Ddl z2rKC1E%vNq9qQ>};5~dqhuSFZ@;*F`;OF=AJtFpmO6aN2dz)a`W#xC~VDwDKuQk2u zy+hz2x4pwLk{tOz00A2di_Z@16 z*W|TkevUHOGf|$WWPO=<`h*n}7wT&n^%ltwIjB*ms{5JyOO|c9xyIgn2(DeU*KvnA zO+E8fJn9)7d`9{(+FXSz@=q{C7%@8o@^$l@z(kl}u4##WjnNfQR9d2<7L~s=x}ME% zKA>YWz4YS|EgB>WM17t5xyl#e|I_apAUn{OMqXn=jmBx!GKY3%Iy*b8u0R2H(+f<>e0Q1Xo zdA9Ha0Df6lh=|&sfZquKkZ8o*i*%U}h!~Zt?WXuyL}W`Nx3C;>rxmjw7~a<|J(Jl= zw0Vtl&*-x~FYfdKDW{D3)p!jq&pOfLHC&A+oVtj{V%ZU?InZ-@7MFtEHNo`sSLZ$& z9AUya8jO$ErPE*5Da`00&3q8ycOwOIZYZ5#wtbN&n|T%S!8_u)yC(qqysyB%p9hH9 z@DCqePgQSqH8iDcUw}!P&vp)WWqMgn2V-Y55nIViQ}V?WsrnmIxu|Edt$99Fn0IA* z8CK*vK(q2;9R7hf7;q*3LS9dHW*QnAz}ks9&VPj?F5N?NeFpq)?apk9ZjZ!j*uR>P zE08quiFVk%7Lw~AFEo34w>Af#e38Y_HCV{xhRd_J;5kQcUSU21KA-36V`F1CMvHSd z?IsV`pfRh&QlE*HPq-_U1BO}<#wK|2U$ch!)O4k6>PL+}wo{p7j_F)8jmZw(=9CRH zjd*Sco|LlviVd^pK>E}a71{o738I6Xz5@Bq*49qh$IB2#nHrm-u4yP`V?9KwFCsFj zz@>BmSNG*P)>p38)>d;hCJr(C$r3K`rqH;V+-5C9r29^0!ow&^U@|g1X!Iydhv#xO zJTz3l!SmZW+r|vE%5LfyU`DxoRaT*)g)CcsXLNg=mDVHj_m$NOhGNWuGOE9GT*jT( zXHhF#7MXX&NlLh#XXrMQJ6(-#n)q;#0*v0qdo?-<@-Z?7Anh}~x3rk;%cQekEKtf# zJ1?%es~J9t`nd>Nfy?>8lPf}tgp*Mzm3INek1r2p_+=k)H*nd9+g=f<^u%!GHNd!- z{Ztiys>)nq!x~e%OEqFM5{)6(K18uGxU8O@CXB$t#Z4a!8kO{T<_X9o0a;d7)-VWq z8RxE+QT#7baaB+^JFDT*XJvDZ%Ex>>RK-aj??$HW@V0slxPoC|=(XrK zD|j4%tH+7lgPZlyb90ybT@cz7m};)y2;z=?#;%@k$m?Le6J;%$QW!ylx&s-JTFq73 z0j37n9ruG3#e^4eQBhF|30}Y+!otFqmX`MSohJ)5m~jZmRWvoFw*Z;JVNk2GlQMd} z`_5w0LpAcL|G6n)h>M+tg@ujQ6cY(9v-DflKqcqN0`X5m_)iP{(T|>*(o0_FBnYR=Ot|{X|F@^{(LsnJoPL=v?OuP|1sv z9S?W+lDs@L3sP?0bvR)IYo_*^6^e@5q(6)vCH{zJ&J55c9sza80rtS4h0t zom{nYGig|!1M@nio4!sG-y;$_Z*z$hdWkvXAPCgxj-ioZvap-A5d5G|qNcjKy1YDt z4M61Sh5#75=<`SNn0LmU9l-sMCoI7pOjX&8je#KPwlNA&()Ff`9>AS`S^40KW@5Om zxYNbJg@#uU2xO8H6zV-$X{9k+q+4MD8U-dMrlDNrzP>)d zeU91m9o=yG`FiC;7W(!BVdydoeS6jX{Cufk`lMXeM|S&Gw!; zAqhTz{>|XtzMC(-uLR_52YaHn4`-OyrKu~}Jhh$JpJUrc7EH5v2T5OvcRngO< zq@)z~J9ot^tE!p-JVqRw{;3a*1jHAhvgey3Pt-Z9gR;BM(!_k+!ADbbq*%XZ)dGb? z6c!fd8>*^)$7E$=1H{L}2M-=Rd}!rkU|?WkVj?de0;xyOp$D(E?xu#87V@mmKj()1 z?)-Pj6KQB_!jn>+Zy5kn8Gg*c;o;_H2z6Zp4)J;mFtb}*fLe)9Na%P#C+;igFe{3W zADR#F;8f9s@^u_S+Ev6g3|>rAeVsm0RBLN1=)%w#F^5sZ^Cqm-nA>#X1`N>&2?_L! zjD@uV9A6R>v9Ym*1qA_V?L3enovWNC?tQpA{>{|5;~|(}z{;BigBxw(RP9Ki-4u`6 zy^|9%sL0*yu0nkblXu_PiY!z885tRw>n0QyxVX4}|Ni|@ChV)4C@*ge)(tGIo@Ake z!E6Pz#)FN`&B^K2lvU=xo?Iv)T|rLHYpZHZ#|a5!2fl{`vLhoSk{x0v=45+D#2H6pZT5or-KL_V zFcP=~>hd62$mMu@2H>7)fjER}yDZ)WV9x#2=;4>U;?-x5Tgi+Mw`Y@c?BjTGbgD7L-aA){Bo?g4&h6juXnv4>1S&4~@v#_)z zB6OCS!1qN47Kod7%>Baz6NTZ)W=LRU*Gr$Avo z&u?!*`pv~7xxdy$A^t$(Rm(fz``(_O{fTqGYVz%K7l1PA3(Oe_ID5Hh23lFI{=$8>ST$xu1jUbfe}nSsMvh33vjUzf-J^Uy|L*_8xYu!$ z%N&v4(Pjpo0o;sy=|;wz8%jEYsFy_`5`m$?mjuq315Yp+!5lfY$fwX#247+ey?K4_ z4H1|lISV=jUIKmzBQW_1@26&%H+Mq!j~|&uMK3fxkc$foEiEnYw#lBjv{Xrhk->F; zJ$>mc@a4728rz9-5O9WH&p_Sqdx63tXq)m$#rJ<)yuaL~KYTFbF?V)xfj`3smft26 zO#k0YVFb&_$N-7fu!4JMtaJ`tkLc(;b{)e=yj8;X_j$jA!Tf;p>Y5`*^&M258f_=I z(?ziQlO65u{CnBK^4u#ZES&R#(`Y3}QVDDWZC*)1!Ck02Mi1^7>E9k2w{>bN304R5 zyEr~|aN!iMt-krUC4DmIj}l8k0dvKhxf8Gw{J*AtBPKdp3Z4dv$s1qKeosF5e=!KD zL|lVs&)!v3xPZI?pyMeZsyd$&X1{~Zk^Np@E1trit>$8d$>Ylz=@a1mk0D7};~H37 z7bGN1fLtgFLR+Esj|vy(LK`zaZoQ@H76HlzUH|&pMSzg6f^i%jU9()cU03^KVu*px zkn^rueKk4d|JdsLth==!Y}L$q+bnm+lElVpM7i)4c(X-+J8yU+%>bX0p;d;PjTC6w zO;+w591xv<#5BE^Zxed$-zM~&@l9r8G_5UQEVRFlI+n&477j!CYvQ`BQ)e^kp5GV0 z#~IM8W@}s2uT1tK)wP7}J?{S)>iy3**!lR5KsF*I5Y>KI7}rr?W2RYI_I^~+EubMW zXz!L>Yw$Y*Zy+PuL%Ms)-L0!8|M$ASe|A@pho>TzMca{tDK;~9{e440iA=HGm|ecv zl+BMv6iuKD8M+@B1Q~oX{m9vl>px7F>5(I-Pe6r}SLFT7JU5KgO;vuQGZD(K4}>Lf zD$S_y(md9k@o(3~n`n&Q6N6b3{Cn0xH+n%H1>z!x!g;)5JU#DYfq}iQHk}5jS#kYE z^!wzgUzkg=iR}V!J!NHmEG;cTlkf)@lYu?~#lQCv57z+f{Erq%YqQ8Y$-_Nmzl#~w z{Bn|lByLT$D&|H#5<~Vm&wa@!MpkCw%o%DVy7|z39TJ`FNnd)Ww(bOj5xwtoh7~>b z;#OVO9u!XjnipU1dM3Y`d;8f7yfIR#_y6PipCmECt?D;7T@x<3^jGi47ivVt6sXk| z)XE&`WS1K+jbJW559jaAoa=miBv-J`hm0FP>-y$rfN`uj4BleY(2-TX>Z+klXW`2xs8OK0;KmCtrA%%wvh7=%42BJFlUXuR{Q5}oUzeROd z{fp? zXbAz+i9drc_u~?sm(UUX`TaMGvx!CpB@)ZoMJq)r1tBaWrO9L(`EN7S8c)|ZP9_^r z?i(KNw1-7%`JIKDk%c234R>iZeT?FU;_@m*cEy=Uy*lbMik?=H}sT%e`u1)+~(>0K_$0h+X@T{QAW^>J4AOA$czrbbTnl@S;t=&6$WVV`)rjln(8 zS@S*dUBQxONONqahHu>A>Y1tJe$VR9nBCf#{x328#iIBF>MRP>3Dwgcqw3|LblionHT;b0TiTUi|?&675nWHdl_U+kfAs zUVO81Oua%X=h4S8WBjM?ztvwwMFPtVu!xV1J=(6{nXUIw26v$OU(YiK$Lqat8(H%! z!CU@Itpv8JzX5=Q$irL-8gXBp)rf#cC1_6TEB>E0QBopk*(GK_(BRcH>rA*;$t%bY zI+>!PB41x$BgDZ?>24TGSk4L?Ys`7`s!qphpNO;$tY%^1qo@Fjo=VAC@gKp|p}?*BG%b$#OG#7rk) z+V-xXz`(r{cTtw#{Sx$-!^2BfN1)X=9vm#$--AG8`5laA4G<0wQt7AwF1Oeg?t|`2 zbZ6^a;OH{h+}ylHy!hokpbb&_u?R|<*7}KCA;f=Mpa_=UgSxlTqi1+-Zr;Ij8U5qE z{QI{I7xI@4s>A3c9^9Lc+;ue8Pg<+oNOEX&_V93Y zPOLEds9tJ>GOV^mF0@8iS-o<7m%M4CU78yH5jQN7FvoDuiLAsB|0~;s?!aa+>2%ZH zL7&*pO#SwP34GI5#46)#{yQR1%wzj7e#f6^&(?Nxs%8g(94`2`U_K|HvnlHDW4@W0 zmGy{+=K#QF8X@`smpNOG_eWjKjTPwzDhKfJs@0;I<^cA;oK-8Cg}7+HyOize#*BvO zMCysb9`}Tub#2|m#W}4w-2bqhuIXg&4Af}L-@h|5t;8FXvgt021D#~HLJANSDSzS2 z_&N`*Ir+ZWexjkdtkRq+wqa{$xd}uuarQHfFK@9Fc7U0!Ttr8^6z4F+-(FpPDQDjF zQO?-XGD!kCKEsM|U`_3v0umej)i8f6nlKWvR?uwQ&o%l1>AFk=bscEg^YR}1rq#W& zzW>HX1X$lH=ASV$vpr8m1(Bd#uQirY6*@{PJ)_rt$`TLD(@5oaW3}^et2#JB%#4kh z&Nt6i<}6$SjYwrm!QMQ6I}YKt&+itegU^8n2aCznmg@BWa3xWZNrxsoQIGA%BJ;by z1IPDZ4Y&K76!0L6=d$-M*DOy<-eP`w=C&n+Rj81! z>T%$;(9?r61ezV~A|1{?$V%C(>u^2gZxu<9wFTTsDw-_^lRIZgAT#gza zWPQm=BK)b-uv5U7=s}BAJL^^ zB=l{ui?ze3U5tcPp@-G9ue-0Crc6A0ntpF$e{P@u&MeHrWN>O?!n=F*K2XzSFor72 z)p<_4;8gYWDCTKNcsbXMt-&t${1I+vC5DA}7p}iv8`+q{#l5z-cWtVgZLZFRevXd0 zmyl+1X|3+ZWaq-koB#@Wkuy?AR#!LK;EPK7fG&JEwZ1d~L%nJXL2#eOY5CU4qmce< zVRT|$W-AW5m3S*F$aBy+<$$tlk1!Sm9IjQgkKTG~Wu*cV2_$Ur#{a{;4V;wt;B0y1pl&>6aRNOpKO;a&gpwcv-c)x2nv`fn>R zHOWH~qF)vC*oMWPsg6%O#@SA&iT;3oae2CjOc3~15W@nPRbiohdG(99^d@8ly5_(z z4LSot?5mC)ID9+ISqaNBCrZCCe$rXPwAd+{Fxs;LlmGw?`&$VZazGFy8aTRs9_{d$ zd%R_`N`I+}>JA4eEdUJgx7ugnGDq!m$*00G-%R%&zRK%=ls^A2(?2ASU0+a#Jti(< zFV^o$vn_2>T|iei7;SieD>yEm)ba*BP|Sax`96woz0}6k-nx>W=D*!nyH~v~NHaAb z&udGu@jK4r)JCS||MtX)J}*3N-<O^fZf^_j9474OvgpWPKK;GQ7aF-T$5O(I5Z( z;iES^JUsdplS=u|RhaG$+hjw($L6@{*M@ga!ahz%-J9?f*0zxH!9`?UYYvV6b+sa? zxajQo=*@o+Iqd2qny>#mk)sv`TWtuZ;IRP3JSdSQCEj4{`hq?i4Xjy8g8FPwZr;Sy zbnQEK%3QX_&-|F8KQuYklR}^}Go+&y=+@q7LfNvT??jvAWCvpyax&vVCjlwaVBVRo zdwA$_69XF6do``Z_h6$Q#WtUvox$c-Quqq(%tln@rHkY#x<;9$H`N8|*p&GyF~hiw zw1}iFSBeEt#8fWtQb1Yhv_6~<@Ep~tv9XhIfmugq=evivH!uw4)~^76#j7e(VIF|J z!M73lQWq#E=VW3Mr^g&)#`(2vnz>xI#aZv62v;fHdhP59QvU`u$d-GFzuDe&^{xmgpC4SFYbhQLdM*&Gl+$0cTeAP3|*Jzx~y^WC?2>1_l4!`Q8dTy|Da}Tz9 zSp)6nWR+j3CV;TALTE)&-jo;$4@`Ur6C6L3>+0==obKM|gSu_VoQOFu{bKPd!I+n> z{Iqnn9P3hl!iH6zdnW1iyS_`#XW&Yx$BvPvX12;>poqfp@Hhzx!Arlu!chKx^_zde zf*Il{cwbsB(qpy%O@V8{2^FAUb(XDL{)}QcU+(0sl&t~)z&=umYtAA8QQVTiHH@^WiAwc8q8OpfWp&PIG zcUQO~Zr7Jye=o zEBWm5jEsfMNby85AATcg9M9IUovV3p`~_piIi>m2(WQ+U`D_8yFxy>Dt^)w(LECo% zG{{e`#&r$;YYwY@{%UG!W@eB0z~NdsLU(XhNb=<7le=Nas}Y6KrVCJ6`ji8Zp;o|Q zr5o7TYCbf%01aJLx<<~nW`HK#zFL815DmXRazlb6L{^4IMxfHL@ty}q7F{bUD>YUj z*U0b78D3qB`>$&~k+Jg26BU+QTU+^tDk{4GXg3E0mvfx~`f?InqpQoG{_AoGQaMHV z2-Jjtl~Dtt<6!%0PgO|?VvHYe<-ofB8`wo%US1v^x>}D~)h*}8vW+yHhS8`ND&{gGS7)OaUQF>+9=@iIkJlHq2TAc9YMhtT?K! zU%y@hNIRdCZJ-nZ`C_mHw3-eR<>ufF)VFWn!1=6DGLGB$`1(M-J<{FL(E*-s4)EMqIy*yz;W7-!ZGae=m3Dl&fbkjSbFY`um-2h5@;u}4|I^0g|Oe=61^At90G z(%4cD28SvLWo2dEUobDWhf|GRDwB}&Uzz!T>~i+Unkscww)ie7Ny+5ou7UwD^wHZZ&CC%lF-6-n3g@hMJnO2?=sj zXG()yNsxeHOYfU!ZmR)_t#vuz?43ZZ7;p~SUT}`g#lm#9*1<(awfTU|EsZS_-7+1djtmT9R>TDeeyWV6WKx8k>)zeZ_zu-H_ z5vJm|-90|G-__vNO7_^AbR&TmmNrIpnCZ3Ftr+8gsKpfD)t4p#biKVf$|B@+|JbST z3!-9TV&dYdoxMOfQqTr#Xy|qF6$G?4t1ajW!0(DnN|39Wk-%@H=~-eIfH|1>{Ag(r z_Sk;W${D)~7Sgg5#-URdP-+Vd;sju-fb54aFYlpTlyGv-ld;Mce8JIb0HV7_n*eR; zfkA0n&^E!y5X=`0V0)>r=_68Xou)+NyXd4g0Crex< zA*cVxEDODwZ?~*g?2NC%ceP0!rI)UC8HYY5@X}{G^u>6L?^cYh@o+or0}9c!2uElP|Es%sDPI301WfgN0qO4*0Xf*ac@2qSauVtv>HKBM^&)Fqm{+e z_ra4IX=(8TBIw<_8&I#U$twF9=(k|PsJAxgb^{G;{z)ZP@fs%kczUWhi37>ak7N+D z$`>xd)@vLNx+lEIDe$p710hT!^ZmPbyRt7ePa6F$B51`rTYyn^xC3bj6bc>W%DyMJtyRx-FM z#m{CEB*zJOp@i>g832U=S~^6KnFO-^=(()xEXWWXKrFKK>rR2^1dTa&LSZ2bYW*D0 zw)vB}(3DP};{_LKX)Mk8&DbsQ@`+_Q+=iy2w)XUJZHReWYzr`xnb@%>K*iyULDB}q zKg`=4H(ke5#eCFocq8Wl@UvAjM@mer(hOb-kasgTL^$_$m6d{;+FewKdtzH8opNi_ z3jR@1Z!Vqu%u3UZ2x>sN6%-VFAHtLY1nmEc!wYs>FWlVte0GFY9}}OiUMKl>X|vX| z@%u;cEqlu}0-XM^|K@e21e!?2nAJea4?Dz6hj%EE+Cp#HbM}>v6;RE7oU#706v3t)oJE0 zs2vmlN+Xa8Aod{g15*WbejY||PmlREaQfts2>c-bS1#RC4_-dLY<|?)x?(g)G$>MW zlb<)42jV%5jZ{>cQHrmQHz$sdkHO0nve!;KXJTfHPDTfn9HKW~9>5)#79 z&hGB&8WtW7bVg=$?|M~6XztueUs7S41mc1(K&%%UG6Lc%C@Yc+=Fl%NIHDydf6m7V zME%JjAt9i2Jr-KmSXHZ2px*{UEHt+ZqQp+)MT8&OBnYXerDC})U-$qG^IC*&RS+#} zR02;nC?hOBlVWXZeR_Uw4N1}?;^yWC;kX){;nYJ{!VlG)O3x~^hlhrSKpa7Uv&4gh z8AO9HACL7%B)b4u2gy_nagRhhd8iK@>0bqWl>^BM|C`QEd0_|OJbrtYSkG?$!>P*z zIhdHz3r4`3k=$%<$9GQ($o*hY$7b@9zt@@BId{+SUDC(3|kvjz1xE z2W5GBdiv%@KOBT<91SOjq{y(a7mAA60ib>y`jOQOT#oV4BLkTC5eVeWC4$QG@@h{0 z1z-76xF)O2I_@3^!SB)hWBZ95Y%E6@&d%Uzp!EZV{i)%}&RiNemP-O3p8aNuqge)g zCo7R3yeNgAKhCc}h%YZj)5+K(H7cqF$vEBH%l_cOTbg%oLEMrH2kk;{BHsq!Xhugz zK_z{uY;_*%^8RQYBrm|6&9phWxY%s^jBVf(5FGCAe#Jg|Br19tZwyIy_UnvcO5}2` zOBS93Zx#XOC<5M)GBpKCsK7ae*0V~hAyQVIT`C#m>)nzG;GzMHUb6Kr%!(f z-{cz{9K^mwsR2G(TBD7AKFqFG4`Y7<>(rR?KN`{2zy^+Y0_aV!yt(0epxE>QH6x=^ zGP#iR(%st#6`=d0p@W#1WJE_3#g2lv)U2(oftPimF5wbqWH69H6(b8R`%=>&=lLMB zCL|{A+X2lU_%I)ZhK2?cP?S5&iPMN+$Xx%2p#l`Xs|#drD$O$Hk_Xw8ItNm}m;&To znTvsk+5A84UH4a%=hhwLH4+Pus2C{{HCR9)A|ng}qhh63iBydOQWSA0(lu&O2x62X zbwD}@2#AO@6BU#)qYNM*U0~=40}L<>bN8Fvb?>)w?_cmOe{s2VE#BAXea<<1@3YU* z*7k5odLB%CNP%yy&8e3^C8VZerpy)@0oNv2Y!~c+b_WlB!3(@NbN=keuCazs)6>XW zuYjRU+JYM&cOa%wICE&;+_5@wtg%8fOu2KpECY!z{fx3#!grC{0$1g!HK`-F!N zcW&SQx~?unSepyHCdX6oZavJWUhE>N|0A==-f_0~o_@1mQc_aJ8Iy<)&CLc&#z#kW zEw(>}VKZ79Mu#i^g&2N}H9K*_Xp`=`{@yqD;EQ{`7m~#=_G;ip+J_ee@nj3}eXxcG z4993m>Df1T5!Qx==2!_8A7Ad+n2CI7a9*czr%zd2(D|8w*6%lO{s{~lfa>HE=MC*O zOlIiM8LLw1+RHrn{?YgEH+0?)4{yXX04?Cr`WGZ4nYQ}YVj%#Z&zJBWQH**B93v(s zHnoN`IXPfGB??k?l%LFST4c>4W3b3mqaPyAr}<#&<(lavm@}sR8$d|FAMeM;E+DUS zT)LL;c>br#^B=*(Tzn^EkD_Apwg-mYx-!FO8Q>i0;sRW7P$&I9WnP%dqCCEwQ`5t4 zmwKrkzh>I3-k8zEYZh@D0P5mzF^C)Q z>wC2^EQn{Io~>ZG{NpeG^_?c3%&;fnfJB_FFHsN}`L3CbY?CmtvZ`AY-9NjzVgqoB zAZqu5GX0uT_n)HGe;j_hRK?h2GWl89TZLa0vX>l!73gm$>!Avl!_n5)H*<9{NSg+j zR(5Vq=vg$g#C%LG^2o6C)c|AVS3pC&iH}vfZXY42WebA1s1>LfvoTmVfMVd+zvTXMgkb4q0#YZq#d%d#M+wErxRmhBzVzo|B_wG7nUwRXZ`o|qz$fV zDQ_kl4izcY$QJ;?V>gk2+9QRJQGfOm zlDu-@_y2MG0IhU&bke_1^~kj@L&<>PbTk}YK@JrdN6gs30B&+~YwNMDt{+fNaR`Kz zB~}-D1E||VM@I)=Amb1M{>s5bB2|!^tsP^j0r7J-^uX_q!2NcFEe%@U*S1>B*B66xO;?kfNs24Wgo=Yu74a z^Az^90P>!bx<2L)$}n@#6F=TT3fxD)p{(nMnMN;GUt{h%8FMO-_ok+%{;I0ReEr6! z*z-iWErJ@EHpf`9f6sr#WAyCf8CeFCDk#;{1W=y60(zC1lX2ixu~A0yYoN%wEs!}Q z!ov+eg3%!5vF1y;sWue*%3n8VI%R%>Y5Q5oN4&$x$ik$EWP;cKz53jtH)j<^L_|)= zjjjiTlOP8QhJ z{WJ>BWMnZM@G3)yuIv)uB#1>VD)M*L^8_;K{pNOIVPQ#$4=4T~S0V%d>=XaRn%lC9 z+y;$QM{#ZhG$xxDU8s|-N1qwmYO5R}SiaZ0^{Ix5d<~9C760=yB zXW(oavG;ENtAp>94(~XYvc5XU@)s+ys|St-X1*vFY7@lK{KhQpzCCik`~3zDI))I` z*lGec<&YjDk`~Vyfu?cb+Lvp#>FKy?z&&21T}P(|yuA4}yCB1$-7#*`+af# zznBclndLYm2$8cc^ds%nOE01(F@G$^96{evK+o4X*9p9@tx)FnY|4BdN@`s+IcrEl zh+Jh#A?^3_&TSH9Z`$b9`@PZ7ISD21$2P!Y0gLu+-6P*@V{{)R z9-wmV%&@tp&@yBUvw05FKRV`DmB5v~nUbW0omEYRNBTBB2Jb`%CHG{(R&@pQ$LGNR z@SglP`u;?Jr%knD_LV}u#gF#5pn};dD*n1);aulzrE+zr`mkpO&uV6v6@>{ZCn6Kromkfur|PbiUG6qm?|g$0i3Uv}@_`J%c|Hx8(cwLuy-w}~f?}V=X~YrO zjqY*kPcLsOHTZGc-y^V;_-{2u8mFEFVrXvy9jH0wj>}u-uPsP?&A!-8T%TT*Cpl!< zuM%Nm<>TMAQSt0Ct-h*_J|oYDbF`Tmbb$5Peq5~ih74ms!M0K_nmMtvZ~;>Z8kB!W*h8UQ2&CYc>62I5ZcD){I2EHV+S0YZqR9WT!(53cP6 z8nQs{V(C*6vGu5+P#x$QLj|-Ehq(1NzOKLjysX6ldp|w*PN3B!Q>VWMi#7=KXB-%? zFj3{u-?=zbq@*{rpfrJ56n7}6H1@^ZNvy(cJzRv- zhAA>coLpT~qs??stvk+P)endWkzNva&C;XA7QvKx_6E9U3k4Oxx zI2lojG-W%Tm(% za9r{vWD8;lRz@yaMZh%5HZQE+s_Hgyr(INDsyF32bf9e_Lw_>fyJo}d!XIqIdS8!1q!FJmE!u{MqA0dc9mR$R>Bf`C$WTN zxeCc61SUhT>7hn@i)SFpYkT$8CSDrrtGmBgt*kcJd#_@?F}FSzSl3<-il9Bd78hd> zZxb~mcUd%H$c!bRGUz^Ige1E@%n|f`@5BO!sUNMhgDby-0kJxwN9{0g$_U$#+}eXV z)isuM`e4eM2926> zq6rgfC;jalc_^Pcu`0V?&0$+*hdddB6JKvRVlw>8mswg-!yHzRBtvGMI{<1y#STbm zkaqUD&Az61?rhnTP4O7nGicgU!%~@-Bn_z{Jyzm#^QH!kyB{EwaX47J@jFrp6G?rs zfX?5kPMse}!iBBXyHA%dJMB}=1Dkfieil@sDrlm6Xhk%tCMaVyli+y%UTHJS>+DSLu}&G;QYOpQ zomPq-{;(wB0xiMP>7jYy(EM<2ZbafG&u_Kdt-7VUfVIr$YS1Z=AX- z;TyHSOmINvXsvCeb-tgl$vLc;JgJAKP+TX4vxh;qfeE7JibL-}$WoGHkV>vDfEx?x zYCzv`dAI_ndv4Cm%Du5tH%3nFgdXz7vR4XkD|Zpu;rEdM%ioo2_#>aPB&S!#BUm1E-O&y zFz1gYrSMJn&Z2}SDX%4^`}dU2P~3-1aNN+BEIa)-F+5ym3f9eL<<{jUf2h%zqBNX_ zl5u$`BhA`(;uTitPHG3qTbx!$ynn_njL`Nh zjL2?lfpp9;5+KMbDvz!G7eE z`JpTcrE><0N(xb#VRIDTLM*OvqHxJft5eOGC>mVvvFsL#K+0jFkl2m2mZi0RR11k( z9p51{&m<8?8LO?m4kuDN-?}gUHTKaKibwklD<9V$*ih z#=j|(TSm&HtFY_yp)@tHSBlBI^-HQySBopX_E?4p9j{NRK>_S58GBX}MI&{6af>ET zF&(6JQkKhx@$w#{UipsubUM{1zd@@t+G1!QoAlgk4cjtEcAVzvw47mwnd8CS03^@c zr#(TKy=rT3U27PfwD8;@PO zzkMsC*e$$*=JSpxZDQ1AKRh!fYb*Rc3ToZVDhKMt-hn*Fog5|eRvTL!@2w64Qo=l5 z(xH#%d)eP#hFw|1^)k1KT1r8qh2bH*$BvO%siL1``@(-v+a~C*8&8vW51;b7VU`^^ zO0%`DQk!W$1C76B3avsypM65Mc;f6;85wd9^4vysZ>1RP{Ikc!vlmuE{}Hr0<(|i? zVf0Obek}{^bfbTK=H@^?zhq*P+J05Zp}zNR_m)PZeur2k^S#dERPQxQu8419B=%_J z_WHY=q|0$siAi-R!^hSLOdX-768pxH-#dIcbr>KdE-5x{jCNKK^#iHWAFd){RL$3S zHW6DaL;a_c5ED~>EL$no=2|6HF<0kO?}(IKGME}uuL{gF2IGttAHVS!tnULHi&3<# zhOeQu$VD)jhE?SfWz!}x7?J^QwA-YPtljtx+acEZxzeS7zioGb$t<6vbvxXTSvocd z7JyAJ%3y(EZG@>Gxw#Wl)nMW&&DO=2Y|Xn-WN>D9F0*93+~>pjqLgsf6oznMbGj>W z7WHTwnmypnKr%?Mc{pVys~M|}@L)B}IrNnC#%k(x-udS}xf{HR&%9UY29prrVdb(2 zFY)fl8U^N;I$MsqNRkYUUs4uwC;hC$0~K>6`kC|qqW+?YfW$C=+9%`Yu~|JWJ$)d; z;(}LB1DtI4b$!|UI=#?`V%4Jt;hqm*F|30(_!`z$YpsF6e(V|+9LVYd!1t$7`GdO3 z?G3p$74~$$Cz^r64uynaXr$IliiSekCK3+~=prW~n{CyPBEb2Ci>x59T|r7BG`FEO}~YVt#J#pA4Ag=^$%lmqis*+agK*ixWR?t zmd-bB+`wT9LKW-FW%&AJzslOa8ncnsGIm$ui$RKR8pXli+}xvY%G|7A>2sNbv6`BUch@ES43#)xV-a)Th3O-1E} zm{7(agKy6xq%q+JZvb~GvR7>$NUGuImkAJ>J!>>YH8L+&3cVC4t_@4Uw7oU&h^JVxP2A?y- j=bZSt8vK7LkbLFt;An{uN4q#wH`4LLdWUijp8ENpw}g%~ diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-deptLeader.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-deptLeader.form deleted file mode 100644 index b62459fe0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-deptLeader.form +++ /dev/null @@ -1,31 +0,0 @@ -
- -
${applyUserId}
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
\ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-hr.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-hr.form deleted file mode 100644 index e177d2795..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/approve-hr.form +++ /dev/null @@ -1,31 +0,0 @@ -
- -
${applyUserId}
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
\ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.bpmn deleted file mode 100644 index 7f030216e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.bpmn +++ /dev/null @@ -1,151 +0,0 @@ - - - - 《Activiti实战》第6章的例å­--å¤–ç½®è¡¨å• - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 请求被驳回åŽå‘˜å·¥å¯ä»¥é€‰æ‹©ç»§ç»­ç”³è¯·ï¼Œæˆ–者å–消本次申请 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.png deleted file mode 100644 index 5e8d231a8a8064147a326d92103c64598579452e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28008 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.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 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.zip b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-formkey.zip deleted file mode 100644 index f846913b7106d0a273d98b39575eb105e65163c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30257 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
  • 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 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-start.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-start.form deleted file mode 100644 index 7b6ce7814..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/leave-start.form +++ /dev/null @@ -1,18 +0,0 @@ -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/modify-apply.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/modify-apply.form deleted file mode 100644 index 72f326905..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/modify-apply.form +++ /dev/null @@ -1,27 +0,0 @@ -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/report-back.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/report-back.form deleted file mode 100644 index f05bf8e7e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-formkey/report-back.form +++ /dev/null @@ -1,28 +0,0 @@ -
    - -
    ${applyUserId}
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-deptLeader.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-deptLeader.form deleted file mode 100644 index b62459fe0..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-deptLeader.form +++ /dev/null @@ -1,31 +0,0 @@ -
    - -
    ${applyUserId}
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-hr.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-hr.form deleted file mode 100644 index e177d2795..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/approve-hr.form +++ /dev/null @@ -1,31 +0,0 @@ -
    - -
    ${applyUserId}
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn deleted file mode 100644 index 8241fed88..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.bpmn +++ /dev/null @@ -1,188 +0,0 @@ - - - - 《Activiti实战》第6章的例å­--å¤–ç½®è¡¨å• - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 倒计时30秒 - - - = 10000}]]> - - - - - - - - - 请求被驳回åŽå‘˜å·¥å¯ä»¥é€‰æ‹©ç»§ç»­ç”³è¯·ï¼Œæˆ–者å–消本次申请 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-formkey-ext.png deleted file mode 100644 index be7e777c8975892446c00e1c4d40009361f76730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17724 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 R|JRWl>blnouH1e4zW@a`18M*O diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-start.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-start.form deleted file mode 100644 index 7b6ce7814..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/leave-start.form +++ /dev/null @@ -1,18 +0,0 @@ -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/modify-apply.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/modify-apply.form deleted file mode 100644 index 72f326905..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/modify-apply.form +++ /dev/null @@ -1,27 +0,0 @@ -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/report-back.form b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/report-back.form deleted file mode 100644 index f05bf8e7e..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/chapter6/leave-timeLimit-money/report-back.form +++ /dev/null @@ -1,28 +0,0 @@ -
    - -
    ${applyUserId}
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.bpmn deleted file mode 100644 index bdb56857d..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.bpmn +++ /dev/null @@ -1,152 +0,0 @@ - - - - 请å‡æµç¨‹æ¼”示-会签 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/leave-countersign.png deleted file mode 100644 index e2a6f2ca2e59fc15fc8891bfc7cfe824e99846b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20431 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 diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceFixedNumbers.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceFixedNumbers.bpmn deleted file mode 100644 index 998570919..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceFixedNumbers.bpmn +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - ${loop} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.bpmn deleted file mode 100644 index 05a87d939..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.bpmn +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.exception.png deleted file mode 100644 index 5ac829387533a40644db4840941dde200d37ba6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11790 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 UyGMZ|)gYVmj=z+jy>ah<0npM - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.sequential.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.sequential.bpmn deleted file mode 100644 index c7bc82b4f..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.sequential.bpmn +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.nosequential.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.nosequential.bpmn deleted file mode 100644 index ca117190c..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.nosequential.bpmn +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.bpmn deleted file mode 100644 index 5dbd39676..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.bpmn +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.bpmn b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.bpmn deleted file mode 100644 index d8fc63a55..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.bpmn +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - ${nrOfCompletedInstances / nrOfInstances >= rate} - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.png b/yudao-module-bpm/yudao-module-bpm-biz-flowable/src/test/resources/diagrams/chapter9/testMultiInstanceForUserTask.users.sequential.with.complete.conditon.png deleted file mode 100644 index c20f451b89426ef0a1482d247f18b36e7aaed126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8007 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 - - - - - - - - - - - - - - - - - - \ No newline at end of file