From efb628be5fa9a051d9a692cb64d9bef334723618 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 4 Aug 2024 13:47:48 +0800 Subject: [PATCH 001/227] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0warm-flow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 +- .../src/main/resources/application.yml | 35 +- .../common/core/service/WorkflowService.java | 2 +- ruoyi-modules/ruoyi-workflow/pom.xml | 52 +- .../workflow/config/WarmFlowConfig.java | 25 + .../controller/ActModelController.java | 147 --- .../ActProcessDefinitionController.java | 147 --- .../ActProcessInstanceController.java | 160 --- .../controller/ActTaskController.java | 295 ----- .../controller/FlwDefinitionController.java | 178 +++ .../controller/FlwInstanceController.java | 79 ++ .../controller/FlwTaskController.java | 231 ++++ .../workflow/domain/ActHiProcinst.java | 152 --- .../workflow/domain/ActHiTaskinst.java | 193 --- .../workflow/domain/WfDefinitionConfig.java | 2 +- .../workflow/domain/WfTaskBackNode.java | 61 - .../workflow/domain/bo/AddSignatureBo.java | 38 + .../workflow/domain/bo/BackProcessBo.java | 23 +- .../workflow/domain/bo/CompleteTaskBo.java | 5 +- .../workflow/domain/bo/DelegateBo.java | 22 +- .../workflow/domain/bo/FlowTaskBo.java | 39 + ...ProcessInstanceBo.java => InstanceBo.java} | 2 +- .../domain/bo/ReductionSignatureBo.java | 38 + .../workflow/domain/bo/TerminationBo.java | 6 +- .../bo/{TransmitBo.java => TransferBo.java} | 25 +- .../domain/bo/WfDefinitionConfigBo.java | 4 +- .../workflow/domain/vo/ActHistoryInfoVo.java | 6 - .../workflow/domain/vo/FlowDefinitionVo.java | 6 + .../workflow/domain/vo/FlowHisTaskVo.java | 24 + .../workflow/domain/vo/FlowTaskVo.java | 29 + .../domain/vo/WfDefinitionConfigVo.java | 2 +- .../CustomDefaultProcessDiagramCanvas.java | 108 -- .../CustomDefaultProcessDiagramGenerator.java | 1120 ----------------- .../cmd/AddSequenceMultiInstanceCmd.java | 61 - .../workflow/flowable/cmd/AttachmentCmd.java | 66 - .../flowable/cmd/DeleteExecutionCmd.java | 36 - .../cmd/DeleteSequenceMultiInstanceCmd.java | 83 -- .../cmd/ExecutionChildByExecutionIdCmd.java | 39 - .../flowable/cmd/UpdateBusinessStatusCmd.java | 37 - .../flowable/cmd/UpdateHiTaskInstCmd.java | 51 - .../flowable/config/FlowableConfig.java | 32 - .../config/GlobalFlowableListener.java | 139 -- .../handler/FlowProcessEventHandler.java | 50 - .../handler/TaskTimeoutJobHandler.java | 37 - .../workflow/mapper/ActHiProcinstMapper.java | 16 - .../workflow/mapper/ActHiTaskinstMapper.java | 16 - .../workflow/mapper/ActTaskMapper.java | 47 - .../workflow/mapper/FlwTaskMapper.java | 51 + .../workflow/mapper/WfTaskBackNodeMapper.java | 13 - .../service/IActHiProcinstService.java | 31 - .../service/IActHiTaskinstService.java | 11 - .../workflow/service/IActModelService.java | 83 -- .../service/IActProcessDefinitionService.java | 91 -- .../service/IActProcessInstanceService.java | 110 -- .../workflow/service/IActTaskService.java | 161 --- .../service/IFlwDefinitionService.java | 35 + .../workflow/service/IFlwInstanceService.java | 66 + .../workflow/service/IFlwTaskService.java | 68 + .../service/IWfTaskBackNodeService.java | 65 - .../impl/ActHiProcinstServiceImpl.java | 51 - .../impl/ActHiTaskinstServiceImpl.java | 18 - .../service/impl/ActModelServiceImpl.java | 429 ------- .../impl/ActProcessDefinitionServiceImpl.java | 440 ------- .../impl/ActProcessInstanceServiceImpl.java | 685 ---------- .../service/impl/ActTaskServiceImpl.java | 852 ------------- .../impl/FlwDefinitionServiceImpl.java | 77 ++ .../service/impl/FlwInstanceServiceImpl.java | 157 +++ .../service/impl/FlwTaskServiceImpl.java | 204 +++ .../service/impl/TestLeaveServiceImpl.java | 4 +- .../service/impl/WfCategoryServiceImpl.java | 20 - .../impl/WfTaskBackNodeServiceImpl.java | 144 --- .../service/impl/WorkflowServiceImpl.java | 32 +- .../dromara/workflow/utils/ModelUtils.java | 289 ----- .../dromara/workflow/utils/QueryUtils.java | 169 --- .../dromara/workflow/utils/WorkflowUtils.java | 223 +--- .../mapper/workflow/ActHiProcinstMapper.xml | 7 - .../mapper/workflow/ActHiTaskinstMapper.xml | 7 - .../mapper/workflow/ActTaskMapper.xml | 78 -- .../mapper/workflow/FlwTaskMapper.xml | 153 +++ .../mapper/workflow/WfNodeConfigMapper.xml | 7 - script/bpmn/leaveFlow-serial1.xml | 38 + script/bpmn/模型.zip | Bin 8543 -> 0 bytes script/sql/flowable.sql | 2 +- 83 files changed, 1642 insertions(+), 7206 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{ProcessInstanceBo.java => InstanceBo.java} (90%) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{TransmitBo.java => TransferBo.java} (50%) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml create mode 100644 script/bpmn/leaveFlow-serial1.xml delete mode 100644 script/bpmn/模型.zip diff --git a/pom.xml b/pom.xml index 9a39bb8ce..590ffa196 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 8.7.2-20240722 - 7.0.1 + 1.2.3 3.2.2 @@ -116,13 +116,12 @@ - org.flowable - flowable-bom - ${flowable.version} - pom - import + io.github.minliuhua + warm-flow-mybatis-plus-sb-starter + ${warm-flow} + me.zhyd.oauth diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index f9a9cc3a9..a101e9523 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -270,20 +270,21 @@ websocket: # 设置访问源地址 allowedOrigins: '*' ---- #flowable配置 -flowable: - async-executor-activate: false #关闭定时任务JOB - # 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。 - database-schema-update: true - activity-font-name: 宋体 - label-font-name: 宋体 - annotation-font-name: 宋体 - # 关闭各个模块生成表,目前只使用工作流基础表 - idm: - enabled: false - cmmn: - enabled: false - dmn: - enabled: false - app: - enabled: false +--- # warm-flow工作流配置 +warm-flow: + # 是否显示banner图,默认是 + banner: true + # 填充器 (可配置文件注入,也可用@Bean/@Component方式) + data-fill-handler-path: com.ruoyi.system.handle.CustomDataFillHandler + # 全局租户处理器(可配置文件注入,也可用@Bean/@Component方式) + tenant_handler_path: com.ruoyi.system.handle.CustomTenantHandler + # 是否开启逻辑删除 + logic_delete: false + # 逻辑删除字段值(开启后默认为2) + logic_delete_value: 2 + # 逻辑未删除字段(开启后默认为0) + logic_not_delete_value: 0 + # 数据源类型, mybatis模块对orm进一步的封装, 由于各数据库分页语句存在差异, + # 当配置此参数时, 以此参数结果为基准, 未配置时, 取DataSource中数据源类型, + # 兜底为mysql数据库 + data_source_type: mysql diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 4e556c9cb..2ff5c1d3f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -16,7 +16,7 @@ public interface WorkflowService { * @param businessKeys 业务id * @return 结果 */ - boolean deleteRunAndHisInstance(List businessKeys); + boolean deleteInstance(List businessKeys); /** * 获取当前流程状态 diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 9ed40970a..fb4e192e1 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -18,54 +18,6 @@ - - - org.flowable - flowable-spring-boot-autoconfigure - - - org.flowable - flowable-spring-security - - - - - - org.flowable - flowable-spring-configurator - - - - org.flowable - flowable-spring-boot-starter-actuator - - - - - org.flowable - flowable-image-generator - - - - - org.flowable - flowable-json-converter - 6.8.0 - - - - - org.apache.xmlgraphics - batik-all - 1.10 - - - xalan - xalan - - - - org.dromara ruoyi-common-websocket @@ -113,6 +65,10 @@ org.dromara ruoyi-common-security + + io.github.minliuhua + warm-flow-mybatis-plus-sb-starter + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java new file mode 100644 index 000000000..5df842ae5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -0,0 +1,25 @@ +package org.dromara.workflow.config; + + +import com.warm.flow.core.handler.TenantHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.dromara.common.satoken.utils.LoginHelper; + +/** + * 任务状态枚举 + * + * @author may + */ +@Configuration +public class WarmFlowConfig { + + /** + * 全局租户处理器(可配置文件注入,也可用@Bean/@Component方式) + */ + @Bean + public TenantHandler tenantHandler() { + return LoginHelper::getTenantId; + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java deleted file mode 100644 index 3332f86a5..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.dromara.workflow.controller; - -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.vo.ModelVo; -import org.dromara.workflow.service.IActModelService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.repository.Model; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.List; - -/** - * 模型管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/model") -public class ActModelController extends BaseController { - - private final RepositoryService repositoryService; - - private final IActModelService actModelService; - - - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - */ - @GetMapping("/list") - public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { - return actModelService.page(modelBo, pageQuery); - } - - /** - * 新增模型 - * - * @param modelBo 模型请求对象 - */ - @Log(title = "模型管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/save") - public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) { - return toAjax(actModelService.saveNewModel(modelBo)); - } - - /** - * 查询模型 - * - * @param id 模型id - */ - @GetMapping("/getInfo/{id}") - public R getInfo(@NotBlank(message = "模型id不能为空") @PathVariable String id) { - return R.ok(actModelService.getInfo(id)); - } - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - */ - @Log(title = "模型管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping(value = "/update") - public R update(@RequestBody ModelBo modelBo) { - return toAjax(actModelService.update(modelBo)); - } - - /** - * 编辑XMl模型 - * - * @param modelBo 模型数据 - */ - @Log(title = "模型管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping(value = "/editModelXml") - public R editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) { - return toAjax(actModelService.editModelXml(modelBo)); - } - - /** - * 删除流程模型 - * - * @param ids 模型id - */ - @Log(title = "模型管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/{ids}") - @Transactional(rollbackFor = Exception.class) - public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) { - Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel); - return R.ok(); - } - - /** - * 模型部署 - * - * @param id 模型id - */ - @Log(title = "模型管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/modelDeploy/{id}") - public R deploy(@NotBlank(message = "模型id不能为空") @PathVariable("id") String id) { - return toAjax(actModelService.modelDeploy(id)); - } - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 相应 - */ - @GetMapping("/export/zip/{modelIds}") - public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable List modelIds, - HttpServletResponse response) { - actModelService.exportZip(modelIds, response); - } - - /** - * 复制模型 - * - * @param modelBo 模型数据 - */ - @PostMapping("/copyModel") - public R copyModel(@RequestBody ModelBo modelBo) { - return toAjax(actModelService.copyModel(modelBo)); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java deleted file mode 100644 index 5198bd164..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.dromara.workflow.controller; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.ProcessDefinitionBo; -import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.dromara.workflow.service.IActProcessDefinitionService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -/** - * 流程定义管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/processDefinition") -public class ActProcessDefinitionController extends BaseController { - - private final IActProcessDefinitionService actProcessDefinitionService; - - /** - * 分页查询 - * - * @param bo 参数 - */ - @GetMapping("/list") - public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { - return actProcessDefinitionService.page(bo, pageQuery); - } - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - */ - @GetMapping("/getListByKey/{key}") - public R> getListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { - return R.ok("操作成功", actProcessDefinitionService.getListByKey(key)); - } - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - */ - @GetMapping("/definitionImage/{processDefinitionId}") - public R definitionImage(@PathVariable String processDefinitionId) { - return R.ok("操作成功", actProcessDefinitionService.definitionImage(processDefinitionId)); - } - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - */ - @GetMapping("/definitionXml/{processDefinitionId}") - public R> definitionXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - Map map = new HashMap<>(); - String xmlStr = actProcessDefinitionService.definitionXml(processDefinitionId); - map.put("xml", Arrays.asList(xmlStr.split("\n"))); - map.put("xmlStr", xmlStr); - return R.ok(map); - } - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{deploymentIds}/{processDefinitionIds}") - public R deleteDeployment(@NotNull(message = "流程部署id不能为空") @PathVariable List deploymentIds, - @NotNull(message = "流程定义id不能为空") @PathVariable List processDefinitionIds) { - return toAjax(actProcessDefinitionService.deleteDeployment(deploymentIds, processDefinitionIds)); - } - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/updateDefinitionState/{processDefinitionId}") - public R updateDefinitionState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(actProcessDefinitionService.updateDefinitionState(processDefinitionId)); - } - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/migrationDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") - public R migrationDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, - @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { - return toAjax(actProcessDefinitionService.migrationDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); - } - - /** - * 流程定义转换为模型 - * - * @param processDefinitionId 流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/convertToModel/{processDefinitionId}") - public R convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(actProcessDefinitionService.convertToModel(processDefinitionId)); - } - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - @Log(title = "流程定义管理", businessType = BusinessType.INSERT) - @PostMapping("/deployByFile") - public void deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { - actProcessDefinitionService.deployByFile(file, categoryCode); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java deleted file mode 100644 index 931b9f568..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ /dev/null @@ -1,160 +0,0 @@ -package org.dromara.workflow.controller; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.ProcessInstanceBo; -import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.bo.TaskUrgingBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; -import org.dromara.workflow.domain.vo.ProcessInstanceVo; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * 流程实例管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/processInstance") -public class ActProcessInstanceController extends BaseController { - - private final IActProcessInstanceService actProcessInstanceService; - - /** - * 分页查询正在运行的流程实例 - * - * @param bo 参数 - */ - @GetMapping("/getPageByRunning") - public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByRunning(bo, pageQuery); - } - - /** - * 分页查询已结束的流程实例 - * - * @param bo 参数 - */ - @GetMapping("/getPageByFinish") - public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByFinish(bo, pageQuery); - } - - /** - * 通过业务id获取历史流程图 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryImage/{businessKey}") - public R getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey)); - } - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryList/{businessKey}") - public R> getHistoryList(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok("操作成功", actProcessInstanceService.getHistoryList(businessKey)); - } - - /** - * 获取审批记录 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryRecord/{businessKey}") - public R> getHistoryRecord(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok(actProcessInstanceService.getHistoryRecord(businessKey)); - } - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @PostMapping("/deleteRunInstance") - public R deleteRunInstance(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { - return toAjax(actProcessInstanceService.deleteRunInstance(processInvalidBo)); - } - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/deleteRunAndHisInstance/{businessKeys}") - public R deleteRunAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { - return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys))); - } - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}") - public R deleteFinishAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { - return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys))); - } - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/cancelProcessApply/{businessKey}") - public R cancelProcessApply(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return toAjax(actProcessInstanceService.cancelProcessApply(businessKey)); - } - - /** - * 分页查询当前登录人单据 - * - * @param bo 参数 - */ - @GetMapping("/getPageByCurrent") - public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByCurrent(bo, pageQuery); - } - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - */ - @Log(title = "流程实例管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/taskUrging") - public R taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) { - return toAjax(actProcessInstanceService.taskUrging(taskUrgingBo)); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java deleted file mode 100644 index 75f9d9b2a..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ /dev/null @@ -1,295 +0,0 @@ -package org.dromara.workflow.controller; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import jakarta.validation.constraints.NotBlank; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.domain.vo.VariableVo; -import org.dromara.workflow.service.IActTaskService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.engine.TaskService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * 任务管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/task") -public class ActTaskController extends BaseController { - - private final IActTaskService actTaskService; - - private final TaskService taskService; - - private final IWfTaskBackNodeService wfTaskBackNodeService; - - - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/startWorkFlow") - public R> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { - Map map = actTaskService.startWorkFlow(startProcessBo); - return R.ok("提交成功", map); - } - - /** - * 办理任务 - * - * @param completeTaskBo 办理任务参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/completeTask") - public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { - return toAjax(actTaskService.completeTask(completeTaskBo)); - } - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskWait") - public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskWait(taskBo, pageQuery); - } - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByAllTaskWait") - public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByAllTaskWait(taskBo, pageQuery); - } - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskFinish") - public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskFinish(taskBo, pageQuery); - } - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskCopy") - public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskCopy(taskBo, pageQuery); - } - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByAllTaskFinish") - public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByAllTaskFinish(taskBo, pageQuery); - } - - /** - * 签收(拾取)任务 - * - * @param taskId 任务id - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/claim/{taskId}") - public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { - try { - taskService.claim(taskId, Convert.toStr(LoginHelper.getUserId())); - return R.ok(); - } catch (Exception e) { - e.printStackTrace(); - return R.fail("签收任务失败:" + e.getMessage()); - } - } - - /** - * 归还(拾取的)任务 - * - * @param taskId 任务id - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/returnTask/{taskId}") - public R returnTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { - try { - taskService.setAssignee(taskId, null); - return R.ok(); - } catch (Exception e) { - e.printStackTrace(); - return R.fail("归还任务失败:" + e.getMessage()); - } - } - - /** - * 委派任务 - * - * @param delegateBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/delegateTask") - public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { - return toAjax(actTaskService.delegateTask(delegateBo)); - } - - /** - * 终止任务 - * - * @param terminationBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @PostMapping("/terminationTask") - public R terminationTask(@RequestBody TerminationBo terminationBo) { - return toAjax(actTaskService.terminationTask(terminationBo)); - } - - /** - * 转办任务 - * - * @param transmitBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/transferTask") - public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { - return toAjax(actTaskService.transferTask(transmitBo)); - } - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/addMultiInstanceExecution") - public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { - return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo)); - } - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/deleteMultiInstanceExecution") - public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { - return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo)); - } - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/backProcess") - public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) { - return R.ok("操作成功", actTaskService.backProcess(backProcessBo)); - } - - /** - * 获取当前任务 - * - * @param taskId 任务id - */ - @GetMapping("/getTaskById/{taskId}") - public R getTaskById(@PathVariable String taskId) { - return R.ok(QueryUtils.getTask(taskId)); - } - - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @param userId 办理人id - */ - @Log(title = "任务管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/updateAssignee/{taskIds}/{userId}") - public R updateAssignee(@PathVariable String[] taskIds, @PathVariable String userId) { - return toAjax(actTaskService.updateAssignee(taskIds, userId)); - } - - /** - * 查询流程变量 - * - * @param taskId 任务id - */ - @GetMapping("/getInstanceVariable/{taskId}") - public R> getProcessInstVariable(@PathVariable String taskId) { - return R.ok(actTaskService.getInstanceVariable(taskId)); - } - - /** - * 获取可驳回得任务节点 - * - * @param processInstanceId 流程实例id - */ - @GetMapping("/getTaskNodeList/{processInstanceId}") - public R> getNodeList(@PathVariable String processInstanceId) { - return R.ok(CollUtil.reverse(wfTaskBackNodeService.getListByInstanceId(processInstanceId))); - } - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - */ - @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}") - public R getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) { - return R.ok("操作成功", actTaskService.getTaskUserIdsByAddMultiInstance(taskId)); - } - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id - */ - @GetMapping("/getListByDeleteMultiInstance/{taskId}") - public R> getListByDeleteMultiInstance(@PathVariable String taskId) { - return R.ok(actTaskService.getListByDeleteMultiInstance(taskId)); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java new file mode 100644 index 000000000..74b9c9891 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -0,0 +1,178 @@ +package org.dromara.workflow.controller; + +import com.warm.flow.core.entity.Definition; +import com.warm.flow.core.service.DefService; +import com.warm.flow.orm.entity.FlowDefinition; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.service.IFlwDefinitionService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + + +/** + * 流程定义管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/definition") +public class FlwDefinitionController extends BaseController { + + private final IFlwDefinitionService iFlwDefinitionService; + private final DefService defService; + + /** + * 分页查询 + * + * @param flowDefinition 参数 + */ + @GetMapping("/list") + public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { + return iFlwDefinitionService.page(flowDefinition, pageQuery); + } + + /** + * 获取流程定义详细信息 + * + * @param id 流程定义id + */ + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable Long id) { + return R.ok(defService.getById(id)); + } + + /** + * 新增流程定义 + * + * @param flowDefinition 参数 + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @PostMapping + @Transactional(rollbackFor = Exception.class) + public R add(@RequestBody FlowDefinition flowDefinition) { + return R.ok(defService.checkAndSave(flowDefinition)); + } + + /** + * 修改流程定义 + * + * @param flowDefinition 参数 + */ + @Log(title = "流程定义", businessType = BusinessType.UPDATE) + @PutMapping + @Transactional(rollbackFor = Exception.class) + public R edit(@RequestBody FlowDefinition flowDefinition) { + return R.ok(defService.updateById(flowDefinition)); + } + + /** + * 发布流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @GetMapping("/publish/{id}") + @Transactional(rollbackFor = Exception.class) + public R publish(@PathVariable Long id) { + return R.ok(defService.publish(id)); + } + + /** + * 取消发布流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @GetMapping("/unPublish/{id}") + @Transactional(rollbackFor = Exception.class) + public R unPublish(@PathVariable Long id) { + defService.unPublish(id); + return R.ok(); + } + + /** + * 删除流程定义 + */ + @Log(title = "流程定义", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @Transactional(rollbackFor = Exception.class) + public R remove(@PathVariable List ids) { + return R.ok(defService.removeDef(ids)); + } + + /** + * 复制流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @GetMapping("/copyDef/{id}") + @Transactional(rollbackFor = Exception.class) + public R copyDef(@PathVariable Long id) { + return R.ok(defService.copyDef(id)); + } + + /** + * 导入流程定义 + * + * @param file 文件 + * @throws Exception 异常 + */ + @Log(title = "流程定义", businessType = BusinessType.IMPORT) + @PostMapping("/importDefinition") + @Transactional(rollbackFor = Exception.class) + public R importDefinition(MultipartFile file) throws Exception { + defService.importXml(file.getInputStream()); + return R.ok(); + } + + /** + * 导出流程定义 + * + * @param id 流程定义id + * @param response 响应 + * @throws IOException 异常 + */ + @Log(title = "流程定义", businessType = BusinessType.EXPORT) + @PostMapping("/exportDefinition/{id}") + public void exportDefinition(@PathVariable Long id, HttpServletResponse response) throws IOException { + iFlwDefinitionService.exportDefinition(id, response); + } + + /** + * 获取流程定义xml字符串 + * + * @param id 流程定义id + */ + @GetMapping("/xmlString/{id}") + public R xmlString(@PathVariable Long id) { + return R.ok(defService.xmlString(id)); + } + + /** + * 查询流程图 + * + * @param instanceId 流程实例id + * @throws IOException 异常 + */ + @GetMapping("/flowChart/{instanceId}") + public R flowChart(@PathVariable Long instanceId) throws IOException { + return R.ok(defService.flowChart(instanceId)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java new file mode 100644 index 000000000..61abe356c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -0,0 +1,79 @@ +package org.dromara.workflow.controller; + +import com.warm.flow.core.entity.Instance; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.service.IFlwInstanceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 流程实例管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/processInstance") +public class FlwInstanceController extends BaseController { + + private final IFlwInstanceService flwInstanceService; + + /** + * 分页查询正在运行的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByRunning") + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + return flwInstanceService.getPageByRunning(instance, pageQuery); + } + + /** + * 分页查询已结束的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByFinish") + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + return flwInstanceService.getPageByFinish(instance, pageQuery); + } + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + */ + @DeleteMapping("/deleteByBusinessIds/{businessIds}") + public R deleteByBusinessIds(@PathVariable List businessIds) { + return toAjax(flwInstanceService.deleteByBusinessIds(businessIds)); + } + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + */ + @DeleteMapping("/deleteByInstanceIds/{instanceIds}") + public R deleteByInstanceIds(@PathVariable List instanceIds) { + return toAjax(flwInstanceService.deleteByInstanceIds(instanceIds)); + } + + /** + * 撤销流程 + * + * @param businessId 业务id + */ + @PutMapping("/cancelProcessApply/{businessId}") + public R cancelProcessApply(@PathVariable String businessId) { + return toAjax(flwInstanceService.cancelProcessApply(businessId)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java new file mode 100644 index 000000000..f367c77b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -0,0 +1,231 @@ +package org.dromara.workflow.controller; + +import com.warm.flow.core.dto.FlowParams; +import com.warm.flow.core.dto.ModifyHandler; +import com.warm.flow.core.entity.Instance; +import com.warm.flow.core.entity.Task; +import com.warm.flow.core.enums.CooperateType; +import com.warm.flow.core.service.TaskService; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.Map; + +/** + * 任务管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/task") +public class FlwTaskController extends BaseController { + + private final IFlwTaskService flwTaskService; + private final TaskService taskService; + + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/startWorkFlow") + public R> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { + Map map = flwTaskService.startWorkFlow(startProcessBo); + return R.ok("提交成功", map); + } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/completeTask") + public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { + return toAjax(flwTaskService.completeTask(completeTaskBo)); + } + + /** + * 查询当前用户的待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByTaskWait") + public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.getPageByTaskWait(flowTaskBo, pageQuery); + } + + /** + * 查询当前用户的已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + + @GetMapping("/getPageByTaskFinish") + public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.getPageByTaskFinish(flowTaskBo, pageQuery); + } + + /** + * 查询当前用户的抄送 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByTaskCopy") + public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.getPageByTaskCopy(flowTaskBo, pageQuery); + } + + /** + * 根据taskId查询代表任务 + * + * @param taskId 任务id + */ + @GetMapping("/getTaskById/{taskId}") + public R getTaskById(@PathVariable Long taskId) { + return R.ok(taskService.getById(taskId)); + } + + /** + * 终止任务 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/terminationTask") + public R terminationTask(@RequestBody TerminationBo bo) { + FlowParams flowParams = new FlowParams(); + flowParams.handler(String.valueOf(LoginHelper.getUserId())); + flowParams.message(bo.getComment()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + return R.ok(taskService.termination(bo.getTaskId(), flowParams)); + } + + /** + * 委派任务 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/delegateTask") + public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { + return toAjax(taskService.depute( + bo.getTaskId(), + String.valueOf(LoginHelper.getUserId()), + WorkflowUtils.permissionList(), + bo.getUserIds(), + bo.getMessage())); + } + + /** + * 转办任务 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/transferTask") + public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { + return toAjax(taskService.transfer( + bo.getTaskId(), + String.valueOf(LoginHelper.getUserId()), + WorkflowUtils.permissionList(), + bo.getUserIds(), + bo.getMessage())); + } + + /** + * 加签 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/addSignature") + public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { + return toAjax(taskService.addSignature( + bo.getTaskId(), + String.valueOf(LoginHelper.getUserId()), + WorkflowUtils.permissionList(), + bo.getUserIds(), + bo.getMessage())); + } + + /** + * 减签 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/reductionSignature") + public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { + return toAjax(taskService.reductionSignature( + bo.getTaskId(), + String.valueOf(LoginHelper.getUserId()), + WorkflowUtils.permissionList(), + bo.getUserIds(), + bo.getMessage())); + } + + /** + * 修改任务办理人 + * + * @param taskId 任务id + * @param userId 办理人id + */ + @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/updateAssignee/{taskId}/{userId}") + public R updateAssignee(@PathVariable Long taskId, @PathVariable String userId) { + ModifyHandler modifyHandler = new ModifyHandler() + .setTaskId(taskId) + .setAddHandlers(Collections.singletonList(userId)) + .setPermissionFlag(WorkflowUtils.permissionList()) + .setCooperateType(CooperateType.APPROVAL.getKey()) + .setMessage("修改任务办理人") + .setCurUser(String.valueOf(LoginHelper.getUserId())) + .setIgnore(false); + return toAjax(taskService.updateHandler(modifyHandler)); + } + + /** + * 驳回审批 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/backProcess") + public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo bo) { + return toAjax(flwTaskService.backProcess(bo)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java deleted file mode 100644 index e87fb9253..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 流程实例对象 act_hi_procinst - * - * @author may - * @date 2023-07-22 - */ -@Data -@TableName("act_hi_procinst") -public class ActHiProcinst implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "ID_") - private String id; - - /** - * - */ - @TableField(value = "REV_") - private Long rev; - - /** - * - */ - @TableField(value = "PROC_INST_ID_") - private String procInstId; - - /** - * - */ - @TableField(value = "BUSINESS_KEY_") - private String businessKey; - - /** - * - */ - @TableField(value = "PROC_DEF_ID_") - private String procDefId; - - /** - * - */ - @TableField(value = "START_TIME_") - private Date startTime; - - /** - * - */ - @TableField(value = "END_TIME_") - private Date endTime; - - /** - * - */ - @TableField(value = "DURATION_") - private Long duration; - - /** - * - */ - @TableField(value = "START_USER_ID_") - private String startUserId; - - /** - * - */ - @TableField(value = "START_ACT_ID_") - private String startActId; - - /** - * - */ - @TableField(value = "END_ACT_ID_") - private String endActId; - - /** - * - */ - @TableField(value = "SUPER_PROCESS_INSTANCE_ID_") - private String superProcessInstanceId; - - /** - * - */ - @TableField(value = "DELETE_REASON_") - private String deleteReason; - - /** - * - */ - @TableField(value = "TENANT_ID_") - private String tenantId; - - /** - * - */ - @TableField(value = "NAME_") - private String name; - - /** - * - */ - @TableField(value = "CALLBACK_ID_") - private String callbackId; - - /** - * - */ - @TableField(value = "CALLBACK_TYPE_") - private String callbackType; - - /** - * - */ - @TableField(value = "REFERENCE_ID_") - private String referenceId; - - /** - * - */ - @TableField(value = "REFERENCE_TYPE_") - private String referenceType; - - /** - * - */ - @TableField(value = "PROPAGATED_STAGE_INST_ID_") - private String propagatedStageInstId; - - /** - * - */ - @TableField(value = "BUSINESS_STATUS_") - private String businessStatus; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java deleted file mode 100644 index abc17b54c..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -import java.io.Serial; - -/** - * 流程历史任务对象 act_hi_taskinst - * - * @author may - * @date 2024-03-02 - */ -@Data -@TableName("act_hi_taskinst") -public class ActHiTaskinst implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "ID_") - private String id; - - /** - * 版本 - */ - @TableField(value = "REV_") - private Long rev; - - /** - * 流程定义id - */ - @TableField(value = "PROC_DEF_ID_") - private String procDefId; - - /** - * - */ - @TableField(value = "TASK_DEF_ID_") - private String taskDefId; - - /** - * 任务节点id - */ - @TableField(value = "TASK_DEF_KEY_") - private String taskDefKey; - - /** - * 流程实例id - */ - @TableField(value = "PROC_INST_ID_") - private String procInstId; - - /** - * 流程执行id - */ - @TableField(value = "EXECUTION_ID") - private String executionId; - - /** - * - */ - @TableField(value = "SCOPE_ID_") - private String scopeId; - - /** - * - */ - @TableField(value = "SUB_SCOPE_ID_") - private String subScopeId; - - /** - * 先用当前字段标识抄送类型 - */ - @TableField(value = "SCOPE_TYPE_") - private String scopeType; - - /** - * - */ - @TableField(value = "SCOPE_DEFINITION_ID_") - private String scopeDefinitionId; - - /** - * - */ - @TableField(value = "PROPAGATED_STAGE_INST_ID_") - private String propagatedStageInstId; - - /** - * 任务名称 - */ - @TableField(value = "NAME_") - private String name; - - /** - * 父级id - */ - @TableField(value = "PARENT_TASK_ID_") - private String parentTaskId; - - /** - * 描述 - */ - @TableField(value = "DESCRIPTION_") - private String description; - - /** - * 办理人 - */ - @TableField(value = "OWNER_") - private String owner; - - /** - * 办理人 - */ - @TableField(value = "ASSIGNEE_") - private String assignee; - - /** - * 开始事件 - */ - @TableField(value = "START_TIME_") - private Date startTime; - - /** - * 认领时间 - */ - @TableField(value = "CLAIM_TIME_") - private Date claimTime; - - /** - * 结束时间 - */ - @TableField(value = "END_TIME_") - private Date endTime; - - /** - * 持续时间 - */ - @TableField(value = "DURATION_") - private Long duration; - - /** - * 删除原因 - */ - @TableField(value = "DELETE_REASON_") - private String deleteReason; - - /** - * 优先级 - */ - @TableField(value = "PRIORITY_") - private Long priority; - - /** - * 到期时间 - */ - @TableField(value = "DUE_DATE_") - private Date dueDate; - - /** - * - */ - @TableField(value = "FORM_KEY_") - private String formKey; - - /** - * 分类 - */ - @TableField(value = "CATEGORY_") - private String category; - - /** - * 最后修改时间 - */ - @TableField(value = "LAST_UPDATED_TIME_") - private Date lastUpdatedTime; - - /** - * 租户id - */ - @TableField(value = "TENANT_ID_") - private String tenantId; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java index 11dcaa081..817a7a307 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java @@ -45,7 +45,7 @@ public class WfDefinitionConfig extends BaseEntity { /** * 流程版本 */ - private Integer version; + private String version; /** * 备注 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java deleted file mode 100644 index 6f5972794..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 节点驳回记录 wf_task_back_node - * - * @author may - * @date 2024-03-13 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_task_back_node") -public class WfTaskBackNode extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 实例id - */ - private String instanceId; - - /** - * 节点id - */ - private String nodeId; - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 排序 - */ - private Integer orderNo; - - /** - * 节点类型 - */ - private String taskType; - - /** - * 办理人 - */ - private String assignee; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java new file mode 100644 index 000000000..e546249bc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 加签请求对象 + * + * @author may + */ +@Data +public class AddSignatureBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 加签人id + */ + @NotNull(message = "加签id不能为空", groups = {AddGroup.class}) + private List userIds; + + /** + * 任务id + */ + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; + + /** + * 意见 + */ + private String message; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index d0f436925..ac1251e2c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -1,12 +1,16 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; /** @@ -23,8 +27,8 @@ public class BackProcessBo implements Serializable { /** * 任务ID */ - @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) - private String taskId; + @NotNull(message = "任务ID不能为空", groups = AddGroup.class) + private Long taskId; /** * 消息类型 @@ -35,10 +39,23 @@ public class BackProcessBo implements Serializable { * 驳回的节点id(目前未使用,直接驳回到申请人) */ @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) - private String targetActivityId; + private String targetNodeCode; /** * 办理意见 */ private String message; + + /** + * 流程变量 + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 062390551..7da247df1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -1,6 +1,7 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; import org.dromara.workflow.domain.vo.WfCopy; @@ -26,8 +27,8 @@ public class CompleteTaskBo implements Serializable { /** * 任务id */ - @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) - private String taskId; + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; /** * 附件id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java index a6846a6d6..f176034b6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java @@ -1,11 +1,12 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 委派任务请求对象 @@ -21,18 +22,17 @@ public class DelegateBo implements Serializable { /** * 委派人id */ - @NotBlank(message = "委派人id不能为空", groups = {AddGroup.class}) - private String userId; - - /** - * 委派人名称 - */ - @NotBlank(message = "委派人名称不能为空", groups = {AddGroup.class}) - private String nickName; + @NotNull(message = "委派人id不能为空", groups = {AddGroup.class}) + private List userIds; /** * 任务id */ - @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) - private String taskId; + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; + + /** + * 意见 + */ + private String message; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java new file mode 100644 index 000000000..8f677e60f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -0,0 +1,39 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.Future; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +public class FlowTaskBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String nodeName; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + private Long instanceId; + + private List permissionList; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java similarity index 90% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java index 2833b3ecb..e259e352e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java @@ -11,7 +11,7 @@ import java.io.Serializable; * @author may */ @Data -public class ProcessInstanceBo implements Serializable { +public class InstanceBo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java new file mode 100644 index 000000000..08b0b89d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 减签请求对象 + * + * @author may + */ +@Data +public class ReductionSignatureBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 减签人id + */ + @NotNull(message = "减签id不能为空", groups = {AddGroup.class}) + private List userIds; + + /** + * 任务id + */ + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; + + /** + * 意见 + */ + private String message; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java index 8f2206e82..429c86e59 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java @@ -1,6 +1,6 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; @@ -21,8 +21,8 @@ public class TerminationBo implements Serializable { /** * 任务id */ - @NotBlank(message = "任务id为空", groups = AddGroup.class) - private String taskId; + @NotNull(message = "任务id为空", groups = AddGroup.class) + private Long taskId; /** * 审批意见 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java similarity index 50% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java index 3eb6609fd..18a95f4e1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java @@ -1,11 +1,12 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 终转办务请求对象 @@ -13,25 +14,25 @@ import java.io.Serializable; * @author may */ @Data -public class TransmitBo implements Serializable { +public class TransferBo implements Serializable { @Serial private static final long serialVersionUID = 1L; - /** - * 任务id - */ - @NotBlank(message = "任务id为空", groups = AddGroup.class) - private String taskId; - /** * 转办人id */ - @NotBlank(message = "转办人不能为空", groups = AddGroup.class) - private String userId; + @NotNull(message = "转办人id不能为空", groups = {AddGroup.class}) + private List userIds; /** - * 审批意见 + * 任务id */ - private String comment; + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; + + /** + * 意见 + */ + private String message; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java index fac17709a..543638239 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java @@ -47,8 +47,8 @@ public class WfDefinitionConfigBo extends BaseEntity { /** * 流程版本 */ - @NotNull(message = "流程版本不能为空", groups = {AddGroup.class}) - private Integer version; + @NotBlank(message = "流程版本不能为空", groups = {AddGroup.class}) + private String version; /** * 备注 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java index e4c1142ac..7a3c5b64e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -3,7 +3,6 @@ package org.dromara.workflow.domain.vo; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; -import org.flowable.engine.task.Attachment; import java.io.Serial; import java.io.Serializable; @@ -85,9 +84,4 @@ public class ActHistoryInfoVo implements Serializable { * 审批信息 */ private String comment; - - /** - * 审批附件 - */ - private List attachmentList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java new file mode 100644 index 000000000..e4fc80e5f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -0,0 +1,6 @@ +package org.dromara.workflow.domain.vo; + +import com.warm.flow.orm.entity.FlowDefinition; + +public class FlowDefinitionVo extends FlowDefinition { +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java new file mode 100644 index 000000000..1802cd376 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -0,0 +1,24 @@ +package org.dromara.workflow.domain.vo; + +import com.warm.flow.orm.entity.FlowHisTask; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 历史任务视图 + * + * @author may + */ +@Data +public class FlowHisTaskVo extends FlowHisTask implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义编码 + */ + private String flowCode; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java new file mode 100644 index 000000000..278a5eb45 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -0,0 +1,29 @@ +package org.dromara.workflow.domain.vo; + +import com.warm.flow.orm.entity.FlowTask; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 任务视图 + * + * @author may + */ +@Data +public class FlowTaskVo extends FlowTask implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程状态 + */ + private String flowStatus; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java index 9c7b0d7db..d3cee928a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java @@ -53,7 +53,7 @@ public class WfDefinitionConfigVo implements Serializable { * 流程版本 */ @ExcelProperty(value = "流程版本") - private Integer version; + private String version; /** * 备注 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java deleted file mode 100644 index 39fd9d363..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.dromara.workflow.flowable; - -import org.flowable.bpmn.model.AssociationDirection; -import org.flowable.image.impl.DefaultProcessDiagramCanvas; - -import java.awt.*; -import java.awt.geom.Line2D; -import java.awt.geom.RoundRectangle2D; - -public class CustomDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { - //设置高亮线的颜色 这里我设置成绿色 - protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; - - public CustomDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - } - - /** - * 画线颜色设置 - */ - public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, - AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { - - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - - g.setPaint(CONNECTION_COLOR); - if (connectionType.equals("association")) { - g.setStroke(ASSOCIATION_STROKE); - } else if (highLighted) { - //设置线的颜色 - g.setPaint(HIGHLIGHT_SEQUENCEFLOW_COLOR); - g.setStroke(HIGHLIGHT_FLOW_STROKE); - } - - for (int i = 1; i < xPoints.length; i++) { - Integer sourceX = xPoints[i - 1]; - Integer sourceY = yPoints[i - 1]; - Integer targetX = xPoints[i]; - Integer targetY = yPoints[i]; - Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); - g.draw(line); - } - - if (isDefault) { - Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); - drawDefaultSequenceFlowIndicator(line, scaleFactor); - } - - if (conditional) { - Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); - drawConditionalSequenceFlowIndicator(line, scaleFactor); - } - - if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { - Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); - drawArrowHead(line, scaleFactor); - } - if (associationDirection == AssociationDirection.BOTH) { - Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); - drawArrowHead(line, scaleFactor); - } - g.setPaint(originalPaint); - g.setStroke(originalStroke); - } - - /** - * 高亮节点设置 - */ - public void drawHighLight(int x, int y, int width, int height) { - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - //设置高亮节点的颜色 - g.setPaint(HIGHLIGHT_COLOR); - g.setStroke(THICK_TASK_BORDER_STROKE); - - RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); - g.draw(rect); - - g.setPaint(originalPaint); - g.setStroke(originalStroke); - } - - /** - * @description: 高亮节点红色 - * @param: x - * @param: y - * @param: width - * @param: height - * @return: void - * @author: gssong - * @date: 2022/4/12 - */ - public void drawHighLightRed(int x, int y, int width, int height) { - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - //设置高亮节点的颜色 - g.setPaint(Color.green); - g.setStroke(THICK_TASK_BORDER_STROKE); - - RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); - g.draw(rect); - - g.setPaint(originalPaint); - g.setStroke(originalStroke); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java deleted file mode 100644 index e4793a26f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java +++ /dev/null @@ -1,1120 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.dromara.workflow.flowable; - -import org.flowable.bpmn.model.Event; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.*; -import org.flowable.image.ProcessDiagramGenerator; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.InputStream; -import java.util.List; -import java.util.*; - -/** - * Class to generate an image based the diagram interchange information in a BPMN 2.0 process. - * - * @author Joram Barrez - * @author Tijs Rademakers - * @author Zheng Ji - */ -public class CustomDefaultProcessDiagramGenerator implements ProcessDiagramGenerator { - - protected Map, ActivityDrawInstruction> activityDrawInstructions = new HashMap<>(); - protected Map, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap<>(); - - public CustomDefaultProcessDiagramGenerator() { - this(1.0); - } - - // The instructions on how to draw a certain construct is - // created statically and stored in a map for performance. - public CustomDefaultProcessDiagramGenerator(final double scaleFactor) { - // start event - activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - StartEvent startEvent = (StartEvent) flowNode; - if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { - EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); - if (eventDefinition instanceof TimerEventDefinition) { - processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof ErrorEventDefinition) { - processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof EscalationEventDefinition) { - processDiagramCanvas.drawEscalationStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof ConditionalEventDefinition) { - processDiagramCanvas.drawConditionalStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof SignalEventDefinition) { - processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof MessageEventDefinition) { - processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawNoneStartEvent(graphicInfo); - } - } else { - List eventTypeElements = startEvent.getExtensionElements().get("eventType"); - if (eventTypeElements != null && eventTypeElements.size() > 0) { - processDiagramCanvas.drawEventRegistryStartEvent(graphicInfo, scaleFactor); - - } else { - processDiagramCanvas.drawNoneStartEvent(graphicInfo); - } - } - } - }); - - // signal catch - activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode; - if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent.getEventDefinitions().isEmpty()) { - - if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { - processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { - processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { - processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof ConditionalEventDefinition) { - processDiagramCanvas.drawCatchingConditionalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } - } - } - }); - - // signal throw - activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - ThrowEvent throwEvent = (ThrowEvent) flowNode; - if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) { - if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { - processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor); - } else if (throwEvent.getEventDefinitions().get(0) instanceof EscalationEventDefinition) { - processDiagramCanvas.drawThrowingEscalationEvent(graphicInfo, scaleFactor); - } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { - processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); - } - } else { - processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); - } - } - }); - - // end event - activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - EndEvent endEvent = (EndEvent) flowNode; - if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) { - if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { - processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor); - } else if (endEvent.getEventDefinitions().get(0) instanceof EscalationEventDefinition) { - processDiagramCanvas.drawEscalationEndEvent(flowNode.getName(), graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); - } - } else { - processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); - } - } - }); - - // task - activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // user task - activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // script task - activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // service task - activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - ServiceTask serviceTask = (ServiceTask) flowNode; - if ("camel".equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor); - }else if (ServiceTask.HTTP_TASK.equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawHttpTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else if (ServiceTask.DMN_TASK.equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawDMNTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else if (ServiceTask.SHELL_TASK.equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawShellTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); - } - } - }); - - // http service task - activityDrawInstructions.put(HttpServiceTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawHttpTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // receive task - activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // send task - activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // manual task - activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // send event service task - activityDrawInstructions.put(SendEventServiceTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawSendEventServiceTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // external worker service task - activityDrawInstructions.put(ExternalWorkerServiceTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - ServiceTask serviceTask = (ServiceTask) flowNode; - processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); - } - }); - - // case service task - activityDrawInstructions.put(CaseServiceTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawCaseServiceTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // businessRuleTask task - activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // exclusive gateway - activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor); - } - }); - - // inclusive gateway - activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor); - } - }); - - // parallel gateway - activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor); - } - }); - - // event based gateway - activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor); - } - }); - - // Boundary timer - activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode; - if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) { - EventDefinition eventDefinition = boundaryEvent.getEventDefinitions().get(0); - if (eventDefinition instanceof TimerEventDefinition) { - processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof ConditionalEventDefinition) { - processDiagramCanvas.drawCatchingConditionalEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof ErrorEventDefinition) { - processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof EscalationEventDefinition) { - processDiagramCanvas.drawCatchingEscalationEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof SignalEventDefinition) { - processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof MessageEventDefinition) { - processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (eventDefinition instanceof CompensateEventDefinition) { - processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - } - - } else { - List eventTypeElements = boundaryEvent.getExtensionElements().get("eventType"); - if (eventTypeElements != null && eventTypeElements.size() > 0) { - processDiagramCanvas.drawCatchingEventRegistryEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - } - } - } - }); - - // subprocess - activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } else { - processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } - } - }); - - // transaction - activityDrawInstructions.put(Transaction.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } else { - processDiagramCanvas.drawExpandedTransaction(flowNode.getName(), graphicInfo, scaleFactor); - } - } - }); - - // Event subprocess - activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); - } else { - processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); - } - } - }); - - // Adhoc subprocess - activityDrawInstructions.put(AdhocSubProcess.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } else { - processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } - } - }); - - // call activity - activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // text annotation - artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); - TextAnnotation textAnnotation = (TextAnnotation) artifact; - processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo, scaleFactor); - } - }); - - // association - artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() { - - @Override - public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - Association association = (Association) artifact; - String sourceRef = association.getSourceRef(); - String targetRef = association.getTargetRef(); - - // source and target can be instance of FlowElement or Artifact - BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef); - BaseElement targetElement = bpmnModel.getFlowElement(targetRef); - if (sourceElement == null) { - sourceElement = bpmnModel.getArtifact(sourceRef); - } - if (targetElement == null) { - targetElement = bpmnModel.getArtifact(targetRef); - } - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); - graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); - int[] xPoints = new int[graphicInfoList.size()]; - int[] yPoints = new int[graphicInfoList.size()]; - for (int i = 1; i < graphicInfoList.size(); i++) { - GraphicInfo graphicInfo = graphicInfoList.get(i); - GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); - - if (i == 1) { - xPoints[0] = (int) previousGraphicInfo.getX(); - yPoints[0] = (int) previousGraphicInfo.getY(); - } - xPoints[i] = (int) graphicInfo.getX(); - yPoints[i] = (int) graphicInfo.getY(); - } - - AssociationDirection associationDirection = association.getAssociationDirection(); - processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false, scaleFactor); - } - }); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - - return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI).generateImage(imageType); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, - String labelFontName, String annotationFontName, ClassLoader customClassLoader, boolean drawSequenceFlowNameWithNoLabelDI) { - - return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), - activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, - String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - - return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generatePngDiagram(BpmnModel bpmnModel, boolean drawSequenceFlowNameWithNoLabelDI) { - return generatePngDiagram(bpmnModel, 1.0, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public InputStream generateJpgDiagram(BpmnModel bpmnModel) { - return generateJpgDiagram(bpmnModel, 1.0, false); - } - - @Override - public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList(), drawSequenceFlowNameWithNoLabelDI); - } - - public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - - return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI).generateBufferedImage(imageType); - } - - public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - - return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - - @Override - public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor) { - return generateImage(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor, false); - } - - protected CustomDefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { - - prepareBpmnModel(bpmnModel); - - CustomDefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - - // Draw pool shape, if process is participant in collaboration - for (Pool pool : bpmnModel.getPools()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); - processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo, scaleFactor); - } - - // Draw lanes - for (Process process : bpmnModel.getProcesses()) { - for (Lane lane : process.getLanes()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); - processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo, scaleFactor); - } - } - - // Draw activities and their sequence-flows - for (Process process : bpmnModel.getProcesses()) { - for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { - if (!isPartOfCollapsedSubProcess(flowNode, bpmnModel)) { - drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - } - } - - // Draw artifacts - for (Process process : bpmnModel.getProcesses()) { - - for (Artifact artifact : process.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, artifact); - } - - List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); - if (subProcesses != null) { - for (SubProcess subProcess : subProcesses) { - - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(subProcess.getId()); - if (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - continue; - } - - if (!isPartOfCollapsedSubProcess(subProcess, bpmnModel)) { - for (Artifact subProcessArtifact : subProcess.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); - } - } - } - } - } - - return processDiagramCanvas; - } - - protected void prepareBpmnModel(BpmnModel bpmnModel) { - - // Need to make sure all elements have positive x and y. - // Check all graphicInfo and update the elements accordingly - - List allGraphicInfos = new ArrayList<>(); - if (bpmnModel.getLocationMap() != null) { - allGraphicInfos.addAll(bpmnModel.getLocationMap().values()); - } - if (bpmnModel.getLabelLocationMap() != null) { - allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values()); - } - if (bpmnModel.getFlowLocationMap() != null) { - for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) { - allGraphicInfos.addAll(flowGraphicInfos); - } - } - - if (allGraphicInfos.size() > 0) { - - boolean needsTranslationX = false; - boolean needsTranslationY = false; - - double lowestX = 0.0; - double lowestY = 0.0; - - // Collect lowest x and y - for (GraphicInfo graphicInfo : allGraphicInfos) { - - double x = graphicInfo.getX(); - double y = graphicInfo.getY(); - - if (x < lowestX) { - needsTranslationX = true; - lowestX = x; - } - if (y < lowestY) { - needsTranslationY = true; - lowestY = y; - } - - } - - // Update all graphicInfo objects - if (needsTranslationX || needsTranslationY) { - - double translationX = Math.abs(lowestX); - double translationY = Math.abs(lowestY); - - for (GraphicInfo graphicInfo : allGraphicInfos) { - if (needsTranslationX) { - graphicInfo.setX(graphicInfo.getX() + translationX); - } - if (needsTranslationY) { - graphicInfo.setY(graphicInfo.getY() + translationY); - } - } - } - - } - - } - - protected void drawActivity(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, - FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { - - ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); - if (drawInstruction != null) { - - drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); - - // Gather info on the multi instance marker - boolean multiInstanceSequential = false; - boolean multiInstanceParallel = false; - boolean collapsed = false; - if (flowNode instanceof Activity) { - Activity activity = (Activity) flowNode; - MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); - if (multiInstanceLoopCharacteristics != null) { - multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); - multiInstanceParallel = !multiInstanceSequential; - } - } - - // Gather info on the collapsed marker - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (flowNode instanceof SubProcess) { - collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); - } else if (flowNode instanceof CallActivity) { - collapsed = true; - } - - if (scaleFactor == 1.0) { - // Actually draw the markers - processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), - multiInstanceSequential, multiInstanceParallel, collapsed); - } - - // Draw highlighted activities - if (highLightedActivities.contains(flowNode.getId())) { - drawHighLightRed(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } else if (highLightedActivities.contains(Color.RED.toString() + flowNode.getId())) { - drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } - - } else if (flowNode instanceof Task) { - activityDrawInstructions.get(Task.class).draw(processDiagramCanvas, bpmnModel, flowNode); - - if (highLightedActivities.contains(flowNode.getId())) { - drawHighLightRed(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } else if (highLightedActivities.contains(Color.RED.toString() + flowNode.getId())) { - drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } - } - - // Outgoing transitions of activity - for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { - boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); - String defaultFlow = null; - if (flowNode instanceof Activity) { - defaultFlow = ((Activity) flowNode).getDefaultFlow(); - } else if (flowNode instanceof Gateway) { - defaultFlow = ((Gateway) flowNode).getDefaultFlow(); - } - - boolean isDefault = false; - if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { - isDefault = true; - } - boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && sequenceFlow.getConditionExpression().trim().length() > 0 && !(flowNode instanceof Gateway); - - String sourceRef = sequenceFlow.getSourceRef(); - String targetRef = sequenceFlow.getTargetRef(); - FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); - FlowElement targetElement = bpmnModel.getFlowElement(targetRef); - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); - if (graphicInfoList != null && graphicInfoList.size() > 0) { - graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); - int[] xPoints = new int[graphicInfoList.size()]; - int[] yPoints = new int[graphicInfoList.size()]; - - for (int i = 1; i < graphicInfoList.size(); i++) { - GraphicInfo graphicInfo = graphicInfoList.get(i); - GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); - - if (i == 1) { - xPoints[0] = (int) previousGraphicInfo.getX(); - yPoints[0] = (int) previousGraphicInfo.getY(); - } - xPoints[i] = (int) graphicInfo.getX(); - yPoints[i] = (int) graphicInfo.getY(); - - } - - processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); - - // Draw sequenceflow label - GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); - if (labelGraphicInfo != null) { - processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); - } else { - if (drawSequenceFlowNameWithNoLabelDI) { - GraphicInfo lineCenter = getLineCenter(graphicInfoList); - processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); - } - - } - } - } - - // Nested elements - if (flowNode instanceof FlowElementsContainer) { - for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { - if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { - drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, - highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); - } - } - } - } - - /** - * This method makes coordinates of connection flow better. - * - * @param processDiagramCanvas - * @param bpmnModel - * @param sourceElement - * @param targetElement - * @param graphicInfoList - * @return - */ - protected static List connectionPerfectionizer(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) { - GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId()); - GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId()); - - CustomDefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement); - CustomDefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement); - - return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo, targetGraphicInfo, graphicInfoList); - } - - /** - * This method returns shape type of base element.
- * Each element can be presented as rectangle, rhombus, or ellipse. - * - * @param baseElement - * @return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE - */ - protected static CustomDefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) { - if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) { - return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle; - } else if (baseElement instanceof Gateway) { - return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus; - } else if (baseElement instanceof Event) { - return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse; - } else { - // unknown source element, just do not correct coordinates - } - return null; - } - - protected static GraphicInfo getLineCenter(List graphicInfoList) { - GraphicInfo gi = new GraphicInfo(); - - int[] xPoints = new int[graphicInfoList.size()]; - int[] yPoints = new int[graphicInfoList.size()]; - - double length = 0; - double[] lengths = new double[graphicInfoList.size()]; - lengths[0] = 0; - double m; - for (int i = 1; i < graphicInfoList.size(); i++) { - GraphicInfo graphicInfo = graphicInfoList.get(i); - GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); - - if (i == 1) { - xPoints[0] = (int) previousGraphicInfo.getX(); - yPoints[0] = (int) previousGraphicInfo.getY(); - } - xPoints[i] = (int) graphicInfo.getX(); - yPoints[i] = (int) graphicInfo.getY(); - - length += Math.sqrt( - Math.pow((int) graphicInfo.getX() - (int) previousGraphicInfo.getX(), 2) + - Math.pow((int) graphicInfo.getY() - (int) previousGraphicInfo.getY(), 2)); - lengths[i] = length; - } - m = length / 2; - int p1 = 0; - int p2 = 1; - for (int i = 1; i < lengths.length; i++) { - double len = lengths[i]; - p1 = i - 1; - p2 = i; - if (len > m) { - break; - } - } - - GraphicInfo graphicInfo1 = graphicInfoList.get(p1); - GraphicInfo graphicInfo2 = graphicInfoList.get(p2); - - double AB = (int) graphicInfo2.getX() - (int) graphicInfo1.getX(); - double OA = (int) graphicInfo2.getY() - (int) graphicInfo1.getY(); - double OB = lengths[p2] - lengths[p1]; - double ob = m - lengths[p1]; - double ab = AB * ob / OB; - double oa = OA * ob / OB; - - double mx = graphicInfo1.getX() + ab; - double my = graphicInfo1.getY() + oa; - - gi.setX(mx); - gi.setY(my); - return gi; - } - - protected void drawArtifact(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - - ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass()); - if (drawInstruction != null) { - drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact); - } - } - - private static void drawHighLight(CustomDefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { - processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); - - } - - private static void drawHighLightRed(CustomDefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { - processDiagramCanvas.drawHighLightRed((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); - - } - - protected static CustomDefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - - // We need to calculate maximum values to know how big the image will be in its entirety - double minX = Double.MAX_VALUE; - double maxX = 0; - double minY = Double.MAX_VALUE; - double maxY = 0; - - for (Pool pool : bpmnModel.getPools()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); - minX = graphicInfo.getX(); - maxX = graphicInfo.getX() + graphicInfo.getWidth(); - minY = graphicInfo.getY(); - maxY = graphicInfo.getY() + graphicInfo.getHeight(); - } - - List flowNodes = gatherAllFlowNodes(bpmnModel); - for (FlowNode flowNode : flowNodes) { - - GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - - // width - if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) { - maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth(); - } - if (flowNodeGraphicInfo.getX() < minX) { - minX = flowNodeGraphicInfo.getX(); - } - // height - if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) { - maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight(); - } - if (flowNodeGraphicInfo.getY() < minY) { - minY = flowNodeGraphicInfo.getY(); - } - - for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); - if (graphicInfoList != null) { - for (GraphicInfo graphicInfo : graphicInfoList) { - // width - if (graphicInfo.getX() > maxX) { - maxX = graphicInfo.getX(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() > maxY) { - maxY = graphicInfo.getY(); - } - if (graphicInfo.getY() < minY) { - minY = graphicInfo.getY(); - } - } - } - } - } - - List artifacts = gatherAllArtifacts(bpmnModel); - for (Artifact artifact : artifacts) { - - GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); - - if (artifactGraphicInfo != null) { - // width - if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) { - maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth(); - } - if (artifactGraphicInfo.getX() < minX) { - minX = artifactGraphicInfo.getX(); - } - // height - if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) { - maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight(); - } - if (artifactGraphicInfo.getY() < minY) { - minY = artifactGraphicInfo.getY(); - } - } - - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); - if (graphicInfoList != null) { - for (GraphicInfo graphicInfo : graphicInfoList) { - // width - if (graphicInfo.getX() > maxX) { - maxX = graphicInfo.getX(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() > maxY) { - maxY = graphicInfo.getY(); - } - if (graphicInfo.getY() < minY) { - minY = graphicInfo.getY(); - } - } - } - } - - int nrOfLanes = 0; - for (Process process : bpmnModel.getProcesses()) { - for (Lane l : process.getLanes()) { - - nrOfLanes++; - - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId()); - // // width - if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) { - maxX = graphicInfo.getX() + graphicInfo.getWidth(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) { - maxY = graphicInfo.getY() + graphicInfo.getHeight(); - } - if (graphicInfo.getY() < minY) { - minY = graphicInfo.getY(); - } - } - } - - // Special case, see https://activiti.atlassian.net/browse/ACT-1431 - if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) { - // Nothing to show - minX = 0; - minY = 0; - } - - return new CustomDefaultProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, - imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - } - - protected static List gatherAllArtifacts(BpmnModel bpmnModel) { - List artifacts = new ArrayList<>(); - for (Process process : bpmnModel.getProcesses()) { - artifacts.addAll(process.getArtifacts()); - } - return artifacts; - } - - protected static List gatherAllFlowNodes(BpmnModel bpmnModel) { - List flowNodes = new ArrayList<>(); - for (Process process : bpmnModel.getProcesses()) { - flowNodes.addAll(gatherAllFlowNodes(process)); - } - return flowNodes; - } - - protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) { - List flowNodes = new ArrayList<>(); - for (FlowElement flowElement : flowElementsContainer.getFlowElements()) { - if (flowElement instanceof FlowNode) { - flowNodes.add((FlowNode) flowElement); - } - if (flowElement instanceof FlowElementsContainer) { - flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement)); - } - } - return flowNodes; - } - - protected boolean isPartOfCollapsedSubProcess(FlowElement flowElement, BpmnModel model) { - SubProcess subProcess = flowElement.getSubProcess(); - if (subProcess != null) { - GraphicInfo graphicInfo = model.getGraphicInfo(subProcess.getId()); - if (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - return true; - } - - return isPartOfCollapsedSubProcess(subProcess, model); - } - - return false; - } - - public Map, ActivityDrawInstruction> getActivityDrawInstructions() { - return activityDrawInstructions; - } - - public void setActivityDrawInstructions( - Map, ActivityDrawInstruction> activityDrawInstructions) { - this.activityDrawInstructions = activityDrawInstructions; - } - - public Map, ArtifactDrawInstruction> getArtifactDrawInstructions() { - return artifactDrawInstructions; - } - - public void setArtifactDrawInstructions( - Map, ArtifactDrawInstruction> artifactDrawInstructions) { - this.artifactDrawInstructions = artifactDrawInstructions; - } - - protected interface ActivityDrawInstruction { - void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode); - } - - protected interface ArtifactDrawInstruction { - void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java deleted file mode 100644 index 3cdfcf415..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import cn.hutool.core.collection.CollUtil; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.dromara.workflow.common.constant.FlowConstant.NUMBER_OF_INSTANCES; - -/** - * 串行加签 - * - * @author may - */ -public class AddSequenceMultiInstanceCmd implements Command { - - /** - * 执行id - */ - private final String executionId; - - /** - * 会签人员集合KEY - */ - private final String assigneeList; - - /** - * 加签人员 - */ - private final List assignees; - - public AddSequenceMultiInstanceCmd(String executionId, String assigneeList, List assignees) { - this.executionId = executionId; - this.assigneeList = assigneeList; - this.assignees = assignees; - } - - @Override - public Void execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - ExecutionEntity entity = executionEntityManager.findById(executionId); - // 多实例任务总数加 assignees.size() - if (entity.getVariable(NUMBER_OF_INSTANCES) instanceof Integer nrOfInstances) { - entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); - } - // 设置流程变量 - if (entity.getVariable(assigneeList) instanceof List userIds) { - CollUtil.addAll(userIds, assignees); - Map variables = new HashMap<>(16); - variables.put(assigneeList, userIds); - entity.setVariables(variables); - } - return null; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java deleted file mode 100644 index 20a0a5f3a..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import cn.hutool.core.collection.CollUtil; -import org.dromara.common.core.domain.dto.OssDTO; -import org.dromara.common.core.service.OssService; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.AttachmentEntity; -import org.flowable.engine.impl.persistence.entity.AttachmentEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.util.Date; -import java.util.List; - -/** - * 附件上传 - * - * @author may - */ -public class AttachmentCmd implements Command { - - private final String fileId; - - private final String taskId; - - private final String processInstanceId; - - private final OssService ossService; - - public AttachmentCmd(String fileId, String taskId, String processInstanceId, OssService ossService) { - this.fileId = fileId; - this.taskId = taskId; - this.processInstanceId = processInstanceId; - this.ossService = ossService; - } - - @Override - public Boolean execute(CommandContext commandContext) { - try { - if (StringUtils.isNotBlank(fileId)) { - List ossList = ossService.selectByIds(fileId); - if (CollUtil.isNotEmpty(ossList)) { - for (OssDTO oss : ossList) { - AttachmentEntityManager attachmentEntityManager = CommandContextUtil.getAttachmentEntityManager(); - AttachmentEntity attachmentEntity = attachmentEntityManager.create(); - attachmentEntity.setRevision(1); - attachmentEntity.setUserId(LoginHelper.getUserId().toString()); - attachmentEntity.setName(oss.getOriginalName()); - attachmentEntity.setDescription(oss.getOriginalName()); - attachmentEntity.setType(oss.getFileSuffix()); - attachmentEntity.setTaskId(taskId); - attachmentEntity.setProcessInstanceId(processInstanceId); - attachmentEntity.setContentId(oss.getOssId().toString()); - attachmentEntity.setTime(new Date()); - attachmentEntityManager.insert(attachmentEntity); - } - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return true; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java deleted file mode 100644 index 215d31023..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.io.Serializable; - -/** - * 删除执行数据 - * - * @author may - */ -public class DeleteExecutionCmd implements Command, Serializable { - - /** - * 执行id - */ - private final String executionId; - - public DeleteExecutionCmd(String executionId) { - this.executionId = executionId; - } - - @Override - public Void execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - ExecutionEntity entity = executionEntityManager.findById(executionId); - if (entity != null) { - executionEntityManager.deleteExecutionAndRelatedData(entity, "", false, false); - } - return null; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java deleted file mode 100644 index a61daebc5..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import cn.hutool.core.util.ObjectUtil; -import lombok.AllArgsConstructor; -import org.dromara.common.core.utils.StreamUtils; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.dromara.workflow.common.constant.FlowConstant.LOOP_COUNTER; -import static org.dromara.workflow.common.constant.FlowConstant.NUMBER_OF_INSTANCES; - - -/** - * 串行减签 - * - * @author may - */ -@AllArgsConstructor -public class DeleteSequenceMultiInstanceCmd implements Command { - - /** - * 当前节点审批人员id - */ - private final String currentUserId; - - /** - * 执行id - */ - private final String executionId; - - /** - * 会签人员集合KEY - */ - private final String assigneeList; - - /** - * 减签人员 - */ - private final List assignees; - - - @Override - @SuppressWarnings("unchecked") - public Void execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - ExecutionEntity entity = executionEntityManager.findById(executionId); - // 设置流程变量 - List userIds = new ArrayList<>(); - List variable = (List) entity.getVariable(assigneeList); - for (Object o : variable) { - userIds.add(Long.valueOf(o.toString())); - } - List userIdList = new ArrayList<>(); - userIds.forEach(e -> { - Long userId = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e)); - if (userId == null) { - userIdList.add(e); - } - }); - // 当前任务执行位置 - int loopCounterIndex = -1; - for (int i = 0; i < userIdList.size(); i++) { - Long userId = userIdList.get(i); - if (currentUserId.equals(userId.toString())) { - loopCounterIndex = i; - } - } - Map variables = new HashMap<>(16); - variables.put(NUMBER_OF_INSTANCES, userIdList.size()); - variables.put(assigneeList, userIdList); - variables.put(LOOP_COUNTER, loopCounterIndex); - entity.setVariables(variables); - return null; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java deleted file mode 100644 index 1f3088bfc..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import org.dromara.common.core.utils.StreamUtils; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.io.Serializable; -import java.util.List; - -/** - * 获取并行网关执行后保留的执行实例数据 - * - * @author may - */ -public class ExecutionChildByExecutionIdCmd implements Command>, Serializable { - - /** - * 当前任务执行实例id - */ - private final String executionId; - - public ExecutionChildByExecutionIdCmd(String executionId) { - this.executionId = executionId; - } - - @Override - public List execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - // 获取当前执行数据 - ExecutionEntity executionEntity = executionEntityManager.findById(executionId); - // 通过当前执行数据的父执行,查询所有子执行数据 - List allChildrenExecution = - executionEntityManager.collectChildren(executionEntity.getParent()); - return StreamUtils.filter(allChildrenExecution, e -> !e.isActive()); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java deleted file mode 100644 index 3ba120aef..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import org.dromara.common.core.exception.ServiceException; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntity; -import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -/** - * 修改流程状态 - * - * @author may - */ -public class UpdateBusinessStatusCmd implements Command { - - private final String processInstanceId; - private final String status; - - public UpdateBusinessStatusCmd(String processInstanceId, String status) { - this.processInstanceId = processInstanceId; - this.status = status; - } - - @Override - public Boolean execute(CommandContext commandContext) { - try { - HistoricProcessInstanceEntityManager manager = CommandContextUtil.getHistoricProcessInstanceEntityManager(); - HistoricProcessInstanceEntity processInstance = manager.findById(processInstanceId); - processInstance.setBusinessStatus(status); - manager.update(processInstance); - return true; - } catch (Exception e) { - throw new ServiceException(e.getMessage()); - } - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java deleted file mode 100644 index 42f6d1c78..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.workflow.flowable.cmd; - -import org.dromara.common.core.exception.ServiceException; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.task.service.HistoricTaskService; -import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity; - -import java.util.Date; -import java.util.List; - - -/** - * 修改流程历史 - * - * @author may - */ -public class UpdateHiTaskInstCmd implements Command { - - private final List taskIds; - - private final String processDefinitionId; - - private final String processInstanceId; - - public UpdateHiTaskInstCmd(List taskIds, String processDefinitionId, String processInstanceId) { - this.taskIds = taskIds; - this.processDefinitionId = processDefinitionId; - this.processInstanceId = processInstanceId; - } - - @Override - public Boolean execute(CommandContext commandContext) { - try { - HistoricTaskService historicTaskService = CommandContextUtil.getHistoricTaskService(); - for (String taskId : taskIds) { - HistoricTaskInstanceEntity historicTask = historicTaskService.getHistoricTask(taskId); - if (historicTask != null) { - historicTask.setProcessDefinitionId(processDefinitionId); - historicTask.setProcessInstanceId(processInstanceId); - historicTask.setCreateTime(new Date()); - CommandContextUtil.getHistoricTaskService().updateHistoricTask(historicTask, true); - } - } - return true; - } catch (Exception e) { - throw new ServiceException(e.getMessage()); - } - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java deleted file mode 100644 index 1494bf37f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dromara.workflow.flowable.config; - -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; -import org.flowable.spring.SpringProcessEngineConfiguration; -import org.flowable.spring.boot.EngineConfigurationConfigurer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; - -import java.util.Collections; - - -/** - * flowable配置 - * - * @author may - */ -@Configuration -public class FlowableConfig implements EngineConfigurationConfigurer { - - @Autowired - private GlobalFlowableListener globalFlowableListener; - @Autowired - private IdentifierGenerator identifierGenerator; - - @Override - public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { - processEngineConfiguration.setIdGenerator(() -> identifierGenerator.nextId(null).toString()); - processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); - processEngineConfiguration.addCustomJobHandler(new TaskTimeoutJobHandler()); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java deleted file mode 100644 index 9bb971a8c..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.dromara.workflow.flowable.config; - -import cn.hutool.core.collection.CollUtil; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.model.BoundaryEvent; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.common.engine.api.delegate.event.*; -import org.flowable.common.engine.impl.cfg.TransactionState; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.runtime.Execution; -import org.flowable.engine.task.Comment; -import org.flowable.job.service.TimerJobService; -import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; -import org.flowable.task.api.Task; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; - - -/** - * 引擎调度监听 - * - * @author may - */ -@Component -public class GlobalFlowableListener implements FlowableEventListener { - - @Autowired - @Lazy - private TaskService taskService; - - @Autowired - @Lazy - private RuntimeService runtimeService; - - @Autowired - @Lazy - private RepositoryService repositoryService; - - @Value("${flowable.async-executor-activate}") - private boolean asyncExecutorActivate; - - @Override - public void onEvent(FlowableEvent flowableEvent) { - if (flowableEvent instanceof FlowableEngineEvent flowableEngineEvent) { - FlowableEngineEventType engineEventType = (FlowableEngineEventType) flowableEvent.getType(); - switch (engineEventType) { - case JOB_EXECUTION_SUCCESS -> jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent); - case TASK_DUEDATE_CHANGED, TASK_CREATED -> { - FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) flowableEngineEvent; - Object entityObject = flowableEntityEvent.getEntity(); - TaskEntity task = (TaskEntity) entityObject; - if (asyncExecutorActivate && task.getDueDate() != null && task.getDueDate().after(new Date())) { - //删除之前已经存在的定时任务 - TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); - List timerJobEntityList = timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId()); - if (!CollUtil.isEmpty(timerJobEntityList)) { - for (TimerJobEntity timerJobEntity : timerJobEntityList) { - String taskId = timerJobEntity.getJobHandlerConfiguration(); - if (task.getId().equals(taskId)) { - timerJobService.deleteTimerJob(timerJobEntity); - } - } - } - //创建job对象 - TimerJobEntity timer = timerJobService.createTimerJob(); - timer.setTenantId(TenantHelper.getTenantId()); - //设置job类型 - timer.setJobType(JobEntity.JOB_TYPE_TIMER); - timer.setJobHandlerType(TaskTimeoutJobHandler.TYPE); - timer.setDuedate(task.getDueDate()); - timer.setProcessInstanceId(task.getProcessInstanceId()); - //设置任务id - timer.setJobHandlerConfiguration(task.getId()); - //保存并触发事件 - timerJobService.scheduleTimerJob(timer); - } - } - } - } - } - - @Override - public boolean isFailOnException() { - return true; - } - - @Override - public boolean isFireOnTransactionLifecycleEvent() { - return false; - } - - @Override - public String getOnTransaction() { - return TransactionState.COMMITTED.name(); - } - - /** - * 处理边界定时事件自动审批记录 - * - * @param event 事件 - */ - protected void jobExecutionSuccess(FlowableEngineEntityEvent event) { - if (event != null && StringUtils.isNotBlank(event.getExecutionId())) { - Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult(); - if (execution != null) { - BpmnModel bpmnModel = repositoryService.getBpmnModel(event.getProcessDefinitionId()); - FlowElement flowElement = bpmnModel.getFlowElement(execution.getActivityId()); - if (flowElement instanceof BoundaryEvent) { - String attachedToRefId = ((BoundaryEvent) flowElement).getAttachedToRefId(); - List list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list(); - for (Execution ex : list) { - Task task = QueryUtils.taskQuery().executionId(ex.getId()).singleResult(); - if (task != null) { - List taskComments = taskService.getTaskComments(task.getId()); - if (CollUtil.isEmpty(taskComments)) { - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "超时自动审批!"); - } - } - } - } - } - } - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java deleted file mode 100644 index 69ae70a07..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.dromara.workflow.flowable.handler; - -import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.domain.event.ProcessTaskEvent; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.stereotype.Component; - -/** - * 流程监听服务 - * - * @author may - * @date 2024-06-02 - */ -@Component -public class FlowProcessEventHandler { - - /** - * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) - * - * @param key 流程key - * @param businessKey 业务id - * @param status 状态 - * @param submit 当为true时为申请人节点办理 - */ - public void processHandler(String key, String businessKey, String status, boolean submit) { - ProcessEvent processEvent = new ProcessEvent(); - processEvent.setKey(key); - processEvent.setBusinessKey(businessKey); - processEvent.setStatus(status); - processEvent.setSubmit(submit); - SpringUtils.context().publishEvent(processEvent); - } - - /** - * 执行办理任务监听 - * - * @param key 流程key - * @param taskDefinitionKey 审批节点key - * @param taskId 任务id - * @param businessKey 业务id - */ - public void processTaskHandler(String key, String taskDefinitionKey, String taskId, String businessKey) { - ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); - processTaskEvent.setKey(key); - processTaskEvent.setTaskDefinitionKey(taskDefinitionKey); - processTaskEvent.setTaskId(taskId); - processTaskEvent.setBusinessKey(businessKey); - SpringUtils.context().publishEvent(processTaskEvent); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java deleted file mode 100644 index 61c938864..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.dromara.workflow.flowable.handler; - -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.TaskService; -import org.flowable.engine.impl.jobexecutor.TimerEventHandler; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.job.service.JobHandler; -import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.task.api.Task; -import org.flowable.variable.api.delegate.VariableScope; - -/** - * 办理超时(过期)任务 - * - * @author may - */ -public class TaskTimeoutJobHandler extends TimerEventHandler implements JobHandler { - - public static final String TYPE = "taskTimeout"; - - @Override - public String getType() { - return TYPE; - } - - @Override - public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) { - TaskService taskService = CommandContextUtil.getProcessEngineConfiguration(commandContext) - .getTaskService(); - Task task = taskService.createTaskQuery().taskId(configuration).singleResult(); - if (task != null) { - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TIMEOUT.getStatus(), "超时自动审批!"); - taskService.complete(configuration); - } - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java deleted file mode 100644 index a3a41c924..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.ActHiProcinst; - -/** - * 流程实例Mapper接口 - * - * @author may - * @date 2023-07-22 - */ -@InterceptorIgnore(tenantLine = "true") -public interface ActHiProcinstMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java deleted file mode 100644 index 63b394b6f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.workflow.domain.ActHiTaskinst; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 流程历史任务Mapper接口 - * - * @author may - * @date 2024-03-02 - */ -@InterceptorIgnore(tenantLine = "true") -public interface ActHiTaskinstMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java deleted file mode 100644 index 63c5ecb7b..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.vo.TaskVo; - - -/** - * 任务信息Mapper接口 - * - * @author may - * @date 2024-03-02 - */ -@InterceptorIgnore(tenantLine = "true") -public interface ActTaskMapper extends BaseMapperPlus { - /** - * 获取待办信息 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 获取已办 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getTaskFinishByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 查询当前用户的抄送 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java new file mode 100644 index 000000000..c39c90914 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -0,0 +1,51 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.workflow.domain.bo.FlowTaskBo; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; + + +/** + * 任务信息Mapper接口 + * + * @author may + * @date 2024-03-02 + */ +public interface FlwTaskMapper { + /** + * 获取待办信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + Page getTaskWaitByPage(@Param("page") Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 获取已办 + * + * @param page 分页 + * @param queryWrapper 条件 + * @param flowTaskBo 条件 + * @return 结果 + */ + Page getTaskFinishByPage(@Param("page") Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper, + @Param("flowTaskBo") FlowTaskBo flowTaskBo); + + /** + * 查询当前用户的抄送 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + Page getTaskCopyByPage(@Param("page") Page page, + @Param(Constants.WRAPPER) QueryWrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java deleted file mode 100644 index 9b291feb4..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfTaskBackNode; - -/** - * 节点驳回记录Mapper接口 - * - * @author may - * @date 2024-03-13 - */ -public interface WfTaskBackNodeMapper extends BaseMapperPlus { -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java deleted file mode 100644 index e802c6972..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.dromara.workflow.service; - - -import org.dromara.workflow.domain.ActHiProcinst; - -import java.util.List; - -/** - * 流程实例Service接口 - * - * @author may - * @date 2023-07-22 - */ -public interface IActHiProcinstService { - - /** - * 按照业务id查询 - * - * @param businessKeys 业务id - * @return 结果 - */ - List selectByBusinessKeyIn(List businessKeys); - - /** - * 按照业务id查询 - * - * @param businessKey 业务id - * @return 结果 - */ - ActHiProcinst selectByBusinessKey(String businessKey); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java deleted file mode 100644 index ad286e242..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.dromara.workflow.service; - - -/** - * 流程历史任务Service接口 - * - * @author may - * @date 2024-03-02 - */ -public interface IActHiTaskinstService { -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java deleted file mode 100644 index 4a6d17062..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.dromara.workflow.service; - -import jakarta.servlet.http.HttpServletResponse; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.vo.ModelVo; -import org.flowable.engine.repository.Model; - -import java.util.List; - - -/** - * 模型管理 服务层 - * - * @author may - */ -public interface IActModelService { - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - * @param pageQuery 参数 - * @return 返回分页列表 - */ - TableDataInfo page(ModelBo modelBo, PageQuery pageQuery); - - /** - * 新增模型 - * - * @param modelBo 模型请求对象 - * @return 结果 - */ - boolean saveNewModel(ModelBo modelBo); - - /** - * 查询模型 - * - * @param modelId 模型id - * @return 模型数据 - */ - ModelVo getInfo(String modelId); - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean update(ModelBo modelBo); - - /** - * 编辑模型XML - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean editModelXml(ModelBo modelBo); - - /** - * 模型部署 - * - * @param id 模型id - * @return 结果 - */ - boolean modelDeploy(String id); - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 响应 - */ - void exportZip(List modelIds, HttpServletResponse response); - - /** - * 复制模型 - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean copyModel(ModelBo modelBo); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java deleted file mode 100644 index 5d00e4199..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.ProcessDefinitionBo; -import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -/** - * 流程定义 服务层 - * - * @author may - */ -public interface IActProcessDefinitionService { - /** - * 分页查询 - * - * @param processDefinitionBo 参数 - * @param pageQuery 分页 - * @return 返回分页列表 - */ - TableDataInfo page(ProcessDefinitionBo processDefinitionBo, PageQuery pageQuery); - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - * @return 结果 - */ - List getListByKey(String key); - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - String definitionImage(String processDefinitionId); - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - String definitionXml(String processDefinitionId); - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - * @return 结果 - */ - boolean deleteDeployment(List deploymentIds, List processDefinitionIds); - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - boolean updateDefinitionState(String processDefinitionId); - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - * @return 结果 - */ - boolean migrationDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId); - - /** - * 流程定义转换为模型 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - boolean convertToModel(String processDefinitionId); - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - void deployByFile(MultipartFile file, String categoryCode); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java deleted file mode 100644 index ca3b6fb8e..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.ProcessInstanceBo; -import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.bo.TaskUrgingBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; -import org.dromara.workflow.domain.vo.ProcessInstanceVo; - -import java.util.List; -import java.util.Map; - -/** - * 流程实例 服务层 - * - * @author may - */ -public interface IActProcessInstanceService { - /** - * 通过流程实例id获取历史流程图 - * - * @param businessKey 流程实例id - * @return 结果 - */ - String getHistoryImage(String businessKey); - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - * @return 结果 - */ - Map getHistoryList(String businessKey); - - /** - * 分页查询正在运行的流程实例 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByRunning(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 分页查询已结束的流程实例 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByFinish(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 获取审批记录 - * - * @param businessKey 业务id - * @return 结果 - */ - List getHistoryRecord(String businessKey); - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - * @return 结果 - */ - boolean deleteRunInstance(ProcessInvalidBo processInvalidBo); - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - boolean deleteRunAndHisInstance(List businessKeys); - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - boolean deleteFinishAndHisInstance(List businessKeys); - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - * @return 结果 - */ - boolean cancelProcessApply(String businessKey); - - /** - * 分页查询当前登录人单据 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByCurrent(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - * @return 结果 - */ - boolean taskUrging(TaskUrgingBo taskUrgingBo); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java deleted file mode 100644 index 8e9f76367..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ /dev/null @@ -1,161 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.domain.vo.VariableVo; - -import java.util.List; -import java.util.Map; - -/** - * 任务 服务层 - * - * @author may - */ -public interface IActTaskService { - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - * @return 结果 - */ - Map startWorkFlow(StartProcessBo startProcessBo); - - - /** - * 办理任务 - * - * @param completeTaskBo 办理任务参数 - * @return 结果 - */ - boolean completeTask(CompleteTaskBo completeTaskBo); - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery); - - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery); - - /** - * 委派任务 - * - * @param delegateBo 参数 - * @return 结果 - */ - boolean delegateTask(DelegateBo delegateBo); - - /** - * 终止任务 - * - * @param terminationBo 参数 - * @return 结果 - */ - boolean terminationTask(TerminationBo terminationBo); - - /** - * 转办任务 - * - * @param transmitBo 参数 - * @return 结果 - */ - boolean transferTask(TransmitBo transmitBo); - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - * @return 结果 - */ - boolean addMultiInstanceExecution(AddMultiBo addMultiBo); - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - * @return 结果 - */ - boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo); - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - * @return 流程实例id - */ - String backProcess(BackProcessBo backProcessBo); - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @param userId 办理人id - * @return 结果 - */ - boolean updateAssignee(String[] taskIds, String userId); - - /** - * 查询流程变量 - * - * @param taskId 任务id - * @return 结果 - */ - List getInstanceVariable(String taskId); - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - * @return 结果 - */ - String getTaskUserIdsByAddMultiInstance(String taskId); - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id - * @return 结果 - */ - List getListByDeleteMultiInstance(String taskId); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java new file mode 100644 index 000000000..eebab213a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -0,0 +1,35 @@ +package org.dromara.workflow.service; + +import com.warm.flow.core.entity.Definition; +import com.warm.flow.orm.entity.FlowDefinition; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; + +import java.io.IOException; + +/** + * 流程定义 服务层 + * + * @author may + */ +public interface IFlwDefinitionService { + /** + * 分页查询 + * + * @param flowDefinition 参数 + * @param pageQuery 分页 + * @return 返回分页列表 + */ + TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery); + + /** + * 导出流程定义 + * + * @param id 流程定义id + * @param response 响应 + * @throws IOException 异常 + */ + void exportDefinition(Long id, HttpServletResponse response) throws IOException; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java new file mode 100644 index 000000000..b21bb15dc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -0,0 +1,66 @@ +package org.dromara.workflow.service; + +import com.warm.flow.core.entity.Instance; +import com.warm.flow.orm.entity.FlowInstance; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import java.util.List; + +/** + * 流程实例 服务层 + * + * @author may + */ +public interface IFlwInstanceService { + + /** + * 分页查询正在运行的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); + + /** + * 分页查询已结束的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); + + /** + * 按照业务id查询流程实例 + * + * @param businessId 业务id + * @return 结果 + */ + FlowInstance instanceByBusinessId(String businessId); + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + * @return 结果 + */ + boolean deleteByBusinessIds(List businessIds); + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + * @return 结果 + */ + boolean deleteByInstanceIds(List instanceIds); + + /** + * 撤销流程 + * + * @param businessId 业务id + * @return 结果 + */ + boolean cancelProcessApply(String businessId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java new file mode 100644 index 000000000..d6a2389c3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -0,0 +1,68 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; + +import java.util.Map; + +/** + * 任务 服务层 + * + * @author may + */ +public interface IFlwTaskService { + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + * @return 结果 + */ + Map startWorkFlow(StartProcessBo startProcessBo); + + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + * @return 结果 + */ + boolean completeTask(CompleteTaskBo completeTaskBo); + + /** + * 查询当前用户的待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + /** + * 查询当前租户所有待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + /** + * 查询当前用户的抄送 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + /** + * 驳回审批 + * + * @param bo 参数 + * @return 结果 + */ + boolean backProcess(BackProcessBo bo); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java deleted file mode 100644 index 97f940671..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.dromara.workflow.service; - - -import org.dromara.workflow.domain.WfTaskBackNode; -import org.flowable.task.api.Task; - -import java.util.List; - -/** - * 节点驳回记录Service接口 - * - * @author may - * @date 2024-03-13 - */ -public interface IWfTaskBackNodeService { - - /** - * 记录审批节点 - * - * @param task 任务 - */ - void recordExecuteNode(Task task); - - /** - * 按流程实例id查询 - * - * @param processInstanceId 流程实例id - * @return 结果 - */ - List getListByInstanceId(String processInstanceId); - - /** - * 按照流程实例id,节点id查询 - * - * @param processInstanceId 流程实例id - * @param nodeId 节点id - * @return 结果 - */ - WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId); - - /** - * 删除驳回后的节点 - * - * @param processInstanceId 流程实例id - * @param targetActivityId 节点id - * @return 结果 - */ - boolean deleteBackTaskNode(String processInstanceId, String targetActivityId); - - /** - * 按流程实例id删除 - * - * @param processInstanceId 流程实例id - * @return 结果 - */ - boolean deleteByInstanceId(String processInstanceId); - - /** - * 按流程实例id删除 - * - * @param processInstanceIds 流程实例id - * @return 结果 - */ - boolean deleteByInstanceIds(List processInstanceIds); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java deleted file mode 100644 index 06d607b4f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.workflow.service.impl; - - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.domain.ActHiProcinst; -import org.dromara.workflow.mapper.ActHiProcinstMapper; -import org.dromara.workflow.service.IActHiProcinstService; -import org.springframework.stereotype.Service; - -import java.util.List; - - -/** - * 流程实例Service业务层处理 - * - * @author may - * @date 2023-07-22 - */ -@RequiredArgsConstructor -@Service -public class ActHiProcinstServiceImpl implements IActHiProcinstService { - - private final ActHiProcinstMapper baseMapper; - - /** - * 按照业务id查询 - * - * @param businessKeys 业务id - */ - @Override - public List selectByBusinessKeyIn(List businessKeys) { - return baseMapper.selectList(new LambdaQueryWrapper() - .in(ActHiProcinst::getBusinessKey, businessKeys) - .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); - } - - /** - * 按照业务id查询 - * - * @param businessKey 业务id - */ - @Override - public ActHiProcinst selectByBusinessKey(String businessKey) { - return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(ActHiProcinst::getBusinessKey, businessKey) - .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); - - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java deleted file mode 100644 index 5548f22f5..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.workflow.service.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.dromara.workflow.service.IActHiTaskinstService; - - -/** - * 流程历史任务Service业务层处理 - * - * @author may - * @date 2024-03-02 - */ -@RequiredArgsConstructor -@Service -public class ActHiTaskinstServiceImpl implements IActHiTaskinstService { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java deleted file mode 100644 index d4f696b6c..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java +++ /dev/null @@ -1,429 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.ZipUtil; -import cn.hutool.json.JSONUtil; -import com.alibaba.excel.util.StringUtils; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.ModelVo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.service.IActModelService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.UserTask; -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.flowable.validation.ValidationError; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * 模型管理 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActModelServiceImpl implements IActModelService { - - private final RepositoryService repositoryService; - private final IWfNodeConfigService wfNodeConfigService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - * @return 返回分页列表 - */ - @Override - public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { - ModelQuery query = QueryUtils.modelQuery(); - if (StringUtils.isNotBlank(modelBo.getName())) { - query.modelNameLike("%" + modelBo.getName() + "%"); - } - if (StringUtils.isNotBlank(modelBo.getKey())) { - query.modelKey(modelBo.getKey()); - } - if (StringUtils.isNotBlank(modelBo.getCategoryCode())) { - query.modelCategory(modelBo.getCategoryCode()); - } - query.orderByLastUpdateTime().desc(); - // 创建时间降序排列 - query.orderByCreateTime().desc(); - // 分页查询 - List modelList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - // 总记录数 - long total = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(modelList); - build.setTotal(total); - return build; - } - - /** - * 新增模型 - * - * @param modelBo 模型请求对象 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveNewModel(ModelBo modelBo) { - try { - int version = 0; - String key = modelBo.getKey(); - String name = modelBo.getName(); - String description = modelBo.getDescription(); - String categoryCode = modelBo.getCategoryCode(); - String xml = modelBo.getXml(); - Model checkModel = QueryUtils.modelQuery().modelKey(key).singleResult(); - if (ObjectUtil.isNotNull(checkModel)) { - throw new ServiceException("模型key已存在!"); - } - //初始空的模型 - Model model = repositoryService.newModel(); - model.setKey(key); - model.setName(name); - model.setVersion(version); - model.setCategory(categoryCode); - model.setMetaInfo(description); - model.setTenantId(TenantHelper.getTenantId()); - //保存初始化的模型基本信息数据 - repositoryService.saveModel(model); - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 查询模型 - * - * @param id 模型id - * @return 模型数据 - */ - @Override - public ModelVo getInfo(String id) { - ModelVo modelVo = new ModelVo(); - Model model = repositoryService.getModel(id); - if (model != null) { - try { - byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); - modelVo.setXml(StrUtil.utf8Str(modelEditorSource)); - modelVo.setId(model.getId()); - modelVo.setKey(model.getKey()); - modelVo.setName(model.getName()); - modelVo.setCategoryCode(model.getCategory()); - modelVo.setDescription(model.getMetaInfo()); - return modelVo; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - return modelVo; - } - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - public boolean update(ModelBo modelBo) { - try { - Model model = repositoryService.getModel(modelBo.getId()); - List list = QueryUtils.modelQuery().modelKey(modelBo.getKey()).list(); - list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型KEY已存在!"); - }); - model.setCategory(modelBo.getCategoryCode()); - model.setMetaInfo(modelBo.getDescription()); - repositoryService.saveModel(model); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return true; - } - - /** - * 编辑模型XML - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean editModelXml(ModelBo modelBo) { - try { - String xml = modelBo.getXml(); - String svg = modelBo.getSvg(); - String modelId = modelBo.getId(); - String key = modelBo.getKey(); - String name = modelBo.getName(); - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); - ModelUtils.checkBpmnModel(bpmnModel); - Model model = repositoryService.getModel(modelId); - List list = QueryUtils.modelQuery().modelKey(key).list(); - list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型KEY已存在!"); - }); - // 校验key命名规范 - if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { - throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); - } - model.setKey(key); - model.setName(name); - model.setVersion(model.getVersion() + 1); - repositoryService.saveModel(model); - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); - // 转换图片 - InputStream svgStream = new ByteArrayInputStream(StrUtil.utf8Bytes(svg)); - TranscoderInput input = new TranscoderInput(svgStream); - - PNGTranscoder transcoder = new PNGTranscoder(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - TranscoderOutput output = new TranscoderOutput(outStream); - - transcoder.transcode(input, output); - final byte[] result = outStream.toByteArray(); - repositoryService.addModelEditorSourceExtra(model.getId(), result); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 模型部署 - * - * @param id 模型id - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean modelDeploy(String id) { - try { - // 查询流程定义模型xml - byte[] xmlBytes = repositoryService.getModelEditorSource(id); - if (ArrayUtil.isEmpty(xmlBytes)) { - throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!"); - } - if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8))) { - byte[] bytes = ModelUtils.bpmnJsonToXmlBytes(xmlBytes); - if (ArrayUtil.isEmpty(bytes)) { - throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); - } - } - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xmlBytes); - // 校验模型 - ModelUtils.checkBpmnModel(bpmnModel); - List validationErrors = repositoryService.validateProcess(bpmnModel); - if (CollUtil.isNotEmpty(validationErrors)) { - String errorMsg = validationErrors.stream().map(ValidationError::getProblem).distinct().collect(Collectors.joining(",")); - throw new ServiceException(errorMsg); - } - // 查询模型的基本信息 - Model model = repositoryService.getModel(id); - ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey(model.getKey()).latestVersion().singleResult(); - // xml资源的名称 ,对应act_ge_bytearray表中的name_字段 - String processName = model.getName() + ".bpmn20.xml"; - // 调用部署相关的api方法进行部署流程定义 - Deployment deployment = repositoryService.createDeployment() - // 部署名称 - .name(model.getName()) - // 部署标识key - .key(model.getKey()) - // 部署流程分类 - .category(model.getCategory()) - // bpmn20.xml资源 - .addBytes(processName, xmlBytes) - // 租户id - .tenantId(TenantHelper.getTenantId()) - .deploy(); - - // 更新 部署id 到流程定义模型数据表中 - model.setDeploymentId(deployment.getId()); - repositoryService.saveModel(model); - // 更新分类 - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); - //更新流程定义配置 - if (processDefinition != null) { - WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(processDefinition.getId()); - if (definitionVo != null) { - wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinition.getId())); - WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo(); - wfFormDefinition.setDefinitionId(definition.getId()); - wfFormDefinition.setProcessKey(definition.getKey()); - wfFormDefinition.setTableName(definitionVo.getTableName()); - wfFormDefinition.setVersion(definition.getVersion()); - wfFormDefinition.setRemark(definitionVo.getRemark()); - wfDefinitionConfigService.saveOrUpdate(wfFormDefinition); - } - } - //更新流程节点配置表单 - List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); - UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); - List wfNodeConfigList = new ArrayList<>(); - for (UserTask userTask : userTasks) { - if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { - WfNodeConfig wfNodeConfig = new WfNodeConfig(); - wfNodeConfig.setNodeId(userTask.getId()); - wfNodeConfig.setNodeName(userTask.getName()); - wfNodeConfig.setDefinitionId(definition.getId()); - String[] split = userTask.getFormKey().split(StrUtil.COLON); - wfNodeConfig.setFormType(split[0]); - wfNodeConfig.setFormId(Long.valueOf(split[1])); - wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); - wfNodeConfigList.add(wfNodeConfig); - } - } - if (CollUtil.isNotEmpty(wfNodeConfigList)) { - wfNodeConfigService.saveOrUpdate(wfNodeConfigList); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 相应 - */ - @Override - public void exportZip(List modelIds, HttpServletResponse response) { - try (ZipOutputStream zos = ZipUtil.getZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) { - // 压缩包文件名 - String zipName = "模型不存在"; - // 查询模型基本信息 - for (String modelId : modelIds) { - Model model = repositoryService.getModel(modelId); - byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); - if (ObjectUtil.isNotNull(model)) { - if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8)) && ArrayUtil.isEmpty(ModelUtils.bpmnJsonToXmlBytes(xmlBytes))) { - zipName = "模型不能为空,请至少设计一条主线流程!"; - zos.putNextEntry(new ZipEntry(zipName + ".txt")); - zos.write(zipName.getBytes(StandardCharsets.UTF_8)); - } else if (ArrayUtil.isEmpty(xmlBytes)) { - zipName = "模型数据为空,请先设计流程定义模型,再进行部署!"; - zos.putNextEntry(new ZipEntry(zipName + ".txt")); - zos.write(zipName.getBytes(StandardCharsets.UTF_8)); - } else { - String fileName = model.getName() + "-" + model.getKey(); - // 压缩包文件名 - zipName = fileName + ".zip"; - // 将xml添加到压缩包中(指定xml文件名:请假流程.bpmn20.xml - zos.putNextEntry(new ZipEntry(fileName + ".bpmn20.xml")); - zos.write(xmlBytes); - } - } - } - response.setHeader("Content-Disposition", - "attachment; filename=" + URLEncoder.encode(zipName, StandardCharsets.UTF_8) + ".zip"); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - // 刷出响应流 - response.flushBuffer(); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - } - - /** - * 复制模型 - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean copyModel(ModelBo modelBo) { - try { - String key = modelBo.getKey(); - if (StringUtils.isNotBlank(key)) { - // 查询模型 - Model model = repositoryService.createModelQuery().modelId(modelBo.getId()).singleResult(); - if (ObjectUtil.isNotNull(model)) { - byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); - List list = QueryUtils.modelQuery().modelKey(key).list(); - if (CollUtil.isNotEmpty(list)) { - throw new ServiceException("模型KEY已存在!"); - } - // 校验key命名规范 - if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { - throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); - } - // 复制模型数据 - Model newModel = repositoryService.newModel(); - newModel.setKey(modelBo.getKey()); - newModel.setName(modelBo.getName()); - newModel.setCategory(modelBo.getCategoryCode()); - newModel.setVersion(1); - newModel.setMetaInfo(modelBo.getDescription()); - newModel.setTenantId(TenantHelper.getTenantId()); - String xml = StrUtil.utf8Str(modelEditorSource); - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); - Process mainProcess = bpmnModel.getMainProcess(); - mainProcess.setId(modelBo.getKey()); - mainProcess.setName(modelBo.getName()); - byte[] xmlBytes = new BpmnXMLConverter().convertToXML(bpmnModel); - repositoryService.saveModel(newModel); - repositoryService.addModelEditorSource(newModel.getId(), xmlBytes); - } - } - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return true; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java deleted file mode 100644 index 2680db8ef..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ /dev/null @@ -1,440 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.bo.ProcessDefinitionBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.mapper.WfDefinitionConfigMapper; -import org.dromara.workflow.service.IActProcessDefinitionService; -import org.dromara.workflow.service.IWfCategoryService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.ProcessMigrationService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; -import org.flowable.engine.repository.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * 流程定义 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { - - private final RepositoryService repositoryService; - private final ProcessMigrationService processMigrationService; - private final IWfCategoryService wfCategoryService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - private final WfDefinitionConfigMapper wfDefinitionConfigMapper; - private final IWfNodeConfigService wfNodeConfigService; - - /** - * 分页查询 - * - * @param bo 参数 - * @return 返回分页列表 - */ - @Override - public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { - ProcessDefinitionQuery query = QueryUtils.definitionQuery(); - if (StringUtils.isNotEmpty(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotEmpty(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - if (StringUtils.isNotEmpty(bo.getName())) { - query.processDefinitionNameLike("%" + bo.getName() + "%"); - } - query.orderByDeploymentId().desc(); - // 分页查询 - List processDefinitionVoList = new ArrayList<>(); - List definitionList = query.latestVersion().listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List deploymentList = null; - if (CollUtil.isNotEmpty(definitionList)) { - List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); - deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); - } - if (CollUtil.isNotEmpty(definitionList)) { - List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); - List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); - for (ProcessDefinition processDefinition : definitionList) { - ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); - if (CollUtil.isNotEmpty(deploymentList)) { - // 部署时间 - deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { - processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); - }); - } - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); - } - processDefinitionVoList.add(processDefinitionVo); - } - } - // 总记录数 - long total = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(processDefinitionVoList); - build.setTotal(total); - return build; - } - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - */ - @Override - public List getListByKey(String key) { - List processDefinitionVoList = new ArrayList<>(); - ProcessDefinitionQuery query = QueryUtils.definitionQuery(); - List definitionList = query.processDefinitionKey(key).list(); - List deploymentList = null; - if (CollUtil.isNotEmpty(definitionList)) { - List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); - deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); - } - if (CollUtil.isNotEmpty(definitionList)) { - List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); - List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); - for (ProcessDefinition processDefinition : definitionList) { - ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); - if (CollUtil.isNotEmpty(deploymentList)) { - // 部署时间 - deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { - processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); - }); - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); - } - } - processDefinitionVoList.add(processDefinitionVo); - } - } - return CollUtil.reverse(processDefinitionVoList); - } - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - */ - @SneakyThrows - @Override - public String definitionImage(String processDefinitionId) { - InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId); - return Base64.encode(IoUtil.readBytes(inputStream)); - } - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - */ - @Override - public String definitionXml(String processDefinitionId) { - StringBuilder xml = new StringBuilder(); - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); - InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); - xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); - return xml.toString(); - } - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteDeployment(List deploymentIds, List processDefinitionIds) { - try { - List historicProcessInstances = QueryUtils.hisInstanceQuery().deploymentIdIn(deploymentIds).list(); - if (CollUtil.isNotEmpty(historicProcessInstances)) { - Set defIds = StreamUtils.toSet(historicProcessInstances, HistoricProcessInstance::getProcessDefinitionId); - List processDefinitions = QueryUtils.definitionQuery().processDefinitionIds(defIds).list(); - if (CollUtil.isNotEmpty(processDefinitions)) { - Set keys = StreamUtils.toSet(processDefinitions, ProcessDefinition::getKey); - throw new ServiceException("当前【" + String.join(",", keys) + "】流程定义已被使用不可删除!"); - } - } - //删除流程定义 - for (String deploymentId : deploymentIds) { - repositoryService.deleteDeployment(deploymentId); - } - //删除流程定义配置 - wfDefinitionConfigService.deleteByDefIds(processDefinitionIds); - //删除节点配置 - wfNodeConfigService.deleteByDefIds(processDefinitionIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - */ - @Override - public boolean updateDefinitionState(String processDefinitionId) { - try { - ProcessDefinition processDefinition = QueryUtils.definitionQuery() - .processDefinitionId(processDefinitionId).singleResult(); - //将当前为挂起状态更新为激活状态 - //参数说明:参数1:流程定义id,参数2:是否激活(true是否级联对应流程实例,激活了则对应流程实例都可以审批), - //参数3:什么时候激活,如果为null则立即激活,如果为具体时间则到达此时间后激活 - if (processDefinition.isSuspended()) { - repositoryService.activateProcessDefinitionById(processDefinitionId, true, null); - } else { - repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException("操作失败:" + e.getMessage()); - } - } - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - */ - - @Override - public boolean migrationDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId) { - try { - // 迁移验证 - boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder() - .migrateToProcessDefinition(currentProcessDefinitionId) - .validateMigrationOfProcessInstances(fromProcessDefinitionId) - .isMigrationValid(); - if (!migrationValid) { - throw new ServiceException("流程定义差异过大无法迁移,请修改流程图"); - } - // 已结束的流程实例不会迁移 - processMigrationService.createProcessInstanceMigrationBuilder() - .migrateToProcessDefinition(currentProcessDefinitionId) - .migrateProcessInstances(fromProcessDefinitionId); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 流程定义转换为模型 - * - * @param processDefinitionId 流程定义id - */ - @Override - public boolean convertToModel(String processDefinitionId) { - ProcessDefinition pd = QueryUtils.definitionQuery() - .processDefinitionId(processDefinitionId).singleResult(); - InputStream inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getResourceName()); - ModelQuery query = QueryUtils.modelQuery(); - Model model = query.modelKey(pd.getKey()).singleResult(); - try { - if (ObjectUtil.isNotNull(model)) { - repositoryService.addModelEditorSource(model.getId(), IoUtil.readBytes(inputStream)); - } else { - Model modelData = repositoryService.newModel(); - modelData.setKey(pd.getKey()); - modelData.setName(pd.getName()); - modelData.setTenantId(pd.getTenantId()); - repositoryService.saveModel(modelData); - repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - @SneakyThrows - @Override - @Transactional(rollbackFor = Exception.class) - public void deployByFile(MultipartFile file, String categoryCode) { - - WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); - if (wfCategory == null) { - throw new ServiceException("流程分类不存在"); - } - // 文件后缀名 - String suffix = FileUtil.extName(file.getOriginalFilename()); - InputStream inputStream = file.getInputStream(); - if (FlowConstant.ZIP.equalsIgnoreCase(suffix)) { - ZipInputStream zipInputStream = null; - try { - zipInputStream = new ZipInputStream(inputStream); - ZipEntry zipEntry; - while ((zipEntry = zipInputStream.getNextEntry()) != null) { - String filename = zipEntry.getName(); - String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); - //流程名称 - String processName = splitFilename[0]; - //流程key - String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); - DeploymentBuilder builder = repositoryService.createDeployment(); - Deployment deployment = builder.addInputStream(filename, zipInputStream) - .tenantId(TenantHelper.getTenantId()) - .name(processName).key(processKey).category(categoryCode).deploy(); - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setWfConfig(oldProcessDefinition, definition); - zipInputStream.closeEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - if (zipInputStream != null) { - zipInputStream.close(); - } - } - //初始化配置数据(demo使用,不用可删除) - initWfDefConfig(); - } else { - String originalFilename = file.getOriginalFilename(); - if (StringUtils.containsAny(originalFilename, ResourceNameUtil.BPMN_RESOURCE_SUFFIXES)) { - // 文件名 = 流程名称-流程key - String[] splitFilename = originalFilename.substring(0, originalFilename.lastIndexOf(".")).split("-"); - if (splitFilename.length < 2) { - throw new ServiceException("文件名 = 流程名称-流程KEY"); - } - //流程名称 - String processName = splitFilename[0]; - //流程key - String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); - DeploymentBuilder builder = repositoryService.createDeployment(); - Deployment deployment = builder.addInputStream(originalFilename, inputStream) - .tenantId(TenantHelper.getTenantId()) - .name(processName).key(processKey).category(categoryCode).deploy(); - // 更新分类 - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setWfConfig(oldProcessDefinition, definition); - } else { - throw new ServiceException("文件类型上传错误!"); - } - } - - } - - /** - * 初始化配置数据(demo使用,不用可删除) - */ - private void initWfDefConfig() { - List wfDefinitionConfigs = wfDefinitionConfigMapper.selectList(); - if (CollUtil.isEmpty(wfDefinitionConfigs)) { - ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey("leave1").latestVersion().singleResult(); - if (processDefinition != null) { - WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); - wfDefinitionConfigBo.setDefinitionId(processDefinition.getId()); - wfDefinitionConfigBo.setProcessKey(processDefinition.getKey()); - wfDefinitionConfigBo.setTableName("test_leave"); - wfDefinitionConfigBo.setVersion(processDefinition.getVersion()); - wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); - } - } - - } - - /** - * 设置表单内容 - * - * @param oldProcessDefinition 部署前最新流程定义 - * @param definition 部署后最新流程定义 - */ - private void setWfConfig(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) { - //更新流程定义表单 - if (oldProcessDefinition != null) { - WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(oldProcessDefinition.getId()); - if (definitionVo != null) { - wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(oldProcessDefinition.getId())); - WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); - wfDefinitionConfigBo.setDefinitionId(definition.getId()); - wfDefinitionConfigBo.setProcessKey(definition.getKey()); - wfDefinitionConfigBo.setTableName(definitionVo.getTableName()); - wfDefinitionConfigBo.setVersion(definition.getVersion()); - wfDefinitionConfigBo.setRemark(definitionVo.getRemark()); - wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); - } - } - //更新流程节点配置表单 - List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); - UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); - List wfNodeConfigList = new ArrayList<>(); - for (UserTask userTask : userTasks) { - if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { - WfNodeConfig wfNodeConfig = new WfNodeConfig(); - wfNodeConfig.setNodeId(userTask.getId()); - wfNodeConfig.setNodeName(userTask.getName()); - wfNodeConfig.setDefinitionId(definition.getId()); - String[] split = userTask.getFormKey().split(StrUtil.COLON); - wfNodeConfig.setFormType(split[0]); - wfNodeConfig.setFormId(Long.valueOf(split[1])); - wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); - wfNodeConfigList.add(wfNodeConfig); - } - } - if (CollUtil.isNotEmpty(wfNodeConfigList)) { - wfNodeConfigService.saveOrUpdate(wfNodeConfigList); - } - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java deleted file mode 100644 index e22e80053..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ /dev/null @@ -1,685 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ObjectUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.UserService; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.ActHiProcinst; -import org.dromara.workflow.domain.bo.ProcessInstanceBo; -import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.bo.TaskUrgingBo; -import org.dromara.workflow.domain.vo.*; -import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; -import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; -import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; -import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; -import org.dromara.workflow.service.IActHiProcinstService; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.QueryUtils; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.engine.*; -import org.flowable.engine.history.HistoricActivityInstance; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.repository.ProcessDefinition; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.runtime.ProcessInstanceQuery; -import org.flowable.engine.task.Attachment; -import org.flowable.engine.task.Comment; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.awt.*; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.*; - -/** - * 流程实例 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { - - private final RepositoryService repositoryService; - private final RuntimeService runtimeService; - private final HistoryService historyService; - private final TaskService taskService; - private final IActHiProcinstService actHiProcinstService; - private final ManagementService managementService; - private final IWfTaskBackNodeService wfTaskBackNodeService; - private final IWfNodeConfigService wfNodeConfigService; - private final FlowProcessEventHandler flowProcessEventHandler; - private final UserService userService; - - @Value("${flowable.activity-font-name}") - private String activityFontName; - - @Value("${flowable.label-font-name}") - private String labelFontName; - - @Value("${flowable.annotation-font-name}") - private String annotationFontName; - - /** - * 分页查询正在运行的流程实例 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - ProcessInstanceQuery query = QueryUtils.instanceQuery(); - if (StringUtils.isNotBlank(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotBlank(bo.getStartUserId())) { - query.startedBy(bo.getStartUserId()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - query.orderByStartTime().desc(); - List processInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - for (ProcessInstance processInstance : processInstances) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); - processInstanceVo.setIsSuspended(processInstance.isSuspended()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 分页查询已结束的流程实例 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery() - .finished().orderByProcessInstanceEndTime().desc(); - if (StringUtils.isNotEmpty(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotEmpty(bo.getStartUserId())) { - query.startedBy(bo.getStartUserId()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - List historicProcessInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(historicProcessInstance.getBusinessStatus())); - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 通过业务id获取历史流程图 - * - * @param businessKey 业务id - */ - @SneakyThrows - @Override - public String getHistoryImage(String businessKey) { - String processDefinitionId; - // 获取当前的流程实例 - ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey).singleResult(); - // 如果流程已经结束,则得到结束节点 - if (Objects.isNull(processInstance)) { - HistoricProcessInstance pi = QueryUtils.hisInstanceQuery().processInstanceBusinessKey(businessKey).singleResult(); - processDefinitionId = pi.getProcessDefinitionId(); - } else { - // 根据流程实例ID获得当前处于活动状态的ActivityId合集 - ProcessInstance pi = QueryUtils.instanceQuery(processInstance.getProcessInstanceId()).singleResult(); - processDefinitionId = pi.getProcessDefinitionId(); - } - - // 获得活动的节点 - List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstance.getProcessInstanceId()).orderByHistoricActivityInstanceStartTime().asc().list(); - - List highLightedFlows = new ArrayList<>(); - List highLightedNodes = new ArrayList<>(); - //高亮 - for (HistoricActivityInstance tempActivity : highLightedFlowList) { - if (FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType())) { - //高亮线 - highLightedFlows.add(tempActivity.getActivityId()); - } else { - //高亮节点 - if (tempActivity.getEndTime() == null) { - highLightedNodes.add(Color.RED.toString() + tempActivity.getActivityId()); - } else { - highLightedNodes.add(tempActivity.getActivityId()); - } - } - } - List highLightedNodeList = new ArrayList<>(); - //运行中的节点 - List redNodeCollect = StreamUtils.filter(highLightedNodes, e -> e.contains(Color.RED.toString())); - //排除与运行中相同的节点 - for (String nodeId : highLightedNodes) { - if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) { - highLightedNodeList.add(nodeId); - } - } - highLightedNodeList.addAll(redNodeCollect); - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); - CustomDefaultProcessDiagramGenerator diagramGenerator = new CustomDefaultProcessDiagramGenerator(); - InputStream inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodeList, highLightedFlows, activityFontName, labelFontName, annotationFontName, null, 1.0, true); - return Base64.encode(IoUtil.readBytes(inputStream)); - } - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - */ - @Override - public Map getHistoryList(String businessKey) { - Map map = new HashMap<>(); - List> taskList = new ArrayList<>(); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - String processInstanceId = historicProcessInstance.getId(); - StringBuilder xml = new StringBuilder(); - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); - // 获取节点 - List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list(); - for (HistoricActivityInstance tempActivity : highLightedFlowList) { - Map task = new HashMap<>(); - switch (tempActivity.getActivityType()) { - case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY, - FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {} - default -> { - task.put("key", tempActivity.getActivityId()); - task.put("completed", tempActivity.getEndTime() != null); - task.put("activityType", tempActivity.getActivityType()); - taskList.add(task); - } - } - } - ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult(); - if (processInstance != null) { - taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT)); - } - //查询出运行中节点 - List> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed")); - if (CollUtil.isNotEmpty(runtimeNodeList)) { - Iterator> iterator = taskList.iterator(); - while (iterator.hasNext()) { - Map next = iterator.next(); - runtimeNodeList.stream().filter(t -> t.get("key").equals(next.get("key")) && (Boolean) next.get("completed")).findFirst().ifPresent(t -> iterator.remove()); - } - } - map.put("taskList", taskList); - List historyTaskList = getHistoryTaskList(processInstanceId, processDefinition.getVersion()); - map.put("historyList", historyTaskList); - InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); - xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); - map.put("xml", xml.toString()); - return map; - } - - /** - * 获取历史任务节点信息 - * - * @param processInstanceId 流程实例id - * @param version 版本 - */ - private List getHistoryTaskList(String processInstanceId, Integer version) { - //查询任务办理记录 - List list = QueryUtils.hisTaskInstanceQuery(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list(); - list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); - List actHistoryInfoVoList = new ArrayList<>(); - for (HistoricTaskInstance historicTaskInstance : list) { - ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); - BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); - actHistoryInfoVo.setStatus(actHistoryInfoVo.getEndTime() == null ? "待处理" : "已处理"); - if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { - actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); - } - actHistoryInfoVo.setVersion(version); - actHistoryInfoVoList.add(actHistoryInfoVo); - } - List historyInfoVoList = new ArrayList<>(); - Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); - for (Map.Entry> entry : groupByKey.entrySet()) { - ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo(); - if (entry.getValue().size() > 1) { - List historyInfoVos = StreamUtils.filter(entry.getValue(), e -> StringUtils.isNotBlank(e.getAssignee())); - if (CollUtil.isNotEmpty(historyInfoVos)) { - ActHistoryInfoVo infoVo = historyInfoVos.get(0); - BeanUtils.copyProperties(infoVo, historyInfoVo); - historyInfoVo.setStatus(infoVo.getEndTime() == null ? "待处理" : "已处理"); - historyInfoVo.setStartTime(infoVo.getStartTime()); - historyInfoVo.setEndTime(infoVo.getEndTime() == null ? null : infoVo.getEndTime()); - historyInfoVo.setRunDuration(infoVo.getEndTime() == null ? null : infoVo.getRunDuration()); - if (ObjectUtil.isEmpty(infoVo.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(infoVo.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - } - } else { - actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey())).findFirst() - .ifPresent(e -> { - BeanUtils.copyProperties(e, historyInfoVo); - historyInfoVo.setStatus(e.getEndTime() == null ? "待处理" : "已处理"); - historyInfoVo.setStartTime(e.getStartTime()); - historyInfoVo.setEndTime(e.getEndTime() == null ? null : e.getEndTime()); - historyInfoVo.setRunDuration(e.getEndTime() == null ? null : e.getRunDuration()); - if (ObjectUtil.isEmpty(e.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - }); - - } - historyInfoVoList.add(historyInfoVo); - - } - return historyInfoVoList; - } - - /** - * 获取审批记录 - * - * @param businessKey 业务id - */ - @Override - public List getHistoryRecord(String businessKey) { - // 查询任务办理记录 - List list = QueryUtils.hisTaskBusinessKeyQuery(businessKey).orderByHistoricTaskInstanceEndTime().desc().list(); - list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - String processInstanceId = historicProcessInstance.getId(); - List actHistoryInfoVoList = new ArrayList<>(); - List processInstanceComments = taskService.getProcessInstanceComments(processInstanceId); - //附件 - List attachmentList = taskService.getProcessInstanceAttachments(processInstanceId); - for (HistoricTaskInstance historicTaskInstance : list) { - ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); - BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); - if (actHistoryInfoVo.getEndTime() == null) { - actHistoryInfoVo.setStatus(TaskStatusEnum.WAITING.getStatus()); - actHistoryInfoVo.setStatusName(TaskStatusEnum.WAITING.getDesc()); - } - if (CollUtil.isNotEmpty(processInstanceComments)) { - processInstanceComments.stream().filter(e -> e.getTaskId().equals(historicTaskInstance.getId())).findFirst().ifPresent(e -> { - actHistoryInfoVo.setComment(e.getFullMessage()); - actHistoryInfoVo.setStatus(e.getType()); - actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); - }); - } - if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { - actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); - } - //附件 - if (CollUtil.isNotEmpty(attachmentList)) { - List attachments = StreamUtils.filter(attachmentList, e -> e.getTaskId().equals(historicTaskInstance.getId())); - if (CollUtil.isNotEmpty(attachments)) { - actHistoryInfoVo.setAttachmentList(attachments); - } - } - //设置人员id - if (ObjectUtil.isEmpty(historicTaskInstance.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(historicTaskInstance.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - actHistoryInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - actHistoryInfoVoList.add(actHistoryInfoVo); - } - // 审批记录 - Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); - for (Map.Entry> entry : groupByKey.entrySet()) { - ActHistoryInfoVo actHistoryInfoVo = BeanUtil.toBean(entry.getValue().get(0), ActHistoryInfoVo.class); - actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() != null).findFirst() - .ifPresent(e -> { - actHistoryInfoVo.setStatus("已处理"); - actHistoryInfoVo.setStartTime(e.getStartTime()); - }); - actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst() - .ifPresent(e -> { - actHistoryInfoVo.setStatus("待处理"); - actHistoryInfoVo.setStartTime(e.getStartTime()); - actHistoryInfoVo.setEndTime(null); - actHistoryInfoVo.setRunDuration(null); - }); - } - List recordList = new ArrayList<>(); - // 待办理 - recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null)); - // 已办理 - recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null)); - - return recordList; - } - - /** - * 任务完成时间处理 - * - * @param time 时间 - */ - private String getDuration(long time) { - - long day = time / (24 * 60 * 60 * 1000); - long hour = (time / (60 * 60 * 1000) - day * 24); - long minute = ((time / (60 * 1000)) - day * 24 * 60 - hour * 60); - long second = (time / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); - - if (day > 0) { - return day + "天" + hour + "小时" + minute + "分钟"; - } - if (hour > 0) { - return hour + "小时" + minute + "分钟"; - } - if (minute > 0) { - return minute + "分钟"; - } - if (second > 0) { - return second + "秒"; - } else { - return 0 + "秒"; - } - } - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) { - try { - List list = QueryUtils.taskQuery().processInstanceBusinessKey(processInvalidBo.getBusinessKey()).list(); - String processInstanceId = list.get(0).getProcessInstanceId(); - List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); - if (CollUtil.isNotEmpty(subTasks)) { - subTasks.forEach(e -> taskService.deleteTask(e.getId())); - } - String deleteReason = LoginHelper.getLoginUser().getNickname() + "作废了当前申请!"; - if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { - deleteReason = LoginHelper.getLoginUser().getNickname() + "作废理由:" + processInvalidBo.getDeleteReason(); - } - for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) { - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason); - } - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); - BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); - runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus()); - runtimeService.deleteProcessInstance(processInstanceId, deleteReason); - //流程作废监听 - flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), - historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteRunAndHisInstance(List businessKeys) { - try { - // 1.删除运行中流程实例 - List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); - if (CollUtil.isEmpty(actHiProcinsts)) { - log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); - return false; - } - List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); - List list = QueryUtils.taskQuery(processInstanceIds).list(); - List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); - if (CollUtil.isNotEmpty(subTasks)) { - subTasks.forEach(e -> taskService.deleteTask(e.getId())); - } - runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); - // 2.删除历史记录 - List historicProcessInstanceList = QueryUtils.hisInstanceQuery(new HashSet<>(processInstanceIds)).list(); - if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { - historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); - } - wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteFinishAndHisInstance(List businessKeys) { - try { - List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); - if (CollUtil.isEmpty(actHiProcinsts)) { - log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); - return false; - } - List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); - historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); - wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean cancelProcessApply(String businessKey) { - try { - ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey) - .startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); - if (ObjectUtil.isNull(processInstance)) { - throw new ServiceException("您不是流程发起人,撤销失败!"); - } - if (processInstance.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - String processInstanceId = processInstance.getId(); - BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus()); - List taskList = QueryUtils.taskQuery(processInstanceId).list(); - for (Task task : taskList) { - taskService.setAssignee(task.getId(), null); - taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请"); - } - HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); - List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(processInstanceId) - .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); - Task task = QueryUtils.taskQuery(processInstanceId).list().get(0); - taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); - //获取并行网关执行后保留的执行实例数据 - ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); - List executionEntities = managementService.executeCommand(childByExecutionIdCmd); - //删除流程实例垃圾数据 - for (ExecutionEntity executionEntity : executionEntities) { - DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); - managementService.executeCommand(deleteExecutionCmd); - } - runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); - //流程作废监听 - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), - processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); - return true; - } catch (Exception e) { - log.error("撤销失败:" + e.getMessage(), e); - throw new ServiceException("撤销失败:" + e.getMessage()); - } - } - - /** - * 分页查询当前登录人单据 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); - query.startedBy(String.valueOf(LoginHelper.getUserId())); - if (StringUtils.isNotBlank(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - query.orderByProcessInstanceStartTime().desc(); - List historicProcessInstanceList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List taskVoList = new ArrayList<>(); - if (CollUtil.isNotEmpty(historicProcessInstanceList)) { - List processInstanceIds = StreamUtils.toList(historicProcessInstanceList, HistoricProcessInstance::getId); - List taskList = QueryUtils.taskQuery(processInstanceIds).list(); - for (Task task : taskList) { - taskVoList.add(BeanUtil.toBean(task, TaskVo.class)); - } - } - for (HistoricProcessInstance processInstance : historicProcessInstanceList) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); - if (CollUtil.isNotEmpty(taskVoList)) { - List collect = StreamUtils.filter(taskVoList, e -> e.getProcessInstanceId().equals(processInstance.getId())); - processInstanceVo.setTaskVoList(CollUtil.isNotEmpty(collect) ? collect : Collections.emptyList()); - } - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean taskUrging(TaskUrgingBo taskUrgingBo) { - try { - ProcessInstance processInstance = QueryUtils.instanceQuery(taskUrgingBo.getProcessInstanceId()).singleResult(); - if (processInstance == null) { - throw new ServiceException("任务已结束!"); - } - String message = taskUrgingBo.getMessage(); - if (StringUtils.isBlank(message)) { - message = "您的【" + processInstance.getName() + "】单据还未审批,请您及时处理。"; - } - List list = QueryUtils.taskQuery(taskUrgingBo.getProcessInstanceId()).list(); - WorkflowUtils.sendMessage(list, processInstance.getName(), taskUrgingBo.getMessageType(), message, userService); - } catch (ServiceException e) { - throw new ServiceException(e.getMessage()); - } - return true; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java deleted file mode 100644 index 32e6aec08..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ /dev/null @@ -1,852 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.OssService; -import org.dromara.common.core.service.UserService; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.ActHiTaskinst; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.*; -import org.dromara.workflow.flowable.cmd.*; -import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; -import org.dromara.workflow.mapper.ActHiTaskinstMapper; -import org.dromara.workflow.mapper.ActTaskMapper; -import org.dromara.workflow.service.IActTaskService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.common.engine.api.FlowableObjectNotFoundException; -import org.flowable.common.engine.impl.identity.Authentication; -import org.flowable.engine.*; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; -import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.identitylink.api.history.HistoricIdentityLink; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.flowable.variable.api.persistence.entity.VariableInstance; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -import static org.dromara.workflow.common.constant.FlowConstant.*; - -/** - * 任务 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActTaskServiceImpl implements IActTaskService { - - private final RuntimeService runtimeService; - private final TaskService taskService; - private final HistoryService historyService; - private final IdentityService identityService; - private final ManagementService managementService; - private final ActTaskMapper actTaskMapper; - private final IWfTaskBackNodeService wfTaskBackNodeService; - private final ActHiTaskinstMapper actHiTaskinstMapper; - private final IWfNodeConfigService wfNodeConfigService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - private final FlowProcessEventHandler flowProcessEventHandler; - private final UserService userService; - private final OssService ossService; - - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Map startWorkFlow(StartProcessBo startProcessBo) { - Map map = new HashMap<>(); - if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { - throw new ServiceException("启动工作流时必须包含业务ID"); - } - // 判断当前业务是否启动过流程 - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); - HistoricProcessInstance historicProcessInstance = query.processInstanceBusinessKey(startProcessBo.getBusinessKey()).singleResult(); - if (ObjectUtil.isNotEmpty(historicProcessInstance)) { - BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); - } - List taskResult = QueryUtils.taskQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); - if (CollUtil.isNotEmpty(taskResult)) { - if (CollUtil.isNotEmpty(startProcessBo.getVariables())) { - taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables()); - } - map.put(PROCESS_INSTANCE_ID, taskResult.get(0).getProcessInstanceId()); - map.put("taskId", taskResult.get(0).getId()); - return map; - } - WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); - if (wfDefinitionConfigVo == null) { - throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); - } - // 设置启动人 - identityService.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); - Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); - // 启动流程实例(提交申请) - Map variables = startProcessBo.getVariables(); - // 启动跳过表达式 - variables.put(FLOWABLE_SKIP_EXPRESSION_ENABLED, true); - // 流程发起人 - variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); - ProcessInstance pi; - try { - if (TenantHelper.isEnable()) { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); - } else { - pi = runtimeService.startProcessInstanceByKey(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables); - } - } catch (FlowableObjectNotFoundException e) { - throw new ServiceException("找不到当前【" + wfDefinitionConfigVo.getProcessKey() + "】流程定义!"); - } - // 将流程定义名称 作为 流程实例名称 - runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); - // 申请人执行流程 - List taskList = QueryUtils.taskQuery(pi.getId()).list(); - if (taskList.size() > 1) { - throw new ServiceException("请检查流程第一个环节是否为申请人!"); - } - - runtimeService.updateBusinessStatus(pi.getProcessInstanceId(), BusinessStatusEnum.DRAFT.getStatus()); - taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString()); - taskService.setVariable(taskList.get(0).getId(), PROCESS_INSTANCE_ID, pi.getProcessInstanceId()); - taskService.setVariable(taskList.get(0).getId(), BUSINESS_KEY, pi.getBusinessKey()); - map.put("processInstanceId", pi.getProcessInstanceId()); - map.put("taskId", taskList.get(0).getId()); - return map; - } - - /** - * 办理任务 - * - * @param completeTaskBo 办理任务参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean completeTask(CompleteTaskBo completeTaskBo) { - try { - String userId = String.valueOf(LoginHelper.getUserId()); - Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId()); - if (task == null) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - //办理委托任务 - if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) { - taskService.resolveTask(completeTaskBo.getTaskId()); - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isNotBlank(completeTaskBo.getMessage()) ? completeTaskBo.getMessage() : StrUtil.EMPTY); - taskService.complete(newTask.getId()); - return true; - } - //附件上传 - AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId(), ossService); - managementService.executeCommand(attachmentCmd); - String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); - //流程提交监听 - if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); - } - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); - //办理监听 - flowProcessEventHandler.processTaskHandler(processInstance.getProcessDefinitionKey(), task.getTaskDefinitionKey(), - task.getId(), processInstance.getBusinessKey()); - //办理意见 - taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); - //办理任务 - taskService.setAssignee(task.getId(), userId); - if (CollUtil.isNotEmpty(completeTaskBo.getVariables())) { - taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); - } else { - taskService.complete(completeTaskBo.getTaskId()); - } - //记录执行过的流程任务节点 - wfTaskBackNodeService.recordExecuteNode(task); - ProcessInstance pi = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - if (pi == null) { - UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); - managementService.executeCommand(updateBusinessStatusCmd); - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), - BusinessStatusEnum.FINISH.getStatus(), false); - } else { - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - for (Task t : list) { - if (ModelUtils.isUserTask(t.getProcessDefinitionId(), t.getTaskDefinitionKey())) { - List links = historyService.getHistoricIdentityLinksForTask(t.getId()); - if (CollUtil.isEmpty(links) && StringUtils.isBlank(t.getAssignee())) { - throw new ServiceException("下一节点【" + t.getName() + "】没有办理人!"); - } - } - } - - if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(completeTaskBo.getWfCopyList())) { - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.COPY.getStatus(), LoginHelper.getLoginUser().getNickname() + "【抄送】给" + String.join(",", StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserName))); - taskService.complete(newTask.getId()); - List taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - WorkflowUtils.createCopyTask(taskList, StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserId)); - } - sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 发送消息 - * - * @param list 任务 - * @param name 流程名称 - * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 - */ - @Async - public void sendMessage(List list, String name, List messageType, String message) { - WorkflowUtils.sendMessage(list, name, messageType, message, userService); - } - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - List roles = LoginHelper.getLoginUser().getRoles(); - List roleIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - String userId = String.valueOf(LoginHelper.getUserId()); - queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); - queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); - String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); - queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids))); - if (StringUtils.isNotBlank(taskBo.getName())) { - queryWrapper.like("t.name_", taskBo.getName()); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - } - Page page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); - task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { - TaskQuery query = QueryUtils.taskQuery(); - if (StringUtils.isNotBlank(taskBo.getName())) { - query.taskNameLike("%" + taskBo.getName() + "%"); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - query.processDefinitionKey(taskBo.getProcessDefinitionKey()); - } - query.orderByTaskCreateTime().desc(); - List taskList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List processInstanceList = null; - if (CollUtil.isNotEmpty(taskList)) { - Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); - processInstanceList = QueryUtils.instanceQuery(processInstanceIds).list(); - } - List list = new ArrayList<>(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (Task task : taskList) { - TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - if (CollUtil.isNotEmpty(processInstanceList)) { - processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); - taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); - taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); - taskVo.setProcessDefinitionVersion(e.getProcessDefinitionVersion()); - taskVo.setBusinessKey(e.getBusinessKey()); - }); - } - taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); - taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); - } - list.add(taskVo); - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - String userId = String.valueOf(LoginHelper.getUserId()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); - queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - queryWrapper.eq("t.assignee_", userId); - Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - String userId = String.valueOf(LoginHelper.getUserId()); - if (StringUtils.isNotBlank(taskBo.getName())) { - queryWrapper.like("t.name_", taskBo.getName()); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); - } - if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - } - queryWrapper.eq("t.assignee_", userId); - Page page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); - queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 委派任务 - * - * @param delegateBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean delegateTask(DelegateBo delegateBo) { - Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId()); - - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - try { - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getLoginUser().getNickname() + "】委派给【" + delegateBo.getNickName() + "】"); - //委托任务 - taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); - //办理生成的任务记录 - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 终止任务 - * - * @param terminationBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean terminationTask(TerminationBo terminationBo) { - TaskQuery query = QueryUtils.taskQuery(); - Task task = query.taskId(terminationBo.getTaskId()).singleResult(); - - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); - BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); - try { - if (StringUtils.isBlank(terminationBo.getComment())) { - terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请"); - } else { - terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment()); - } - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - if (CollUtil.isNotEmpty(list)) { - List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); - if (CollUtil.isNotEmpty(subTasks)) { - subTasks.forEach(e -> taskService.deleteTask(e.getId())); - } - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); - runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); - } - //流程终止监听 - flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), - historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); - return true; - } catch (Exception e) { - throw new ServiceException(e.getMessage()); - } - } - - /** - * 转办任务 - * - * @param transmitBo 参数 - */ - @Override - public boolean transferTask(TransmitBo transmitBo) { - Task task = WorkflowUtils.getTaskByCurrentUser(transmitBo.getTaskId()); - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - try { - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.TRANSFER.getStatus(), StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); - taskService.complete(newTask.getId()); - taskService.setAssignee(task.getId(), transmitBo.getUserId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - */ - @Override - public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(addMultiBo.getTaskId()); - if (!LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin()) { - taskQuery.taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); - } - Task task = taskQuery.singleResult(); - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - String taskDefinitionKey = task.getTaskDefinitionKey(); - String processInstanceId = task.getProcessInstanceId(); - String processDefinitionId = task.getProcessDefinitionId(); - - try { - MultiInstanceVo multiInstanceVo = WorkflowUtils.isMultiInstance(processDefinitionId, taskDefinitionKey); - if (multiInstanceVo == null) { - throw new ServiceException("当前环节不是会签节点"); - } - if (multiInstanceVo.getType() instanceof ParallelMultiInstanceBehavior) { - for (Long assignee : addMultiBo.getAssignees()) { - runtimeService.addMultiInstanceExecution(taskDefinitionKey, processInstanceId, Collections.singletonMap(multiInstanceVo.getAssignee(), assignee)); - } - } else if (multiInstanceVo.getType() instanceof SequentialMultiInstanceBehavior) { - AddSequenceMultiInstanceCmd addSequenceMultiInstanceCmd = new AddSequenceMultiInstanceCmd(task.getExecutionId(), multiInstanceVo.getAssigneeList(), addMultiBo.getAssignees()); - managementService.executeCommand(addSequenceMultiInstanceCmd); - } - List assigneeNames = addMultiBo.getAssigneeNames(); - String username = LoginHelper.getUsername(); - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), processInstanceId, TaskStatusEnum.SIGN.getStatus(), username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - */ - @Override - public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(deleteMultiBo.getTaskId()); - if (!LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin()) { - taskQuery.taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); - } - Task task = taskQuery.singleResult(); - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - String taskDefinitionKey = task.getTaskDefinitionKey(); - String processInstanceId = task.getProcessInstanceId(); - String processDefinitionId = task.getProcessDefinitionId(); - try { - MultiInstanceVo multiInstanceVo = WorkflowUtils.isMultiInstance(processDefinitionId, taskDefinitionKey); - if (multiInstanceVo == null) { - throw new ServiceException("当前环节不是会签节点"); - } - if (multiInstanceVo.getType() instanceof ParallelMultiInstanceBehavior) { - for (String executionId : deleteMultiBo.getExecutionIds()) { - runtimeService.deleteMultiInstanceExecution(executionId, false); - } - for (String taskId : deleteMultiBo.getTaskIds()) { - historyService.deleteHistoricTaskInstance(taskId); - } - } else if (multiInstanceVo.getType() instanceof SequentialMultiInstanceBehavior) { - DeleteSequenceMultiInstanceCmd deleteSequenceMultiInstanceCmd = new DeleteSequenceMultiInstanceCmd(task.getAssignee(), task.getExecutionId(), multiInstanceVo.getAssigneeList(), deleteMultiBo.getAssigneeIds()); - managementService.executeCommand(deleteSequenceMultiInstanceCmd); - } - List assigneeNames = deleteMultiBo.getAssigneeNames(); - String username = LoginHelper.getUsername(); - TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), processInstanceId, TaskStatusEnum.SIGN_OFF.getStatus(), username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public String backProcess(BackProcessBo backProcessBo) { - String userId = String.valueOf(LoginHelper.getUserId()); - Task task = WorkflowUtils.getTaskByCurrentUser(backProcessBo.getTaskId()); - - if (ObjectUtil.isEmpty(task)) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - try { - String processInstanceId = task.getProcessInstanceId(); - ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - //获取并行网关执行后保留的执行实例数据 - ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); - List executionEntities = managementService.executeCommand(childByExecutionIdCmd); - //校验单据 - BusinessStatusEnum.checkBackStatus(processInstance.getBusinessStatus()); - //判断是否有多个任务 - List taskList = QueryUtils.taskQuery(processInstanceId).list(); - String backTaskDefinitionKey = backProcessBo.getTargetActivityId(); - taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.BACK.getStatus(), StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); - if (taskList.size() > 1) { - //当前多个任务驳回到单个节点 - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdsToSingleActivityId(taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()), backTaskDefinitionKey).changeState(); - ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); - actHiTaskinst.setAssignee(userId); - actHiTaskinst.setId(task.getId()); - actHiTaskinstMapper.updateById(actHiTaskinst); - } else { - //当前单个节点驳回单个节点 - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey).changeState(); - } - //删除并行环节未办理记录 - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (multiInstance == null && taskList.size() > 1) { - List tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); - if (CollUtil.isNotEmpty(tasks)) { - actHiTaskinstMapper.deleteByIds(StreamUtils.toList(tasks, Task::getId)); - } - } - - - List instanceList = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().desc().list(); - List list = QueryUtils.taskQuery(processInstanceId).list(); - for (Task t : list) { - instanceList.stream().filter(e -> e.getTaskDefinitionKey().equals(t.getTaskDefinitionKey())).findFirst().ifPresent(e -> { - taskService.setAssignee(t.getId(), e.getAssignee()); - }); - } - //发送消息 - String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; - sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(), message); - //删除流程实例垃圾数据 - for (ExecutionEntity executionEntity : executionEntities) { - DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); - managementService.executeCommand(deleteExecutionCmd); - } - - WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); - if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { - runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), - processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); - } - //删除驳回后的流程节点 - wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return task.getProcessInstanceId(); - } - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @param userId 办理人id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateAssignee(String[] taskIds, String userId) { - try { - List list = QueryUtils.taskQuery().taskIds(Arrays.asList(taskIds)).list(); - for (Task task : list) { - taskService.setAssignee(task.getId(), userId); - } - } catch (Exception e) { - log.error("修改失败:" + e.getMessage(), e); - throw new ServiceException("修改失败:" + e.getMessage()); - } - return true; - } - - /** - * 查询流程变量 - * - * @param taskId 任务id - */ - @Override - public List getInstanceVariable(String taskId) { - List variableVoList = new ArrayList<>(); - Map variableInstances = taskService.getVariableInstances(taskId); - if (CollUtil.isNotEmpty(variableInstances)) { - for (Map.Entry entry : variableInstances.entrySet()) { - VariableVo variableVo = new VariableVo(); - variableVo.setKey(entry.getKey()); - variableVo.setValue(entry.getValue().getValue().toString()); - variableVoList.add(variableVo); - } - } - return variableVoList; - } - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - * @return - */ - @Override - @SuppressWarnings("unchecked") - public String getTaskUserIdsByAddMultiInstance(String taskId) { - Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); - if (task == null) { - throw new ServiceException("任务不存在"); - } - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (multiInstance == null) { - return ""; - } - List userIds; - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - userIds = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); - } else { - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); - } - return StringUtils.join(userIds, StringUtils.SEPARATOR); - } - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id 任务id - */ - @Override - @SuppressWarnings("unchecked") - public List getListByDeleteMultiInstance(String taskId) { - Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); - List taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - List taskListVo = new ArrayList<>(); - if (multiInstance == null) { - return List.of(); - } - List assigneeList = new ArrayList<>(); - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - List variable = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); - for (Object o : variable) { - assigneeList.add(Long.valueOf(o.toString())); - } - } - - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - List userIds = StreamUtils.filter(assigneeList, e -> !String.valueOf(e).equals(task.getAssignee())); - List userList = userService.selectListByIds(userIds); - for (Long userId : userIds) { - TaskVo taskVo = new TaskVo(); - taskVo.setId("串行会签"); - taskVo.setExecutionId("串行会签"); - taskVo.setProcessInstanceId(task.getProcessInstanceId()); - taskVo.setName(task.getName()); - taskVo.setAssignee(userId); - if (CollUtil.isNotEmpty(userList)) { - userList.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> taskVo.setAssigneeName(u.getNickName())); - } - taskListVo.add(taskVo); - } - return taskListVo; - } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) { - List tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); - if (CollUtil.isNotEmpty(tasks)) { - List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); - List userList = userService.selectListByIds(userIds); - for (Task t : tasks) { - TaskVo taskVo = new TaskVo(); - taskVo.setId(t.getId()); - taskVo.setExecutionId(t.getExecutionId()); - taskVo.setProcessInstanceId(t.getProcessInstanceId()); - taskVo.setName(t.getName()); - taskVo.setAssignee(Long.valueOf(t.getAssignee())); - if (CollUtil.isNotEmpty(userList)) { - userList.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName())); - } - taskListVo.add(taskVo); - } - return taskListVo; - } - } - return List.of(); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java new file mode 100644 index 000000000..a0d1cf30e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -0,0 +1,77 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.warm.flow.core.entity.Definition; +import com.warm.flow.core.service.DefService; +import com.warm.flow.core.utils.page.Page; +import com.warm.flow.orm.entity.FlowDefinition; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.Document; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.XMLWriter; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.service.IFlwDefinitionService; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * 流程定义 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwDefinitionServiceImpl implements IFlwDefinitionService { + private final DefService defService; + + /** + * 分页查询 + * + * @param flowDefinition 参数 + * @return 返回分页列表 + */ + @Override + public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { + Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); + page = defService.orderByCreateTime().desc().page(flowDefinition, page); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getList(), FlowDefinitionVo.class)); + build.setTotal(page.getTotal()); + return build; + } + + /** + * 导出流程定义 + * + * @param id 流程定义id + * @param response 响应 + * @throws IOException 异常 + */ + @Override + public void exportDefinition(Long id, HttpServletResponse response) throws IOException { + Document document = defService.exportXml(id); + // 设置生成xml的格式 + OutputFormat of = OutputFormat.createPrettyPrint(); + // 设置编码格式 + of.setEncoding("UTF-8"); + of.setIndent(true); + of.setIndent(" "); + of.setNewlines(true); + + // 创建一个xml文档编辑器 + XMLWriter writer = new XMLWriter(response.getOutputStream(), of); + writer.setEscapeText(false); + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/x-msdownload"); + response.setHeader("Content-Disposition", "attachment;"); + writer.write(document); + writer.close(); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java new file mode 100644 index 000000000..29fec5852 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.warm.flow.core.FlowFactory; +import com.warm.flow.core.constant.ExceptionCons; +import com.warm.flow.core.dto.FlowParams; +import com.warm.flow.core.entity.*; +import com.warm.flow.core.enums.FlowStatus; +import com.warm.flow.core.enums.NodeType; +import com.warm.flow.core.enums.SkipType; +import com.warm.flow.core.service.DefService; +import com.warm.flow.core.service.InsService; +import com.warm.flow.core.service.NodeService; +import com.warm.flow.core.service.TaskService; +import com.warm.flow.core.utils.AssertUtil; +import com.warm.flow.core.utils.page.Page; +import com.warm.flow.orm.entity.FlowInstance; +import com.warm.flow.orm.mapper.FlowInstanceMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 流程实例 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwInstanceServiceImpl implements IFlwInstanceService { + + private final InsService insService; + private final NodeService nodeService; + private final DefService defService; + private final TaskService taskService; + private final FlowInstanceMapper flowInstanceMapper; + + /** + * 分页查询正在运行的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); + instance.setFlowStatus(FlowStatus.APPROVAL.getKey()); + page = insService.orderByCreateTime().desc().page(instance, page); + TableDataInfo build = TableDataInfo.build(); + build.setRows(page.getList()); + build.setTotal(page.getTotal()); + return build; + } + + /** + * 分页查询已结束的流程实例 + * + * @param instance 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); + instance.setFlowStatus(FlowStatus.FINISHED.getKey()); + page = insService.orderByCreateTime().desc().page(instance, page); + TableDataInfo build = TableDataInfo.build(); + build.setRows(page.getList()); + build.setTotal(page.getTotal()); + return build; + } + + /** + * 根据业务id查询流程实例 + * + * @param businessId 业务id + */ + @Override + public FlowInstance instanceByBusinessId(String businessId) { + return flowInstanceMapper.selectOne(new LambdaQueryWrapper().eq(FlowInstance::getBusinessId, businessId)); + } + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByBusinessIds(List businessIds) { + List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, businessIds)); + if (CollUtil.isEmpty(flowInstances)) { + return false; + } + return insService.remove(StreamUtils.toList(flowInstances, FlowInstance::getId)); + } + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByInstanceIds(List instanceIds) { + return insService.remove(instanceIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean cancelProcessApply(String businessId) { + FlowInstance flowInstance = instanceByBusinessId(businessId); + if (ObjectUtil.isNull(flowInstance)) { + return false; + } + try { + Definition definition = defService.getById(flowInstance.getDefinitionId()); + List list = taskService.list(FlowFactory.newTask().setInstanceId(flowInstance.getId())); + // 获取已发布的流程节点 + List nodes = nodeService.getByFlowCode(definition.getFlowCode()); + AssertUtil.isTrue(CollUtil.isEmpty(nodes), ExceptionCons.NOT_PUBLISH_NODE); + // 获取开始节点 + Node startNode = nodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); + AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); + + // 获取下一个节点,如果是网关节点,则重新获取后续节点 + List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); + Node node = nextNodes.get(0); + FlowParams flowParams = FlowParams.build() + .nodeCode(node.getNodeCode()) + .skipType(SkipType.PASS.getKey()) + .permissionFlag(WorkflowUtils.permissionList()); + taskService.skip(list.get(0).getId(), flowParams); + } catch (Exception e) { + throw new RuntimeException(e); + } + return false; + } + + private Node getFirstBetween(Node startNode) { + List skips = FlowFactory.skipService().list(FlowFactory.newSkip() + .setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); + Skip skip = skips.get(0); + return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()) + .setNodeCode(skip.getNextNodeCode())); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java new file mode 100644 index 000000000..940b1baa8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -0,0 +1,204 @@ +package org.dromara.workflow.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.warm.flow.core.dto.FlowParams; +import com.warm.flow.core.entity.Instance; +import com.warm.flow.core.entity.Task; +import com.warm.flow.core.enums.SkipType; +import com.warm.flow.core.service.InsService; +import com.warm.flow.core.service.TaskService; +import com.warm.flow.orm.entity.FlowInstance; +import com.warm.flow.orm.entity.FlowTask; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +import static org.dromara.workflow.common.constant.FlowConstant.*; + +/** + * 任务 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwTaskServiceImpl implements IFlwTaskService { + + private final TaskService taskService; + private final InsService insService; + private final FlwTaskMapper flwTaskMapper; + private final IWfDefinitionConfigService wfDefinitionConfigService; + private final IFlwInstanceService iFlwInstanceService; + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map startWorkFlow(StartProcessBo startProcessBo) { + Map map = new HashMap<>(16); + if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { + throw new ServiceException("启动工作流时必须包含业务ID"); + } + // 启动流程实例(提交申请) + Map variables = startProcessBo.getVariables(); + // 流程发起人 + variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); + // 业务id + variables.put(BUSINESS_KEY, startProcessBo.getBusinessKey()); + WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); + if (wfDefinitionConfigVo == null) { + throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); + } + + FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(startProcessBo.getBusinessKey()); + if (flowInstance != null) { + List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); + map.put("processInstanceId", taskList.get(0).getInstanceId()); + map.put("taskId", taskList.get(0).getId()); + return map; + } + FlowParams flowParams = new FlowParams(); + flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); + flowParams.variable(startProcessBo.getVariables()); + + Instance instance; + try { + instance = insService.start(startProcessBo.getBusinessKey(), flowParams); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + // 申请人执行流程 + List taskList = taskService.list(new FlowTask().setInstanceId(instance.getId())); + if (taskList.size() > 1) { + throw new ServiceException("请检查流程第一个环节是否为申请人!"); + } + map.put("processInstanceId", instance.getId()); + map.put("taskId", taskList.get(0).getId()); + return map; + } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean completeTask(CompleteTaskBo completeTaskBo) { + try { + String userId = String.valueOf(LoginHelper.getUserId()); + Long taskId = completeTaskBo.getTaskId(); + FlowParams flowParams = new FlowParams(); + flowParams.variable(completeTaskBo.getVariables()); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.message(completeTaskBo.getMessage()); + flowParams.handler(userId); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + taskService.skip(taskId, flowParams); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 查询当前用户的待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); + queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 查询当前用户的已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); + flowTaskBo.setPermissionList(WorkflowUtils.permissionList()); + Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper, flowTaskBo); + return TableDataInfo.build(page); + } + + /** + * 查询当前用户的抄送 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); + flowTaskBo.setPermissionList(WorkflowUtils.permissionList()); + Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + + /** + * 查询参数 + * + * @param flowTaskBo 参数 + */ + private QueryWrapper getFlowTaskBoQueryWrapper(FlowTaskBo flowTaskBo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); + queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + return queryWrapper; + } + + /** + * 驳回任务 + * + * @param bo 参数 + */ + @Override + public boolean backProcess(BackProcessBo bo) { + try { + String userId = String.valueOf(LoginHelper.getUserId()); + Long taskId = bo.getTaskId(); + FlowParams flowParams = new FlowParams(); + flowParams.variable(bo.getVariables()); + flowParams.skipType(SkipType.REJECT.getKey()); + flowParams.message(bo.getMessage()); + flowParams.handler(userId); + flowParams.nodeCode(bo.getTargetNodeCode()); + taskService.skip(taskId, flowParams); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index a62ce5f4c..e4ef38ce6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -109,8 +109,8 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @Override @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids) { - List idList = StreamUtils.toList(ids, String::valueOf); - workflowService.deleteRunAndHisInstance(idList); + List idList = StreamUtils.toList(ids, Long::valueOf); + workflowService.deleteInstance(idList); return baseMapper.deleteByIds(ids) > 0; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index b498262c2..2470a2d23 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -10,11 +10,6 @@ import org.dromara.workflow.domain.bo.WfCategoryBo; import org.dromara.workflow.domain.vo.WfCategoryVo; import org.dromara.workflow.mapper.WfCategoryMapper; import org.dromara.workflow.service.IWfCategoryService; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.repository.Deployment; -import org.flowable.engine.repository.Model; -import org.flowable.engine.repository.ProcessDefinition; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,8 +28,6 @@ public class WfCategoryServiceImpl implements IWfCategoryService { private final WfCategoryMapper baseMapper; - private final RepositoryService repositoryService; - /** * 查询流程分类 */ @@ -83,19 +76,6 @@ public class WfCategoryServiceImpl implements IWfCategoryService { WfCategory update = MapstructUtils.convert(bo, WfCategory.class); validEntityBeforeSave(update); WfCategoryVo wfCategoryVo = baseMapper.selectVoById(bo.getId()); - List processDefinitionList = QueryUtils.definitionQuery().processDefinitionCategory(wfCategoryVo.getCategoryCode()).list(); - for (ProcessDefinition processDefinition : processDefinitionList) { - repositoryService.setProcessDefinitionCategory(processDefinition.getId(), bo.getCategoryCode()); - } - List deploymentList = QueryUtils.deploymentQuery().deploymentCategory(wfCategoryVo.getCategoryCode()).list(); - for (Deployment deployment : deploymentList) { - repositoryService.setDeploymentCategory(deployment.getId(), bo.getCategoryCode()); - } - List modelList = QueryUtils.modelQuery().modelCategory(wfCategoryVo.getCategoryCode()).list(); - for (Model model : modelList) { - model.setCategory(bo.getCategoryCode()); - repositoryService.saveModel(model); - } return baseMapper.updateById(update) > 0; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java deleted file mode 100644 index 6c255d3b0..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.vo.MultiInstanceVo; -import org.dromara.workflow.mapper.WfTaskBackNodeMapper; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.task.api.Task; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -import static org.dromara.workflow.common.constant.FlowConstant.MULTI_INSTANCE; -import static org.dromara.workflow.common.constant.FlowConstant.USER_TASK; - - -/** - * 节点驳回记录Service业务层处理 - * - * @author may - * @date 2024-03-13 - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService { - - private final WfTaskBackNodeMapper wfTaskBackNodeMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void recordExecuteNode(Task task) { - List list = getListByInstanceId(task.getProcessInstanceId()); - WfTaskBackNode wfTaskBackNode = new WfTaskBackNode(); - wfTaskBackNode.setNodeId(task.getTaskDefinitionKey()); - wfTaskBackNode.setNodeName(task.getName()); - wfTaskBackNode.setInstanceId(task.getProcessInstanceId()); - wfTaskBackNode.setAssignee(String.valueOf(LoginHelper.getUserId())); - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (ObjectUtil.isNotEmpty(multiInstance)) { - wfTaskBackNode.setTaskType(MULTI_INSTANCE); - } else { - wfTaskBackNode.setTaskType(USER_TASK); - } - if (CollUtil.isEmpty(list)) { - wfTaskBackNode.setOrderNo(0); - wfTaskBackNodeMapper.insert(wfTaskBackNode); - } else { - WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0); - if (ObjectUtil.isEmpty(taskNode)) { - wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1); - WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId()); - if (ObjectUtil.isNotEmpty(node)) { - node.setAssignee(node.getAssignee() + StringUtils.SEPARATOR + LoginHelper.getUserId()); - wfTaskBackNodeMapper.updateById(node); - } else { - wfTaskBackNodeMapper.insert(wfTaskBackNode); - } - } - } - } - - @Override - public List getListByInstanceId(String processInstanceId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - wrapper.orderByDesc(WfTaskBackNode::getOrderNo); - return wfTaskBackNodeMapper.selectList(wrapper); - } - - @Override - public WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - queryWrapper.eq(WfTaskBackNode::getNodeId, nodeId); - return wfTaskBackNodeMapper.selectOne(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteBackTaskNode(String processInstanceId, String targetActivityId) { - try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - queryWrapper.eq(WfTaskBackNode::getNodeId, targetActivityId); - WfTaskBackNode actTaskNode = wfTaskBackNodeMapper.selectOne(queryWrapper); - if (ObjectUtil.isNotNull(actTaskNode)) { - Integer orderNo = actTaskNode.getOrderNo(); - List taskNodeList = getListByInstanceId(processInstanceId); - List ids = new ArrayList<>(); - if (CollUtil.isNotEmpty(taskNodeList)) { - for (WfTaskBackNode taskNode : taskNodeList) { - if (taskNode.getOrderNo() >= orderNo) { - ids.add(taskNode.getId()); - } - } - } - if (CollUtil.isNotEmpty(ids)) { - wfTaskBackNodeMapper.deleteByIds(ids); - } - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException("删除失败"); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByInstanceId(String processInstanceId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - List list = wfTaskBackNodeMapper.selectList(wrapper); - int delete = wfTaskBackNodeMapper.delete(wrapper); - if (list.size() != delete) { - throw new ServiceException("删除失败"); - } - return true; - } - - @Override - public boolean deleteByInstanceIds(List processInstanceIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds); - List list = wfTaskBackNodeMapper.selectList(wrapper); - int delete = wfTaskBackNodeMapper.delete(wrapper); - if (list.size() != delete) { - throw new ServiceException("删除失败"); - } - return true; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 11f6ef106..0c2ec50ad 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -1,13 +1,8 @@ package org.dromara.workflow.service.impl; -import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.service.WorkflowService; -import org.dromara.workflow.domain.ActHiProcinst; -import org.dromara.workflow.service.IActHiProcinstService; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.engine.RuntimeService; +import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; import java.util.List; @@ -22,18 +17,17 @@ import java.util.Map; @Service public class WorkflowServiceImpl implements WorkflowService { - private final IActProcessInstanceService iActProcessInstanceService; - private final RuntimeService runtimeService; - private final IActHiProcinstService iActHiProcinstService; + private final IFlwInstanceService iFlwInstanceService; + /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * 删除流程实例 * * @param businessKeys 业务id * @return 结果 */ @Override - public boolean deleteRunAndHisInstance(List businessKeys) { - return iActProcessInstanceService.deleteRunAndHisInstance(businessKeys); + public boolean deleteInstance(List businessKeys) { + return iFlwInstanceService.deleteByBusinessIds(businessKeys); } /** @@ -43,7 +37,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatusByTaskId(String taskId) { - return WorkflowUtils.getBusinessStatusByTaskId(taskId); + return ""; } /** @@ -53,7 +47,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatus(String businessKey) { - return WorkflowUtils.getBusinessStatus(businessKey); + return ""; } /** @@ -65,7 +59,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public void setVariable(String taskId, String variableName, Object value) { - runtimeService.setVariable(taskId, variableName, value); } /** @@ -76,7 +69,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public void setVariables(String taskId, Map variables) { - runtimeService.setVariables(taskId, variables); } /** @@ -88,7 +80,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public void setVariableLocal(String taskId, String variableName, Object value) { - runtimeService.setVariableLocal(taskId, variableName, value); } /** @@ -99,7 +90,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public void setVariablesLocal(String taskId, Map variables) { - runtimeService.setVariablesLocal(taskId, variables); } /** @@ -110,10 +100,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getInstanceIdByBusinessKey(String businessKey) { - ActHiProcinst actHiProcinst = iActHiProcinstService.selectByBusinessKey(businessKey); - if (actHiProcinst == null) { - return StrUtil.EMPTY; - } - return actHiProcinst.getId(); + return null; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java deleted file mode 100644 index 7c5377ed7..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.dromara.workflow.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.workflow.domain.vo.MultiInstanceVo; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.*; -import org.flowable.bpmn.model.Process; -import org.flowable.editor.language.json.converter.BpmnJsonConverter; -import org.flowable.engine.ProcessEngine; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.rmi.ServerException; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 模型工具 - * - * @author may - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ModelUtils { - - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - - public static BpmnModel xmlToBpmnModel(String xml) throws IOException { - if (xml == null) { - throw new ServerException("xml不能为空"); - } - try { - InputStream inputStream = new ByteArrayInputStream(StrUtil.utf8Bytes(xml)); - XMLInputFactory factory = XMLInputFactory.newInstance(); - XMLStreamReader reader = factory.createXMLStreamReader(inputStream); - return new BpmnXMLConverter().convertToBpmnModel(reader); - } catch (XMLStreamException e) { - throw new ServerException(e.getMessage()); - } - } - - /** - * bpmnModel转为xml - * - * @param jsonBytes json - */ - public static byte[] bpmnJsonToXmlBytes(byte[] jsonBytes) throws IOException { - if (jsonBytes == null) { - return new byte[0]; - } - // 1. json字节码转成 BpmnModel 对象 - ObjectMapper objectMapper = JsonUtils.getObjectMapper(); - JsonNode jsonNode = objectMapper.readTree(jsonBytes); - BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(jsonNode); - - if (bpmnModel.getProcesses().isEmpty()) { - return new byte[0]; - } - // 2.将bpmnModel转为xml - return new BpmnXMLConverter().convertToXML(bpmnModel); - } - - /** - * xml转为bpmnModel - * - * @param xmlBytes xml - */ - public static BpmnModel xmlToBpmnModel(byte[] xmlBytes) throws XMLStreamException { - ByteArrayInputStream byteArrayInputStream = IoUtil.toStream(xmlBytes); - XMLInputFactory xif = XMLInputFactory.newInstance(); - XMLStreamReader xtr = xif.createXMLStreamReader(byteArrayInputStream); - return new BpmnXMLConverter().convertToBpmnModel(xtr); - } - - /** - * 校验模型 - * - * @param bpmnModel bpmn模型 - */ - public static void checkBpmnModel(BpmnModel bpmnModel) throws ServerException { - Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); - - checkBpmnNode(flowElements, false); - - List subProcessList = flowElements.stream().filter(SubProcess.class::isInstance).map(SubProcess.class::cast).collect(Collectors.toList()); - if (!CollUtil.isEmpty(subProcessList)) { - for (SubProcess subProcess : subProcessList) { - Collection subProcessFlowElements = subProcess.getFlowElements(); - checkBpmnNode(subProcessFlowElements, true); - } - } - List multiInstanceVoList = new ArrayList<>(); - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask && ObjectUtil.isNotEmpty(((UserTask) flowElement).getLoopCharacteristics()) && StringUtils.isNotBlank(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem())) { - MultiInstanceVo multiInstanceVo = new MultiInstanceVo(); - multiInstanceVo.setAssigneeList(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem()); - multiInstanceVoList.add(multiInstanceVo); - } - } - - if (CollectionUtil.isNotEmpty(multiInstanceVoList) && multiInstanceVoList.size() > 1) { - Map> assigneeListGroup = StreamUtils.groupByKey(multiInstanceVoList, MultiInstanceVo::getAssigneeList); - for (Map.Entry> entry : assigneeListGroup.entrySet()) { - List value = entry.getValue(); - if (CollectionUtil.isNotEmpty(value) && value.size() > 1) { - String key = entry.getKey(); - throw new ServerException("会签人员集合【" + key + "】重复,请重新设置集合KEY"); - } - } - } - } - - /** - * 校验bpmn节点是否合法 - * - * @param flowElements 节点集合 - * @param subtask 是否子流程 - */ - private static void checkBpmnNode(Collection flowElements, boolean subtask) throws ServerException { - - if (CollUtil.isEmpty(flowElements)) { - throw new ServerException(subtask ? "子流程必须存在节点" : "必须存在节点!"); - } - - List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); - if (CollUtil.isEmpty(startEventList)) { - throw new ServerException(subtask ? "子流程必须存在开始节点" : "必须存在开始节点!"); - } - - if (startEventList.size() > 1) { - throw new ServerException(subtask ? "子流程只能存在一个开始节点" : "只能存在一个开始节点!"); - } - - StartEvent startEvent = startEventList.get(0); - List outgoingFlows = startEvent.getOutgoingFlows(); - if (CollUtil.isEmpty(outgoingFlows)) { - throw new ServerException(subtask ? "子流程流程节点为空,请至少设计一条主线流程!" : "流程节点为空,请至少设计一条主线流程!"); - } - - FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); - if (!(targetFlowElement instanceof UserTask) && !subtask) { - throw new ServerException("开始节点后第一个节点必须是用户任务!"); - } - //开始节点后第一个节点申请人节点 - if ((targetFlowElement instanceof UserTask) && !subtask) { - UserTask userTask = (UserTask) targetFlowElement; - if (StringUtils.isBlank(userTask.getFormKey())) { - throw new ServerException("申请人节点必须选择表单!"); - } - } - List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); - if (CollUtil.isEmpty(endEventList)) { - throw new ServerException(subtask ? "子流程必须存在结束节点!" : "必须存在结束节点!"); - } - } - - /** - * 获取流程全部用户节点 - * - * @param processDefinitionId 流程定义id - */ - public static List getUserTaskFlowElements(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - List list = new ArrayList<>(); - List processes = bpmnModel.getProcesses(); - Collection flowElements = processes.get(0).getFlowElements(); - buildUserTaskFlowElements(flowElements, list); - return list; - } - - /** - * 递归获取所有节点 - * - * @param flowElements 节点信息 - * @param list 集合 - */ - private static void buildUserTaskFlowElements(Collection flowElements, List list) { - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof SubProcess) { - Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); - buildUserTaskFlowElements(subFlowElements, list); - } else if (flowElement instanceof UserTask) { - list.add((UserTask) flowElement); - } - } - } - - /** - * 获取流程全部节点 - * - * @param processDefinitionId 流程定义id - */ - public static List getFlowElements(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - List list = new ArrayList<>(); - List processes = bpmnModel.getProcesses(); - Collection flowElements = processes.get(0).getFlowElements(); - buildFlowElements(flowElements, list); - return list; - } - - /** - * 递归获取所有节点 - * - * @param flowElements 节点信息 - * @param list 集合 - */ - private static void buildFlowElements(Collection flowElements, List list) { - for (FlowElement flowElement : flowElements) { - list.add(flowElement); - if (flowElement instanceof SubProcess) { - Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); - buildFlowElements(subFlowElements, list); - } - } - } - - /** - * 获取全部扩展信息 - * - * @param processDefinitionId 流程定义id - */ - public static Map> getExtensionElements(String processDefinitionId) { - Map> map = new HashMap<>(); - List flowElements = getFlowElements(processDefinitionId); - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask && CollUtil.isNotEmpty(flowElement.getExtensionElements())) { - map.putAll(flowElement.getExtensionElements()); - } - } - return map; - } - - /** - * 获取某个节点的扩展信息 - * - * @param processDefinitionId 流程定义id - * @param flowElementId 节点id - */ - public static Map> getExtensionElement(String processDefinitionId, String flowElementId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - Process process = bpmnModel.getMainProcess(); - FlowElement flowElement = process.getFlowElement(flowElementId); - return flowElement.getExtensionElements(); - } - - /** - * 判断当前节点是否为用户任务 - * - * @param processDefinitionId 流程定义id - * @param taskDefinitionKey 流程定义id - */ - public static boolean isUserTask(String processDefinitionId, String taskDefinitionKey) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); - return flowNode instanceof UserTask; - } - - /** - * 获取申请人节点 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - public static UserTask getApplyUserTask(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); - List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); - StartEvent startEvent = startEventList.get(0); - List outgoingFlows = startEvent.getOutgoingFlows(); - FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); - return (UserTask) targetFlowElement; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java deleted file mode 100644 index df928dc72..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.dromara.workflow.utils; - -import cn.hutool.core.bean.BeanUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.domain.vo.TaskVo; -import org.flowable.engine.ProcessEngine; -import org.flowable.engine.history.HistoricActivityInstanceQuery; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.repository.DeploymentQuery; -import org.flowable.engine.repository.ModelQuery; -import org.flowable.engine.repository.ProcessDefinitionQuery; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.runtime.ProcessInstanceQuery; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 查询工具 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class QueryUtils { - - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - - public static ModelQuery modelQuery() { - ModelQuery query = PROCESS_ENGINE.getRepositoryService().createModelQuery(); - if (TenantHelper.isEnable()) { - query.modelTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static ProcessDefinitionQuery definitionQuery() { - ProcessDefinitionQuery query = PROCESS_ENGINE.getRepositoryService().createProcessDefinitionQuery(); - if (TenantHelper.isEnable()) { - query.processDefinitionTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static DeploymentQuery deploymentQuery() { - DeploymentQuery query = PROCESS_ENGINE.getRepositoryService().createDeploymentQuery(); - if (TenantHelper.isEnable()) { - query.deploymentTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static DeploymentQuery deploymentQuery(String deploymentId) { - return deploymentQuery().deploymentId(deploymentId); - } - - public static DeploymentQuery deploymentQuery(List deploymentIds) { - return deploymentQuery().deploymentIds(deploymentIds); - } - - public static HistoricTaskInstanceQuery hisTaskInstanceQuery() { - HistoricTaskInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery(); - if (TenantHelper.isEnable()) { - query.taskTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricTaskInstanceQuery hisTaskInstanceQuery(String processInstanceId) { - return hisTaskInstanceQuery().processInstanceId(processInstanceId); - } - - public static HistoricTaskInstanceQuery hisTaskBusinessKeyQuery(String businessKey) { - return hisTaskInstanceQuery().processInstanceBusinessKey(businessKey); - } - - public static ProcessInstanceQuery instanceQuery() { - ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery(); - if (TenantHelper.isEnable()) { - query.processInstanceTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static ProcessInstanceQuery instanceQuery(String processInstanceId) { - return instanceQuery().processInstanceId(processInstanceId); - } - - public static ProcessInstanceQuery businessKeyQuery(String businessKey) { - return instanceQuery().processInstanceBusinessKey(businessKey); - } - - public static ProcessInstanceQuery instanceQuery(Set processInstanceIds) { - return instanceQuery().processInstanceIds(processInstanceIds); - } - - public static HistoricProcessInstanceQuery hisInstanceQuery() { - HistoricProcessInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery(); - if (TenantHelper.isEnable()) { - query.processInstanceTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricProcessInstanceQuery hisInstanceQuery(String processInstanceId) { - return hisInstanceQuery().processInstanceId(processInstanceId); - } - - public static HistoricProcessInstanceQuery hisBusinessKeyQuery(String businessKey) { - return hisInstanceQuery().processInstanceBusinessKey(businessKey); - } - - public static HistoricProcessInstanceQuery hisInstanceQuery(Set processInstanceIds) { - return hisInstanceQuery().processInstanceIds(processInstanceIds); - } - - public static HistoricActivityInstanceQuery hisActivityInstanceQuery() { - HistoricActivityInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricActivityInstanceQuery(); - if (TenantHelper.isEnable()) { - query.activityTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricActivityInstanceQuery hisActivityInstanceQuery(String processInstanceId) { - return hisActivityInstanceQuery().processInstanceId(processInstanceId); - } - - public static TaskQuery taskQuery() { - TaskQuery query = PROCESS_ENGINE.getTaskService().createTaskQuery(); - if (TenantHelper.isEnable()) { - query.taskTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static TaskQuery taskQuery(String processInstanceId) { - return taskQuery().processInstanceId(processInstanceId); - } - - public static TaskQuery taskQuery(Collection processInstanceIds) { - return taskQuery().processInstanceIdIn(processInstanceIds); - } - - /** - * 按照任务id查询当前任务 - * - * @param taskId 任务id - */ - public static TaskVo getTask(String taskId) { - Task task = PROCESS_ENGINE.getTaskService().createTaskQuery().taskId(taskId).singleResult(); - if (task == null) { - return null; - } - ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - taskVo.setBusinessKey(processInstance.getBusinessKey()); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getBusinessKey()); - taskVo.setBusinessStatus(businessStatus); - return taskVo; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index d7c44723b..85373a1a8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -2,41 +2,20 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.warm.flow.core.entity.Task; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.service.UserService; -import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.websocket.dto.WebSocketMessageDto; import org.dromara.common.websocket.utils.WebSocketUtils; -import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.MessageTypeEnum; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.ActHiTaskinst; -import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; -import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; -import org.dromara.workflow.mapper.ActHiTaskinstMapper; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowNode; -import org.flowable.common.engine.api.delegate.Expression; -import org.flowable.engine.ProcessEngine; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; -import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; -import org.flowable.identitylink.api.history.HistoricIdentityLink; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; import java.util.*; @@ -48,183 +27,6 @@ import java.util.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class); - - /** - * 创建一个新任务 - * - * @param currentTask 参数 - */ - public static TaskEntity createNewTask(Task currentTask) { - TaskEntity task = null; - if (ObjectUtil.isNotEmpty(currentTask)) { - task = (TaskEntity) PROCESS_ENGINE.getTaskService().newTask(); - task.setCategory(currentTask.getCategory()); - task.setDescription(currentTask.getDescription()); - task.setAssignee(currentTask.getAssignee()); - task.setName(currentTask.getName()); - task.setProcessDefinitionId(currentTask.getProcessDefinitionId()); - task.setProcessInstanceId(currentTask.getProcessInstanceId()); - task.setTaskDefinitionKey(currentTask.getTaskDefinitionKey()); - task.setPriority(currentTask.getPriority()); - task.setCreateTime(new Date()); - task.setTenantId(TenantHelper.getTenantId()); - PROCESS_ENGINE.getTaskService().saveTask(task); - } - if (ObjectUtil.isNotNull(task)) { - UpdateHiTaskInstCmd updateHiTaskInstCmd = new UpdateHiTaskInstCmd(Collections.singletonList(task.getId()), task.getProcessDefinitionId(), task.getProcessInstanceId()); - PROCESS_ENGINE.getManagementService().executeCommand(updateHiTaskInstCmd); - } - return task; - } - - /** - * 抄送任务 - * - * @param parentTaskList 父级任务 - * @param userIds 人员id - */ - public static void createCopyTask(List parentTaskList, List userIds) { - List list = new ArrayList<>(); - String tenantId = TenantHelper.getTenantId(); - for (Task parentTask : parentTaskList) { - for (Long userId : userIds) { - TaskEntity newTask = (TaskEntity) PROCESS_ENGINE.getTaskService().newTask(); - newTask.setParentTaskId(parentTask.getId()); - newTask.setAssignee(userId.toString()); - newTask.setName("【抄送】-" + parentTask.getName()); - newTask.setProcessDefinitionId(parentTask.getProcessDefinitionId()); - newTask.setProcessInstanceId(parentTask.getProcessInstanceId()); - newTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); - newTask.setTenantId(tenantId); - list.add(newTask); - } - } - PROCESS_ENGINE.getTaskService().bulkSaveTasks(list); - if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(parentTaskList)) { - String processInstanceId = parentTaskList.get(0).getProcessInstanceId(); - String processDefinitionId = parentTaskList.get(0).getProcessDefinitionId(); - List taskIds = StreamUtils.toList(list, Task::getId); - ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); - actHiTaskinst.setProcDefId(processDefinitionId); - actHiTaskinst.setProcInstId(processInstanceId); - actHiTaskinst.setScopeType(TaskStatusEnum.COPY.getStatus()); - actHiTaskinst.setTenantId(tenantId); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(ActHiTaskinst::getId, taskIds); - ACT_HI_TASKINST_MAPPER.update(actHiTaskinst, updateWrapper); - for (Task task : list) { - PROCESS_ENGINE.getTaskService().addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.COPY.getStatus(), StrUtil.EMPTY); - } - } - } - - /** - * 获取当前任务参与者 - * - * @param taskId 任务id - */ - public static ParticipantVo getCurrentTaskParticipant(String taskId, UserService userService) { - ParticipantVo participantVo = new ParticipantVo(); - List linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId); - Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); - if (task != null && CollUtil.isNotEmpty(linksForTask)) { - List groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); - if (CollUtil.isNotEmpty(groupList)) { - List groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId())); - List userIds = userService.selectUserIdsByRoleIds(groupIds); - if (CollUtil.isNotEmpty(userIds)) { - participantVo.setGroupIds(groupIds); - List userList = userService.selectListByIds(userIds); - if (CollUtil.isNotEmpty(userList)) { - List userIdList = StreamUtils.toList(userList, UserDTO::getUserId); - List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); - participantVo.setCandidate(userIdList); - participantVo.setCandidateName(nickNames); - participantVo.setClaim(!StringUtils.isBlank(task.getAssignee())); - } - } - } else { - List candidateList = StreamUtils.filter(linksForTask, e -> FlowConstant.CANDIDATE.equals(e.getType())); - List userIdList = new ArrayList<>(); - for (HistoricIdentityLink historicIdentityLink : linksForTask) { - try { - userIdList.add(Long.valueOf(historicIdentityLink.getUserId())); - } catch (NumberFormatException ignored) { - - } - } - List userList = userService.selectListByIds(userIdList); - if (CollUtil.isNotEmpty(userList)) { - List userIds = StreamUtils.toList(userList, UserDTO::getUserId); - List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); - participantVo.setCandidate(userIds); - participantVo.setCandidateName(nickNames); - // 判断当前任务是否具有多个办理人 - if (CollUtil.isNotEmpty(candidateList) && candidateList.size() > 1) { - // 如果 assignee 存在,则设置当前任务已经被认领 - participantVo.setClaim(StringUtils.isNotBlank(task.getAssignee())); - } - } - } - } - return participantVo; - } - - /** - * 判断当前节点是否为会签节点 - * - * @param processDefinitionId 流程定义id - * @param taskDefinitionKey 流程定义id - */ - public static MultiInstanceVo isMultiInstance(String processDefinitionId, String taskDefinitionKey) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); - MultiInstanceVo multiInstanceVo = new MultiInstanceVo(); - //判断是否为并行会签节点 - if (flowNode.getBehavior() instanceof ParallelMultiInstanceBehavior behavior && behavior.getCollectionExpression() != null) { - Expression collectionExpression = behavior.getCollectionExpression(); - String assigneeList = collectionExpression.getExpressionText(); - String assignee = behavior.getCollectionElementVariable(); - multiInstanceVo.setType(behavior); - multiInstanceVo.setAssignee(assignee); - multiInstanceVo.setAssigneeList(assigneeList); - return multiInstanceVo; - //判断是否为串行会签节点 - } else if (flowNode.getBehavior() instanceof SequentialMultiInstanceBehavior behavior && behavior.getCollectionExpression() != null) { - Expression collectionExpression = behavior.getCollectionExpression(); - String assigneeList = collectionExpression.getExpressionText(); - String assignee = behavior.getCollectionElementVariable(); - multiInstanceVo.setType(behavior); - multiInstanceVo.setAssignee(assignee); - multiInstanceVo.setAssigneeList(assigneeList); - return multiInstanceVo; - } - return null; - } - - /** - * 获取当前流程状态 - * - * @param taskId 任务id - */ - public static String getBusinessStatusByTaskId(String taskId) { - HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery().taskId(taskId).singleResult(); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(historicTaskInstance.getProcessInstanceId()).singleResult(); - return historicProcessInstance.getBusinessStatus(); - } - - /** - * 获取当前流程状态 - * - * @param businessKey 业务id - */ - public static String getBusinessStatus(String businessKey) { - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - return historicProcessInstance.getBusinessStatus(); - } - /** * 发送消息 * @@ -239,7 +41,7 @@ public class WorkflowUtils { message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。"; } for (Task t : list) { - ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId(), userService); + ParticipantVo taskParticipant = null; //= WorkflowUtils.getCurrentTaskParticipant(t.getId(), userService); if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { List userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); if (CollUtil.isNotEmpty(userIdList)) { @@ -276,20 +78,17 @@ public class WorkflowUtils { } /** - * 根据任务id查询 当前用户的任务,检查 当前人员 是否是该 taskId 的办理人 + * 当前用户所有权限 * - * @param taskId 任务id - * @return 结果 + * @return 权限列表 */ - public static Task getTaskByCurrentUser(String taskId) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(taskId).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); - + public static List permissionList() { List roles = LoginHelper.getLoginUser().getRoles(); - if (CollUtil.isNotEmpty(roles)) { - List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - taskQuery.taskCandidateGroupIn(groupIds); - } - return taskQuery.singleResult(); + Long userId = LoginHelper.getUserId(); + Long deptId = LoginHelper.getDeptId(); + List permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId()); + permissionList.add(String.valueOf(userId)); + permissionList.add("dept:" + deptId); + return permissionList; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml deleted file mode 100644 index dd0578576..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml deleted file mode 100644 index 7e73b603f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml deleted file mode 100644 index d1508abca..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml new file mode 100644 index 000000000..b285b22a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml deleted file mode 100644 index b65194f8b..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/script/bpmn/leaveFlow-serial1.xml b/script/bpmn/leaveFlow-serial1.xml new file mode 100644 index 000000000..34fedaadd --- /dev/null +++ b/script/bpmn/leaveFlow-serial1.xml @@ -0,0 +1,38 @@ + + + + + 2 + + + 3 + + + 4 + + + 5 + 2 + + + 6 + + + diff --git a/script/bpmn/模型.zip b/script/bpmn/模型.zip deleted file mode 100644 index 6f30952ab14f0b60dc64674e7eef083141856458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8543 zcmb7}bx>SUw)MNw4sOANLvR|0;0_@;37+5tC%C&?pt0cY?!i4cG;YCyG!DU?FRA+8 zn@r}_OwGRk+2XR!HOb| zTSK=ZgSIM~U~REmLAA%NVJucA2F@m2tcG^hHXLA9S8J0pZRUbv!LF#ZR7v2Z4 zCbf8m>Z;}kG`x)1967ie9q|@Gb*W&ZGqOPvT(v)7WjhQPM7COHXI?rubvZuxV0k*{ zA@Bkojb+JyU;q{qa_Dk{9cZJ2wS9I|!O8COVjRztV5d7uCq%}d`E^dwP`KT-l+Up* zrq?3s>g$_P%XtNSDY@&tleGq6INZY&lRM>FC(*X(4xrdn8?Aqnqhrp@A z3ByF(I|Qa|yqXf-tgtB)Yb{PI$Fu(acLN<_Sxr?O-lvSUs~TN^AjAn!pPDcahFl1!FJkJ?GAFo@Zk0<-*up+XwJf@MO3jow5GOrXIjjMUs3F9PN%#=JCh+x48NV8Z9OSv6d&d#jEPjtImhVDnyqj-82j3dSr^ z#d$Q641_FF!zpvBd#Yt_&gO$X!DhXMI<@YeIg~dnQWBf>>hb)<6nFUpB1j$ETg zkBqH-++QVF`;@Hi9%k0(+Sf4PrcyL^D^7MEDB8a>uCleun|xa^t3K1%wUS+n?F}j% za|Y{PvW%YBJ)?uTk|Fpj^k)U$lvkSu3=oP073k_qZVC`LP;G{R8f8*QWIB}sHbY~= z<8FO}ry4MYV0a8lc&}vT!KjV4d}>Rg@SaIYmLGX@VrB6sR+~&ZRgx+x*-3%Jq+KVC zF(*pC0?_C#zQ=fyRw5*gP5Q6Q{av)QFLd>#l)Spk>BnZbZ#cnaQN|{UMgF8S#@JIa zDTb2pQ84z;rg9LRmyRY>*?Z5iDVsG#C9SckPJLtoWp#nrjQ)s{DSJ;@RO|dI>akJ4 z>@2F9(@I>q^Z_mW8wp7aL^-quuEZGEq`AFk&x+4xRHR`+RLc(9Hux|1!6RZNT;k<% z+SRkgVY;P1JOGTl!&2q6&jHJPH}<|f@mCm*<6yDvy=27X<}Y+uIrN~G2t~!vpf*KC zbhlg~-h(3hf^&?+vgi#Pa3VOkMFVDdoaCxH!Fa5GV46_JS^4{RBE`ns0qlc zPe0;u@Q4NST@bITcFQYY{+L?Y1%>$l&Yd5Tl;x2@Kuf%F2SfmXhY$cz{;z=E)UcBs z`4`YR{{*_`{{mf*cUvNl1{D%e;2fUSK*IG5nkpL06psIat~kWwwQ`+8ES!Qbpsk_s zdR798AGPeGCN;?5lRfNpLTN82&6<)?rZ+a?y*hGm5P8R&6g@gBhNYb$u$HeE3-c}Y z2;NG8f9!f#;%&YkeMoNyeoM5JQl{U`3MRq0mczRd64PYHZ^m-j7*fT1nFUBn+a1|sTZV_?1ZX@A_^{{B5X31aW%9B@zjXr$nrwXtBDiJ ze#F8%zPw0QIp)lWsOv%SCCac-am}8iIhFLH{5P-wUi#m@=S+RqvZ7P+ff_Cu_y_` z%TAB%?XBq z$3lKEPY0O$yFJ{~20mPsY6!|`U447M=7}_h-7qlep&H)jUwnjDO|yhH@?!9kpq%O# z%$t$YM%PT>s&T~Ag@Rz>w)i`1sNgXVbQv6L0xgu8u@k=uB9bu9_kuc4_xFc$1hziS z1J@FBYfc<>AVFX0HK{~li+nQRFzD+icD_14_;m6~>WCGKOqQt1?fMm*{7ySlv-%ar zUofwzo?eQd+z(0GA10qu>L~wFi%!BGO5;#x)%k6rb?RrLRqxiwA$=T;Xp%;0;b&Cf zWH*#U573ZDRh%Ml)_cn({G6H=VX1(<9ifSfb=#6IStJNs`{T*dLNUlxEM*w&j<3!B z5|!@tF-jW(_hofbLzR+|?BShu)&fse7|$!iDI6yCI>>ZT_)5KJQMf(Vc`D^{r)-0t zWnKcw197;TTOM2jBA?uo;99$=!rR-lk4dmM_EVgS<3=T6^bA~)k$GAwiLrZ4^C;hg zv1z;CAjev0gziXh?rxQq^476(N6=Hx{WL%uhkDxlAPR=D51h70D#S16(`*lTXY#!K z=(p7V{`>L^%@m@K7_Y#!WZ$00T~ZSLY-!l`mn1B&q9;I&y-ju$2;1PqKT_ZlsrP-? zb3l?_8+Qk2>3L6xxPtfYxYv<%<}1K>M7Ktkf#;93+V$)L~L zHK8A6_1Lq4cN_6Cjo;*wU)ozzeYH`?rcB894{eqS9UzYeHCa5D+%YMmn0)($jNNrn z!bp{u!yOu0b`O(;bi3NT@fv16)xW@?<%-9spqhNIEj5jX%02wU%Ws=(m1^YFI~yU7 z=371TOmiJ+{bI8ATszWGuZ|I-Y_3$00591QPTq^H4=%851OM&=4TR)WG)_?V^U&oG zOrJm$kJMJ;Q)zdbfr+8yq+!ZvKW;!Ii8{VM2Yi(ueZJ`H%~vM94ZuhNlV7jYtNe;` zz7&Weu1QwtDKIlU9PZ=vlnX@=CY$a7hhK9Vo|+;WV+{{mi$$U#q8U0G>%%XorRHmD z2UnyT<@K9UeKP`)$hC0247X1o^BCH)cTOekae!m$AHY*lDr0q_U;Ac1#2pq340_Ja z(XI|yuzcszlHW7{NL!LtLm~4I4;X(`{4j8j?Ck?1|4rmP-_cF3Uqo&s_>;(9e_3qC zf3?_~ttqhb_Ww24-2cSlVH*-&yyZJ4qyU=@w;dByh(Db@Ah(8O+I%8ibQDUx$eAaY zN7EwZXFQcB>*qZ2)s<}B4@AI{>L~oa>35Rvc?$A%vC7&?g+}*}kYt4ZZhqvgS zwJPAaBc+S=f4#D^U9D0W=F)MVn!mIA$~l>@bQPbIwpv5^-D;{XQt3(>c?=I}4Wm0A zcp$pPos2jywNFQS#3*93`D(_d$KczpHv}zq`sGk-Sg05xxSER!{zn`XOINN?B9pnR zHzX`~5o>{p*F;N01_Np{l-!cSsb@rSPO*dx%;Q|^Oq0hLWv0Q%i$^WNvDH>dZphmIVULo0t zhGs@*bwazEGK>o|E*+mb3E1B6q?9yz$ab&6yV6y$Z#tIaq5cRFq&JjnU;?u(<1Qgc zjiBV@AZ3i)aQnx`iKdU{SjLY?AbTTVo|Va=_c>R;&doq`5rdyoG1k4m*xx5_PYgG? z2Eo*Q%ui2x}fbF4LT4BBewT1JXdREPN~^fmk3 z)eWfweSA&mK2JZNxKwm2p}khM&}wboiM&LgyII5-#J8X-tKjO2F}{d zMv?|wN7L=)u<9je8!&?-G#B}kOrqS|41c<3bEQXv6X#zvSJ3aI)AG}b0wYv&@ZiJg zLznA}B0doqL7}Nd%S5X}W8OYV2@8&%V$cWw_V%ibumQ@63=>tp!nF z?Q-mYqN#Mx=h(*d@-;AIemAKe5ouT*rvYB4#$DG(F*Qf1CN>jrWmPU~jG5Mv5EB*3})oFc9sQp}L|fI*Mr64xyL!&^;F7Iw%0+4t;Y97=VP zd$!cjx;g9YK1g!-2HAZ7>G@{#epff4PT&_3drpvBJS|`9PnXYOtauJqGD;~b)`b;r zE36@Wa1BWM{JU>~(XdVnicwVxTIc+rWrV7<$Pz%mgBo|tYzkVVZN$2(crl=CJIR6~ zotxepXT(Rq$@;_0*|IY^4|G-yYl7j8DG-3bo4PN3n?dAL(q|7-0g@i^D zk^`q|%haE7fia)a$9d-rU%wae)gMdfax!fQnEjdy=R>gQ)pRBF=RD_SFB{1_+3$jv zXQw{ioa2Hm5BtMl=r))RBm@8AAf*|Jn!tnp6!|vbuCd~9cMj9}mW(tPq+%+`wT&I? zC!FoL$QjvZSREnZL(tzYRsiL;`7R{P&W!uTbjgCKe-$0`^Z9gPBaQ4&o%!#h918mP zcAk#o>7CG~U@GzSfuQbvM`CHRW{d81>-GLf!NwJ9K4!k<_(7~OFUUv>h$IkoL!O$w z6Bvy?#^^+h?7E(Yr2HzJKv3rg9dqiQGQ#p$vRi8MF0qp#`6TYkK;yly%AZuG-xwW; zi_Zt|Aq%9;j?WSsn#1jkP(tfNgNSyX+8^(J?6Q%s3O_hr9(0_25NW@)eAslUzK`AQ)G5Xm&z9s!OQeO~za>T92IROi=v$!mkvn98XtX)<09 zPHJ%bag2=MXd|nXgQNyEbZ`FBm;vJD{un&?cyg3p5mw@1L>l6<7H*k4aOkItYA7Sb zY#Ccw%AI;-;bTi0&y5-ehwdq8G>U-xvZDEm)Ep?IkM*7``mM#T;_2KLW0W+ZX%)(q zkVf}4tneb@3K6HGhj`F|-m~+&7HWX)K^mg2Dk1G$rvX4BI6c&uR{LVll&Z zkYPB-juE~%hnAgd3J$ZJ2MC$H?XSHUuDu`^`OqrN26h06c_SnP=YtcBt9IXDii{XDNUMRnQh zQ~6J+S77%+T|%n<&*?FROl2~Im*FI3`rf>DRP<3djNCIgxmLAXLJV$rRNqtirUc1=p0v zWA8MW5Op$(E-nFzq2o*Vka|4{${cnQ6mzEzZ%Qp(ouhh(XLl-C7C@U$a`>YI_X*8ir0G={p!R ziYjTKC1yU732y&BKqbLs37)EfhSog3e=Wb33}0%_h4`Wd&G#F_z^Px&jW0F*LcCdn zhI#BV0fDLVCgzQqo!e23Pqg%UFcq9L0tiGNL?9DiVA zR8z-xLlV#XxU!15SBi+5t9TMd}9jnY?m-d^n59ZM@znVMM{6Sc7qn^I8?Vp^*;NJc`t#7%P`s?dD3b|R~4 zB9&NbA@$0$V@UwZD|4GP_seS8$ai(EcX^*NFv%>a`H);DJ&%rYP3&5>&*1^yP>fi`U`@*Hpv`8>g{q@|T>_W=bwbY>UH7!xDsApYxB{}*NVC$d9 zFdybjPq&-9xS568If4&*-e*0fXPFv4-W~Tp`t~C#lX))+&9)#bc-nzM`k!SQFrJf{ zy8U#$S*qn#3mMr?E`BcyulFRev5dnKDF-nxjhovO2JGik)e1B_2&5hcjfL z*slAvt;+li5T+f@n%NJCk#%=63i|a z^WjEQW!ZvS9IKO%2tSVu+hQ$EbT}172se6{K|e!4Oh;A*+uHkw!XgAh7=z-h)R@OB zikr(jXhb|n>48X-tJRjB#6PH!nXdO>?|iX8wRIK&DkRS0lt)JRWe0FWqUB9AmRXM9 z)zlF{)I@WvUT7#9H^rny+W4KNltl7h4)?=K&uleTg&vN3vB=)5ypU)SEPp{T3uN&U z(w(nt_m?RMC`{HHA$mKkweuv=xllSSKJ^^q%rR&EijJ^! zUg7LFP-R-@WT!4TR9oUr7O{sq+I$4m%2Zj(gZG;Rv>qoKF$In0j@V#buxX!k#@&1P zp91WLkDUnkXi*Dswv4XQVgfY!B=1*Mdqv=m0BBiFkMYF17XeB8 z26pwW7!~S2y7J3*s@WogJsWsJyg$g07}Hh+kwy=djK`{02Aj~^2j)owFk|M3nbJjrUseE6KV1})>2rZAeLw(SfmZ33#@E^ zY9Tbl)MQ`NM;`@@Bu!gUB&bs`I2Q+51Nk&R)(~RMrdv@stwcZPC$MX)_&!h(3Se#X zQS$9@Fu}&MGVVht@|a^jXm)Ot60O2FmE+MQuJu!|TrlEpa;I*g%AZzEXpDlpujiHr zcBy*YA>c9OCziCL!5LOA2=7(43_kw_6A0DQos;t;@HZ(L-`}o{{4!W9c>j)+EdM$g zZk5OU<*s=Cz+|7+u+5V6@8J-1WMnV9_iRv1O+Zw6i8}>vM=@&vTS}hBMELxKQ7ocC z41Y97N+f#)PYX}Vk5AO6AbS6;PqxGu+90+WeUH6LC_*=ww z=qJ#$hvMRLjil84N_e;=_;2l>)|9^qFPm&~c%uqAOsPMoUnPAZ-1rU3N#5j*m)ee4 zJZHCk)8MfbcsE`|&QZfsz4YikxO*m;OoAtDzOBcroP(x$S(Jy=#RW=;WIEtVK|*!l z3u>bFiZzj6E;7-3ftF>4Xm)8jX3W4Nf&8t%0690=T`(xCH+`IMmf#u=;m4npS$L#KFeT)abvvIP| z@FZ}=8+$#&rK>Ag4x3ms)wo$Jiyq-%bl;?++%svV!4Df%ud$O_<){eT!MSpY+nh|! zFq>B5A{f)MdB&vioXC?O`04Dijd=pnl1p*k?puncbD*uKtp7Z+v6R5 zG7WaM(0F3k#H@4#wL&x}{s?9%F&ym^CO$*0p5ZTT74M3tgXucIKxYVB5wft64`-_4 zDTp%S7jq2hv%rO>xIs`5E?BRyYEfyS5D1noSq7h$&A2kz74RtW|747!vB@`SvDVRE zd7ZSne1Gav{CR}l{snnXr6>_d_Zw8n4AzC`PA@OXzd0dcP%)*pOc1BmbE4DgKhKKG z3qRJ!1wTyJF+-0!gw!m$(VDP>`+9D)k$|`3y>6Sgi`UK6#nSO{Qe#@wXsbfcpr>a8 zqAg95KCX)Mb!sTMCbl^lW67pl^-9h)*UDbk(81C@_o6=>H${y6kQs?V5fJY5<4&dWqv9apd3q+fRRCnYsn_&4Kg zlJhx^*?j5GGExjSweP2nGR9^R;@AE<70e-8yumDJm*jx@jC7({A-k5gg01=EV0EK@ zqncv^ZQ&R25m|!z0z7`{vU=Q6O95`m`^1WKLD{4vlp@H@;PknHO`4E_8Ur^~M7m{N z+Go{3n32Of$$<x+UNFd` z&PDfoX~~fHL!G{{KkAan(%OY=V<|>de(mBW)wSK~;%)5dqCBl&9Gk zZm@NakhIzQwt(@o6!Dr0*B$YbWIYWK|BNNdt}ilE-~>U=VJEiqJ}sa=fB6cDuj++n zleIcKhf6GuB%X;ug{iD%uh!DOYly|Ju8PIMz@`2nVJ}0~sBhQ^0iYlWz#ct3~hdwe{Iz<*RA^5!&iYQHRT>D_wBUA4x3lJ>{tP) zfktz!Y@OE@bZ~E2ZMZ$;TMp@_k5D<9AYm!~y7Lw>JGwNa5{s*i{v)kpN2b?%8f{01 zhv)H=KJu5&kI26PUF4T_A^j`5Ga~v8XdoOO;2-DXe;%~_o`L_l{@c^?zt#T?4gXnv z;@5iqR{u{&H-D=C4j%uU?0*N3|0pBWe^LK8G34L6e_H>4UNtG!zv%wQl;CgmKilO$ ztE>HLpnv_7?f*1P{H^}yUjJ^n|0u6tyZ@K^zi+_G@`y;kKS%m?F~I= Date: Sat, 27 Jul 2024 14:00:35 +0800 Subject: [PATCH 002/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/sse/config/SseAutoConfiguration.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java index de5afa9a7..0cf8054ed 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.config; +import org.dromara.common.sse.controller.SseController; import org.dromara.common.sse.core.SseEmitterManager; import org.dromara.common.sse.listener.SseTopicListener; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -8,6 +9,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; /** + * SSE 自动装配 + * * @author Lion Li */ @AutoConfiguration @@ -25,4 +28,9 @@ public class SseAutoConfiguration { return new SseTopicListener(); } + @Bean + public SseController sseController(SseEmitterManager sseEmitterManager) { + return new SseController(sseEmitterManager); + } + } From 833db6c36f84ec4b1e15cc98717ec1453fa0d1d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jul 2024 14:00:50 +0800 Subject: [PATCH 003/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index cf9d2d0e8..ba9568c7f 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.anyline.metadata.Column; import org.anyline.metadata.Table; +import org.anyline.proxy.CacheProxy; import org.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; From 714a123a6e577407f57d5415560874dce3e38ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jul 2024 14:20:20 +0800 Subject: [PATCH 004/227] update snailjob 1.1.0 => 1.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 590ffa196..94a2601ee 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 2.2.7 4.3.1 2.14.4 - 1.1.0 + 1.1.1 1.3.6 0.2.0 1.18.32 From 80bd118964befe95a6d4694cbe68d3de064746fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jul 2024 14:22:57 +0800 Subject: [PATCH 005/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/generator/service/GenTableServiceImpl.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index ba9568c7f..4d16f713b 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -186,7 +186,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.service(dataName).metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return new ArrayList<>(); @@ -294,11 +294,9 @@ public class GenTableServiceImpl implements IGenTableService { */ @DS("#dataName") private List selectDbTableColumnsByName(String tableName, String dataName) { - Table table = ServiceProxy.metadata().table(tableName); - if (Objects.isNull(table)) { - return new ArrayList<>(); - } - LinkedHashMap columns = table.getColumns(); + // 清理anyline缓存 + CacheProxy.clear(); + LinkedHashMap columns = ServiceProxy.metadata().columns(tableName); List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { GenTableColumn tableColumn = new GenTableColumn(); From d8bac742917c1029ba29be3cc425d324214feab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jul 2024 15:09:33 +0800 Subject: [PATCH 006/227] update anyline 8.7.2-20240726 --- pom.xml | 2 +- .../config/MyBatisDataSourceMonitor.java | 81 +++++++++++++++++++ .../service/GenTableServiceImpl.java | 2 +- 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java diff --git a/pom.xml b/pom.xml index 94a2601ee..cf4846842 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240722 + 8.7.2-20240726 1.2.3 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java new file mode 100644 index 000000000..906733b08 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -0,0 +1,81 @@ +package org.dromara.generator.config; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.anyline.data.datasource.DataSourceMonitor; +import org.anyline.util.ConfigTable; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public class MyBatisDataSourceMonitor implements DataSourceMonitor { + + public MyBatisDataSourceMonitor() { + // 调整执行模式为自定义 + ConfigTable.KEEP_ADAPTER = 2; + } + + private final Map features = new HashMap<>(); + + /** + * 数据源特征 用来定准 adapter 包含数据库或JDBC协议关键字
+ * 一般会通过 产品名_url 合成 如果返回null 上层方法会通过driver_产品名_url合成 + * + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String feature(Object datasource) { + String feature = null; + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + if (ds instanceof DynamicRoutingDataSource) { + String key = DynamicDataSourceContextHolder.peek(); + feature = features.get(key); + if (null == feature) { + Connection con = null; + try { + con = DataSourceUtils.getConnection(ds); + DatabaseMetaData meta = con.getMetaData(); + String url = meta.getURL(); + feature = meta.getDatabaseProductName().toLowerCase().replace(" ", "") + "_" + url; + features.put(key, feature); + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + if (null != con && !DataSourceUtils.isConnectionTransactional(con, ds)) { + DataSourceUtils.releaseConnection(con, ds); + } + } + } + } + } + return feature; + } + + /** + * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter
+ * DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true + * + * @param datasource 数据源 + * @return boolean + */ + @Override + public boolean keepAdapter(Object datasource) { + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + return !(ds instanceof DynamicRoutingDataSource); + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 4d16f713b..23eb88986 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -186,7 +186,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap> tablesMap = ServiceProxy.service(dataName).metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return new ArrayList<>(); From a7e9c3b7041a8839307ddf0c4a948896ae63b4df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jul 2024 23:57:13 +0800 Subject: [PATCH 007/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/org/anyline/proxy/CacheProxy.java | 349 ++++++++++++++++++ .../config/MyBatisDataSourceMonitor.java | 7 + .../service/GenTableServiceImpl.java | 11 +- .../generator/service/IGenTableService.java | 9 + 5 files changed, 371 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java diff --git a/pom.xml b/pom.xml index cf4846842..e6c7664cf 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240726 + 8.7.2-20240727 1.2.3 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java new file mode 100644 index 000000000..b264fc951 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java @@ -0,0 +1,349 @@ +/* + * Copyright 2006-2023 www.anyline.org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +package org.anyline.proxy; + +import org.anyline.cache.CacheProvider; +import org.anyline.data.param.ConfigStore; +import org.anyline.data.runtime.DataRuntime; +import org.anyline.entity.OriginRow; +import org.anyline.metadata.*; +import org.anyline.metadata.graph.EdgeTable; +import org.anyline.metadata.graph.VertexTable; +import org.anyline.util.ConfigTable; +import org.anyline.util.encrypt.MD5Util; + +import java.util.LinkedHashMap; +import java.util.List; + +public class CacheProxy { + + private static final ThreadLocal thread_caches = new ThreadLocal<>(); + private static final ThreadLocal thread_names = new ThreadLocal<>(); + private static OriginRow application_caches = new OriginRow(); + private static OriginRow application_names = new OriginRow(); + public static CacheProvider provider; + public CacheProxy() {} + public static void init(CacheProvider provider) { + CacheProxy.provider = provider; + } + private static OriginRow caches(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_caches.get(); + if(null == result){ + result = new OriginRow(); + thread_caches.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_caches.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_caches = new OriginRow(); + } + result = application_caches; + } + return result; + } + private static OriginRow names(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_names.get(); + if(null == result){ + result = new OriginRow(); + thread_names.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_names.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_names = new OriginRow(); + } + result = application_names; + } + return result; + } +/* + + private static Map cache_columns = new HashMap<>(); + private static Map> cache_names = new HashMap<>(); + private static Map cache_table_maps = new HashMap<>(); + private static Map cache_view_maps = new HashMap<>(); +*/ + + + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern).append("_").append(types); + if(null != configs){ + key.append(MD5Util.crypto(configs.json()));; + } + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Table table){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + String name = table.getName(); + String catalog = table.getCatalogName(); + String schema = table.getSchemaName(); + if(null != catalog){ + key.append(catalog); + } + key.append("_"); + if(null != schema){ + key.append(schema); + } + key.append("_").append(name); + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern); + return key.toString().toUpperCase(); + } + public static String name(String key) { + return names().getString(key.toUpperCase()); + } + public static void name(String key, String origin) { + names().put(key.toUpperCase(), origin); + } + public static List tables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List masterTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List edgeTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List vertexTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static void tables(String cache, List tables){ + caches().put(cache, tables); + } + + public static List views(String cache){ + List view = (List)caches().get(cache); + return view; + } + public static void views(String cache, List view){ + caches().put(cache, view); + } + + public static void cache(String cache, Object value){ + caches().put(cache, value); + } + +/* + public static void name(DriverAdapter adapter, List tables) { + if(null != tables) { + for (Table table : tables) { + name(adapter, table.getCatalog(), table.getSchema(), table.getName(), table.getName()); + } + } + }*/ +/* + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema) { + String key = null; + String catalog_name = null; + String schema_name = null; + if(null != catalog && adapter.supportCatalog()) { + catalog_name = catalog.getName(); + } + if(null != schema && adapter.supportSchema()) { + schema_name = schema.getName(); + } + if(null != catalog_name) { + key = catalog_name; + } + if(null != schema_name) { + if(null != key) { + key += "_" + schema_name; + }else{ + key = schema_name; + } + } + if(null != key) { + key = key.toUpperCase(); + }else{ + key = "ALL"; + } + return key; + } + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema, Table table) { + String table_name = null; + if(null != table) { + table_name = table.getName(); + } + String key = key(adapter, catalog, schema); + if(null != table_name) { + if(null != key) { + key += ":" + table_name; + }else{ + key = table_name; + } + } + if(null != key) { + key = key.toUpperCase(); + } + return key; + }*//* + public static void name(DriverAdapter adapter, Catalog catalog, Schema schema, String name, String origin) { + String group_key = key(adapter, catalog, schema); + Map maps = cache_names.get(group_key); + if(null == maps) { + maps = new HashMap<>(); + cache_names.put(group_key, maps); + } + String name_key = (group_key + ":" + name).toUpperCase(); + maps.put(name_key, origin); + } + public static Map names(DriverAdapter adapter, Catalog catalog, Schema schema) { + return cache_names.get(key(adapter, catalog, schema)); + } + public static String name(DriverAdapter adapter, boolean greedy, Catalog catalog, Schema schema, String name) { + if(null == name) { + return null; + } + String group_key = key(adapter, catalog, schema); + Map maps = cache_names.get(group_key); + if(null != maps) { + String name_key = (group_key + ":" + name).toUpperCase(); + String origin = maps.get(name_key); + if(null != origin) { + return origin; + } + } + if(greedy) { + for (Map names : cache_names.values()) { + for(String item:names.keySet()) { + if(item.endsWith((":"+name).toUpperCase())) { + return names.get(item); + } + } + } + } + return null; + }*/ + /*public static String datasource(String datasource) { + if(null == datasource || "common".equalsIgnoreCase(datasource)) { + //datasource = DataSourceHolder.curDataSource(); + } + if(null == datasource) { + datasource = "default"; + } + return datasource.toUpperCase(); + } +*//* + public static String tableName(String datasource, String name) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static String viewName(String datasource, String name) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static void setTableMaps(String datasource, DataRow maps) { + cache_table_maps.put(datasource(datasource), maps); + } + public static void setViewMaps(String datasource, DataRow maps) { + cache_view_maps.put(datasource(datasource), maps); + }*/ + + + /* public static DataRow getTableMaps(String datasource) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_table_maps.put(datasource(datasource), row); + } + return row; + }*/ + + /* public static DataRow getViewMaps(String datasource) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_view_maps.put(datasource(datasource), row); + } + return row; + }*/ + + + public static LinkedHashMap columns(String key) { + return (LinkedHashMap) caches().get(key); + } + public static LinkedHashMap tags(String key) { + return (LinkedHashMap) caches().get(key); + } + + + /* public static void columns(DriverAdapter adapter, String datasource, Table table, LinkedHashMap columns) { + if(null == table) { + return; + } + String cache = ConfigTable.getString("METADATA_CACHE_KEY"); + String key = datasource(datasource) + "_COLUMNS_" + key(adapter, table.getCatalog(), table.getSchema(), table); + key = key.toUpperCase(); + if(null != provider && BasicUtil.isNotEmpty(cache) && !ConfigTable.IS_CACHE_DISABLED) { + provider.put(cache, key, columns); + }else{ + DataRow static_cache = new DataRow(); + static_cache.put("keys", columns); + cache_columns.put(key, static_cache); + } + } */ + + public static void clear() {/* + if(null != provider && !ConfigTable.IS_CACHE_DISABLED) { + String cache = ConfigTable.METADATA_CACHE_KEY; + if(BasicUtil.isNotEmpty(cache)) { + provider.clear(cache); + } + }else{ + cache_columns.clear(); + }*/ + + caches().clear(); + names().clear(); + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index 906733b08..bb0760621 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -15,6 +15,11 @@ import java.sql.DatabaseMetaData; import java.util.HashMap; import java.util.Map; +/** + * anyline 适配 动态数据源改造 + * + * @author Lion Li + */ @Slf4j @Component public class MyBatisDataSourceMonitor implements DataSourceMonitor { @@ -22,6 +27,8 @@ public class MyBatisDataSourceMonitor implements DataSourceMonitor { public MyBatisDataSourceMonitor() { // 调整执行模式为自定义 ConfigTable.KEEP_ADAPTER = 2; + // 禁用缓存 + ConfigTable.METADATA_CACHE_SCOPE = 0; } private final Map features = new HashMap<>(); diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 23eb88986..b4abc90c0 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -17,13 +17,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.anyline.metadata.Column; import org.anyline.metadata.Table; -import org.anyline.proxy.CacheProxy; import org.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.file.FileUtils; @@ -269,7 +269,7 @@ public class GenTableServiceImpl implements IGenTableService { int row = baseMapper.insert(table); if (row > 0) { // 保存列信息 - List genTableColumns = selectDbTableColumnsByName(tableName, dataName); + List genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); List saveColumns = new ArrayList<>(); for (GenTableColumn column : genTableColumns) { GenUtils.initColumnField(column, table); @@ -293,9 +293,8 @@ public class GenTableServiceImpl implements IGenTableService { * @return 列信息 */ @DS("#dataName") - private List selectDbTableColumnsByName(String tableName, String dataName) { - // 清理anyline缓存 - CacheProxy.clear(); + @Override + public List selectDbTableColumnsByName(String tableName, String dataName) { LinkedHashMap columns = ServiceProxy.metadata().columns(tableName); List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { @@ -407,7 +406,7 @@ public class GenTableServiceImpl implements IGenTableService { List tableColumns = table.getColumns(); Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); - List dbTableColumns = selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + List dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); if (CollUtil.isEmpty(dbTableColumns)) { throw new ServiceException("同步数据失败,原表结构不存在"); } diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java index 2a2fb8228..b2c20c57d 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java @@ -85,6 +85,15 @@ public interface IGenTableService { */ void importGenTable(List tableList, String dataName); + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + List selectDbTableColumnsByName(String tableName, String dataName); + /** * 预览代码 * From 4c59ba1b496ad2ec0a80727836dbca74bcd340ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 12:27:51 +0800 Subject: [PATCH 008/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=87=BA=E5=90=8E=E9=87=8D=E6=96=B0=E7=99=BB=E5=BD=95=20sse?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/controller/SseController.java | 2 ++ .../java/org/dromara/common/sse/core/SseEmitterManager.java | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index 57c7c1e82..a28c1fdcc 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.controller; +import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.stp.StpUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -26,6 +27,7 @@ public class SseController { return sseEmitterManager.connect(userId, tokenValue); } + @SaIgnore @GetMapping(value = "${sse.path}/close") public R close() { String tokenValue = StpUtil.getTokenValue(); diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 276df102d..0f096fac5 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -73,7 +73,6 @@ public class SseEmitterManager { try { entry.getValue().send(SseEmitter.event() .name("message") - .reconnectTime(-1L) .data(message)); } catch (Exception e) { emitters.remove(entry.getKey()); From 9c2c060fec84176c8cf4e5e5602679046d6bb93b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 12:44:45 +0800 Subject: [PATCH 009/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=20=E5=A2=9E=E5=8A=A0token?= =?UTF-8?q?=E6=9C=89=E6=95=88=E6=9C=9F=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 0f096fac5..91dd71dbb 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.core; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; @@ -71,6 +72,11 @@ public class SseEmitterManager { if (emitters != null) { for (Map.Entry entry : emitters.entrySet()) { try { + // token 无效或已过期 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(entry.getKey()) < -1) { + emitters.remove(entry.getKey()); + continue; + } entry.getValue().send(SseEmitter.event() .name("message") .data(message)); From 6b0d0d5520263448aba058a2172bca29c4625eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 14:33:54 +0800 Subject: [PATCH 010/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96oss=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysOssServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java index d167e8dcc..186653182 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java @@ -77,8 +77,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService { @Override public List listByIds(Collection ossIds) { List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); for (Long id : ossIds) { - SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + SysOssVo vo = ossService.getById(id); if (ObjectUtil.isNotNull(vo)) { try { list.add(this.matchingUrl(vo)); @@ -100,8 +101,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService { @Override public String selectUrlByIds(String ossIds) { List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { - SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + SysOssVo vo = ossService.getById(id); if (ObjectUtil.isNotNull(vo)) { try { list.add(this.matchingUrl(vo).getUrl()); From a2df7030314828e359d88144da3ca7b209d92cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 15:04:54 +0800 Subject: [PATCH 011/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E8=84=B1=E6=95=8F=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sensitive/core/SensitiveStrategy.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 9d1978a14..6de52c0e0 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -37,7 +37,52 @@ public enum SensitiveStrategy { /** * 银行卡 */ - BANK_CARD(DesensitizedUtil::bankCard); + BANK_CARD(DesensitizedUtil::bankCard), + + /** + * 中文名 + */ + CHINESE_NAME(DesensitizedUtil::chineseName), + + /** + * 固定电话 + */ + FIXED_PHONE(DesensitizedUtil::fixedPhone), + + /** + * 用户ID + */ + user_ID(s -> String.valueOf(DesensitizedUtil.userId())), + + /** + * ipv4 + */ + IPV4(DesensitizedUtil::ipv4), + + /** + * ipv6 + */ + IPV6(DesensitizedUtil::ipv6), + + /** + * 中国大陆车牌,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense), + + /** + * 只显示第一个字符 + */ + FIRST_MASK(DesensitizedUtil::firstMask), + + /** + * 清空为null + */ + CLEAR(s -> DesensitizedUtil.clear()), + + /** + * 清空为"" + */ + CLEAR_TO_NULL(s -> DesensitizedUtil.clearToNull()); //可自行添加其他脱敏策略 From c92dda2af6d6fcf3e074733089391cfe2f25fa1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 15:18:23 +0800 Subject: [PATCH 012/227] =?UTF-8?q?update=20=E8=84=B1=E6=95=8F=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=BC=98=E5=8C=96=E5=A2=9E=E5=8A=A0=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/sensitive/core/SensitiveStrategy.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 6de52c0e0..995dcbd96 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -52,7 +52,12 @@ public enum SensitiveStrategy { /** * 用户ID */ - user_ID(s -> String.valueOf(DesensitizedUtil.userId())), + USER_ID(s -> String.valueOf(DesensitizedUtil.userId())), + + /** + * 密码 + */ + PASSWORD(DesensitizedUtil::password), /** * ipv4 From 1df0a2cf2bb2a4a83966b9c2688fe11b7b82a51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 29 Jul 2024 17:47:01 +0800 Subject: [PATCH 013/227] update anyline 8.7.2-20240728 --- pom.xml | 2 +- .../java/org/anyline/proxy/CacheProxy.java | 349 ------------------ 2 files changed, 1 insertion(+), 350 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java diff --git a/pom.xml b/pom.xml index e6c7664cf..d948e6c5c 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240727 + 8.7.2-20240728 1.2.3 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java deleted file mode 100644 index b264fc951..000000000 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright 2006-2023 www.anyline.org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -package org.anyline.proxy; - -import org.anyline.cache.CacheProvider; -import org.anyline.data.param.ConfigStore; -import org.anyline.data.runtime.DataRuntime; -import org.anyline.entity.OriginRow; -import org.anyline.metadata.*; -import org.anyline.metadata.graph.EdgeTable; -import org.anyline.metadata.graph.VertexTable; -import org.anyline.util.ConfigTable; -import org.anyline.util.encrypt.MD5Util; - -import java.util.LinkedHashMap; -import java.util.List; - -public class CacheProxy { - - private static final ThreadLocal thread_caches = new ThreadLocal<>(); - private static final ThreadLocal thread_names = new ThreadLocal<>(); - private static OriginRow application_caches = new OriginRow(); - private static OriginRow application_names = new OriginRow(); - public static CacheProvider provider; - public CacheProxy() {} - public static void init(CacheProvider provider) { - CacheProxy.provider = provider; - } - private static OriginRow caches(){ - OriginRow result = new OriginRow(); - if(ConfigTable.METADATA_CACHE_SCOPE == 1){ - result = thread_caches.get(); - if(null == result){ - result = new OriginRow(); - thread_caches.set(result); - } - }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ - if(application_caches.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ - application_caches = new OriginRow(); - } - result = application_caches; - } - return result; - } - private static OriginRow names(){ - OriginRow result = new OriginRow(); - if(ConfigTable.METADATA_CACHE_SCOPE == 1){ - result = thread_names.get(); - if(null == result){ - result = new OriginRow(); - thread_names.set(result); - } - }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ - if(application_names.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ - application_names = new OriginRow(); - } - result = application_names; - } - return result; - } -/* - - private static Map cache_columns = new HashMap<>(); - private static Map> cache_names = new HashMap<>(); - private static Map cache_table_maps = new HashMap<>(); - private static Map cache_view_maps = new HashMap<>(); -*/ - - - public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - if(null != catalog){ - key.append(catalog.getName()); - } - key.append("_"); - if(null != schema){ - key.append(schema.getName()); - } - key.append("_").append(pattern).append("_").append(types); - if(null != configs){ - key.append(MD5Util.crypto(configs.json()));; - } - return key.toString().toUpperCase(); - } - public static String key(DataRuntime runtime, String flag, boolean greedy, Table table){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - String name = table.getName(); - String catalog = table.getCatalogName(); - String schema = table.getSchemaName(); - if(null != catalog){ - key.append(catalog); - } - key.append("_"); - if(null != schema){ - key.append(schema); - } - key.append("_").append(name); - return key.toString().toUpperCase(); - } - public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - if(null != catalog){ - key.append(catalog.getName()); - } - key.append("_"); - if(null != schema){ - key.append(schema.getName()); - } - key.append("_").append(pattern); - return key.toString().toUpperCase(); - } - public static String name(String key) { - return names().getString(key.toUpperCase()); - } - public static void name(String key, String origin) { - names().put(key.toUpperCase(), origin); - } - public static List tables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List masterTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List edgeTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List vertexTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static void tables(String cache, List tables){ - caches().put(cache, tables); - } - - public static List views(String cache){ - List view = (List)caches().get(cache); - return view; - } - public static void views(String cache, List view){ - caches().put(cache, view); - } - - public static void cache(String cache, Object value){ - caches().put(cache, value); - } - -/* - public static void name(DriverAdapter adapter, List tables) { - if(null != tables) { - for (Table table : tables) { - name(adapter, table.getCatalog(), table.getSchema(), table.getName(), table.getName()); - } - } - }*/ -/* - private static String key(DriverAdapter adapter, Catalog catalog, Schema schema) { - String key = null; - String catalog_name = null; - String schema_name = null; - if(null != catalog && adapter.supportCatalog()) { - catalog_name = catalog.getName(); - } - if(null != schema && adapter.supportSchema()) { - schema_name = schema.getName(); - } - if(null != catalog_name) { - key = catalog_name; - } - if(null != schema_name) { - if(null != key) { - key += "_" + schema_name; - }else{ - key = schema_name; - } - } - if(null != key) { - key = key.toUpperCase(); - }else{ - key = "ALL"; - } - return key; - } - private static String key(DriverAdapter adapter, Catalog catalog, Schema schema, Table table) { - String table_name = null; - if(null != table) { - table_name = table.getName(); - } - String key = key(adapter, catalog, schema); - if(null != table_name) { - if(null != key) { - key += ":" + table_name; - }else{ - key = table_name; - } - } - if(null != key) { - key = key.toUpperCase(); - } - return key; - }*//* - public static void name(DriverAdapter adapter, Catalog catalog, Schema schema, String name, String origin) { - String group_key = key(adapter, catalog, schema); - Map maps = cache_names.get(group_key); - if(null == maps) { - maps = new HashMap<>(); - cache_names.put(group_key, maps); - } - String name_key = (group_key + ":" + name).toUpperCase(); - maps.put(name_key, origin); - } - public static Map names(DriverAdapter adapter, Catalog catalog, Schema schema) { - return cache_names.get(key(adapter, catalog, schema)); - } - public static String name(DriverAdapter adapter, boolean greedy, Catalog catalog, Schema schema, String name) { - if(null == name) { - return null; - } - String group_key = key(adapter, catalog, schema); - Map maps = cache_names.get(group_key); - if(null != maps) { - String name_key = (group_key + ":" + name).toUpperCase(); - String origin = maps.get(name_key); - if(null != origin) { - return origin; - } - } - if(greedy) { - for (Map names : cache_names.values()) { - for(String item:names.keySet()) { - if(item.endsWith((":"+name).toUpperCase())) { - return names.get(item); - } - } - } - } - return null; - }*/ - /*public static String datasource(String datasource) { - if(null == datasource || "common".equalsIgnoreCase(datasource)) { - //datasource = DataSourceHolder.curDataSource(); - } - if(null == datasource) { - datasource = "default"; - } - return datasource.toUpperCase(); - } -*//* - public static String tableName(String datasource, String name) { - DataRow row = cache_table_maps.get(datasource(datasource)); - if(null != row) { - return row.getString(name); - } - return name; - } - public static String viewName(String datasource, String name) { - DataRow row = cache_view_maps.get(datasource(datasource)); - if(null != row) { - return row.getString(name); - } - return name; - } - public static void setTableMaps(String datasource, DataRow maps) { - cache_table_maps.put(datasource(datasource), maps); - } - public static void setViewMaps(String datasource, DataRow maps) { - cache_view_maps.put(datasource(datasource), maps); - }*/ - - - /* public static DataRow getTableMaps(String datasource) { - DataRow row = cache_table_maps.get(datasource(datasource)); - if(null == row) { - row = new DataRow(); - cache_table_maps.put(datasource(datasource), row); - } - return row; - }*/ - - /* public static DataRow getViewMaps(String datasource) { - DataRow row = cache_view_maps.get(datasource(datasource)); - if(null == row) { - row = new DataRow(); - cache_view_maps.put(datasource(datasource), row); - } - return row; - }*/ - - - public static LinkedHashMap columns(String key) { - return (LinkedHashMap) caches().get(key); - } - public static LinkedHashMap tags(String key) { - return (LinkedHashMap) caches().get(key); - } - - - /* public static void columns(DriverAdapter adapter, String datasource, Table table, LinkedHashMap columns) { - if(null == table) { - return; - } - String cache = ConfigTable.getString("METADATA_CACHE_KEY"); - String key = datasource(datasource) + "_COLUMNS_" + key(adapter, table.getCatalog(), table.getSchema(), table); - key = key.toUpperCase(); - if(null != provider && BasicUtil.isNotEmpty(cache) && !ConfigTable.IS_CACHE_DISABLED) { - provider.put(cache, key, columns); - }else{ - DataRow static_cache = new DataRow(); - static_cache.put("keys", columns); - cache_columns.put(key, static_cache); - } - } */ - - public static void clear() {/* - if(null != provider && !ConfigTable.IS_CACHE_DISABLED) { - String cache = ConfigTable.METADATA_CACHE_KEY; - if(BasicUtil.isNotEmpty(cache)) { - provider.clear(cache); - } - }else{ - cache_columns.clear(); - }*/ - - caches().clear(); - names().clear(); - } - -} From 609dcf8426960915d1e41176aff2f699897b9429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 31 Jul 2024 09:48:05 +0800 Subject: [PATCH 014/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=80=82?= =?UTF-8?q?=E9=85=8D=20anyline=20=E6=96=B0=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MyBatisDataSourceMonitor.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index bb0760621..8c0f352fa 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -4,6 +4,7 @@ import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import lombok.extern.slf4j.Slf4j; import org.anyline.data.datasource.DataSourceMonitor; +import org.anyline.data.runtime.DataRuntime; import org.anyline.util.ConfigTable; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceUtils; @@ -41,7 +42,7 @@ public class MyBatisDataSourceMonitor implements DataSourceMonitor { * @return String 返回null由上层自动提取 */ @Override - public String feature(Object datasource) { + public String feature(DataRuntime runtime, Object datasource) { String feature = null; if (datasource instanceof JdbcTemplate jdbc) { DataSource ds = jdbc.getDataSource(); @@ -69,6 +70,22 @@ public class MyBatisDataSourceMonitor implements DataSourceMonitor { return feature; } + /** + * 数据源唯一标识 如果不实现则默认feature + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String key(DataRuntime runtime, Object datasource) { + if(datasource instanceof JdbcTemplate jdbc){ + DataSource ds = jdbc.getDataSource(); + if(ds instanceof DynamicRoutingDataSource){ + return DynamicDataSourceContextHolder.peek(); + } + } + return runtime.getKey(); + } + /** * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter
* DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true @@ -77,7 +94,7 @@ public class MyBatisDataSourceMonitor implements DataSourceMonitor { * @return boolean */ @Override - public boolean keepAdapter(Object datasource) { + public boolean keepAdapter(DataRuntime runtime, Object datasource) { if (datasource instanceof JdbcTemplate jdbc) { DataSource ds = jdbc.getDataSource(); return !(ds instanceof DynamicRoutingDataSource); From 072d66076330cf8e96d8f5c3f55babd0e2879e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 31 Jul 2024 13:02:33 +0800 Subject: [PATCH 015/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E9=94=99=E8=AF=AF=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A1=A8=E5=90=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index b4abc90c0..e1e340ff1 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -143,7 +143,7 @@ public class GenTableServiceImpl implements IGenTableService { if (CollUtil.isEmpty(tableNames)) { return true; } - return !StringUtils.containsAnyIgnoreCase(x.getName(), tableArrays); + return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays); }) .filter(x -> { boolean nameMatches = true; From c66b7098bbbd2d3e9331ba0e8da2bbf2d3872acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 31 Jul 2024 17:09:16 +0800 Subject: [PATCH 016/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BD=BF=E7=94=A8=E7=8B=AC=E7=AB=8Bweb=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 91194c61b..77c9eb71a 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -12,10 +12,21 @@ ruoyi-monitor-admin - + org.springframework.boot spring-boot-starter-web + + + spring-boot-starter-tomcat + org.springframework.boot + + + + + + org.springframework.boot + spring-boot-starter-undertow From b0d1a7a7a63595cd012a828269ff9b643f21ec30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Thu, 1 Aug 2024 14:55:43 +0800 Subject: [PATCH 017/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E8=BF=9E=E6=8E=A5=E5=90=84=E7=A7=8D=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 91dd71dbb..aa7960c24 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -46,7 +46,7 @@ public class SseEmitterManager { if (emitters != null) { try { emitters.get(token).send(SseEmitter.event().comment("disconnected")); - } catch (IOException ignore) { + } catch (Exception ignore) { } emitters.remove(token); } From c90e84faa628923158aa2233794798c3b8ab10ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Thu, 1 Aug 2024 23:20:29 +0800 Subject: [PATCH 018/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=94=99=E8=AF=AF=E9=94=81=E5=AE=9A=E4=B8=8D=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E7=A7=9F=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/web/service/SysLoginService.java | 20 +++++------ .../web/service/impl/EmailAuthStrategy.java | 36 +++++++++---------- .../service/impl/PasswordAuthStrategy.java | 33 +++++++++-------- .../web/service/impl/SmsAuthStrategy.java | 36 +++++++++---------- .../web/service/impl/SocialAuthStrategy.java | 32 ++++++++--------- .../common/core/constant/CacheConstants.java | 5 +++ .../common/core/constant/GlobalConstants.java | 5 --- .../monitor/SysLogininforController.java | 8 ++--- 8 files changed, 80 insertions(+), 95 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index af6e7f557..52803663c 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -4,13 +4,14 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; import com.baomidou.lock.annotation.Lock4j; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; @@ -155,16 +156,11 @@ public class SysLoginService { loginUser.setUserType(user.getUserType()); loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); - TenantHelper.dynamic(user.getTenantId(), () -> { - SysDeptVo dept = null; - if (ObjectUtil.isNotNull(user.getDeptId())) { - dept = deptService.selectDeptById(user.getDeptId()); - } - loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName()); - loginUser.setDeptCategory(ObjectUtil.isNull(dept) ? "" : dept.getDeptCategory()); - List roles = roleService.selectRolesByUserId(user.getUserId()); - loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); - }); + Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); + loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); + loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + List roles = roleService.selectRolesByUserId(user.getUserId()); + loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); return loginUser; } @@ -186,7 +182,7 @@ public class SysLoginService { * 登录校验 */ public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { - String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; + String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; String loginFail = Constants.LOGIN_FAIL; // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index 38fdc448b..b5a24976e 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -21,7 +21,6 @@ import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; @@ -51,13 +50,12 @@ public class EmailAuthStrategy implements IAuthStrategy { String tenantId = loginBody.getTenantId(); String email = loginBody.getEmail(); String emailCode = loginBody.getEmailCode(); - - // 通过邮箱查找用户 - SysUserVo user = loadUserByEmail(tenantId, email); - - loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByEmail(email); + loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -89,18 +87,16 @@ public class EmailAuthStrategy implements IAuthStrategy { return code.equals(emailCode); } - private SysUserVo loadUserByEmail(String tenantId, String email) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", email); - throw new UserException("user.not.exists", email); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", email); - throw new UserException("user.blocked", email); - } - return user; - }); + private SysUserVo loadUserByEmail(String email) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", email); + throw new UserException("user.not.exists", email); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", email); + throw new UserException("user.blocked", email); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index 5d3ebd755..f28024f35 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -62,11 +62,12 @@ public class PasswordAuthStrategy implements IAuthStrategy { if (captchaEnabled) { validateCaptcha(tenantId, username, code, uuid); } - - SysUserVo user = loadUserByUsername(tenantId, username); - loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); - // 此处可根据登录用户的数据不同 自行创建 loginUser - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByUsername(username); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -107,18 +108,16 @@ public class PasswordAuthStrategy implements IAuthStrategy { } } - private SysUserVo loadUserByUsername(String tenantId, String username) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", username); - throw new UserException("user.not.exists", username); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", username); - throw new UserException("user.blocked", username); - } - return user; - }); + private SysUserVo loadUserByUsername(String username) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index f883632f9..89f846244 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -21,7 +21,6 @@ import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; @@ -51,13 +50,12 @@ public class SmsAuthStrategy implements IAuthStrategy { String tenantId = loginBody.getTenantId(); String phonenumber = loginBody.getPhonenumber(); String smsCode = loginBody.getSmsCode(); - - // 通过手机号查找用户 - SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber); - - loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByPhonenumber(phonenumber); + loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -89,18 +87,16 @@ public class SmsAuthStrategy implements IAuthStrategy { return code.equals(smsCode); } - private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", phonenumber); - throw new UserException("user.not.exists", phonenumber); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", phonenumber); - throw new UserException("user.blocked", phonenumber); - } - return user; - }); + private SysUserVo loadUserByPhonenumber(String phonenumber) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", phonenumber); + throw new UserException("user.not.exists", phonenumber); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", phonenumber); + throw new UserException("user.blocked", phonenumber); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index 01db20027..84630260f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -92,11 +92,11 @@ public class SocialAuthStrategy implements IAuthStrategy { } else { social = list.get(0); } - // 查找用户 - SysUserVo user = loadUser(social.getTenantId(), social.getUserId()); - - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { + SysUserVo user = loadUser(social.getUserId()); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -116,18 +116,16 @@ public class SocialAuthStrategy implements IAuthStrategy { return loginVo; } - private SysUserVo loadUser(String tenantId, Long userId) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoById(userId); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", ""); - throw new UserException("user.not.exists", ""); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", ""); - throw new UserException("user.blocked", ""); - } - return user; - }); + private SysUserVo loadUser(Long userId) { + SysUserVo user = userMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", ""); + throw new UserException("user.not.exists", ""); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", ""); + throw new UserException("user.blocked", ""); + } + return user; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java index 67bc8e4c2..ceb837044 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java @@ -22,4 +22,9 @@ public interface CacheConstants { */ String SYS_DICT_KEY = "sys_dict:"; + /** + * 登录账户密码错误次数 redis key + */ + String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index ae9bc2e62..5352b118f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -27,11 +27,6 @@ public interface GlobalConstants { */ String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:"; - /** - * 登录账户密码错误次数 redis key - */ - String PWD_ERR_CNT_KEY = GLOBAL_REDIS_KEY + "pwd_err_cnt:"; - /** * 三方认证 redis key */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 18e32d8c6..98ac2d58f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -1,7 +1,9 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.common.core.constant.GlobalConstants; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; @@ -13,8 +15,6 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysLogininforBo; import org.dromara.system.domain.vo.SysLogininforVo; import org.dromara.system.service.ISysLogininforService; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -79,7 +79,7 @@ public class SysLogininforController extends BaseController { @Log(title = "账户解锁", businessType = BusinessType.OTHER) @GetMapping("/unlock/{userName}") public R unlock(@PathVariable("userName") String userName) { - String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName; + String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; if (RedisUtils.hasKey(loginName)) { RedisUtils.deleteObject(loginName); } From 68886a5f89ca23f158c39566ef613b56212c5861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 2 Aug 2024 00:55:11 +0800 Subject: [PATCH 019/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E7=BD=91=E7=BB=9C=E4=B8=AD=E6=96=ADio?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/core/SseEmitterManager.java | 6 ------ .../web/handler/GlobalExceptionHandler.java | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index aa7960c24..039e17f4e 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,6 +1,5 @@ package org.dromara.common.sse.core; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; @@ -72,11 +71,6 @@ public class SseEmitterManager { if (emitters != null) { for (Map.Entry entry : emitters.entrySet()) { try { - // token 无效或已过期 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(entry.getKey()) < -1) { - emitters.remove(entry.getKey()); - continue; - } entry.getValue().send(SseEmitter.event() .name("message") .data(message)); diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index bd47c189d..061d3aa45 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -16,10 +16,13 @@ import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; +import java.io.IOException; + /** * 全局异常处理器 * @@ -89,6 +92,20 @@ public class GlobalExceptionHandler { return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); } + /** + * 拦截未知的运行时异常 + */ + @ResponseStatus(org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(IOException.class) + public void handleRuntimeException(IOException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + if (requestURI.contains("sse")) { + // sse 经常性连接中断 例如关闭浏览器 直接屏蔽 + return; + } + log.error("请求地址'{}',连接中断", requestURI, e); + } + /** * 拦截未知的运行时异常 */ From 3e426aa194d11c6d561c93f7f80d32704c74ac36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 2 Aug 2024 00:55:42 +0800 Subject: [PATCH 020/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=87=BA=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E7=A7=9F=E6=88=B7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/listener/UserActionListener.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index a4724043b..07595e092 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -3,6 +3,8 @@ package org.dromara.web.listener; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import lombok.RequiredArgsConstructor; @@ -81,7 +83,10 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doLogout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); } @@ -90,7 +95,10 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doKickout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); } @@ -99,7 +107,10 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); } From 333db7ea78d4ff38810503b6850cfa3f193d7e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 2 Aug 2024 10:07:47 +0800 Subject: [PATCH 021/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=A0=E9=99=A4=E6=A0=87=E5=BF=97=E4=BD=8D=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E4=BC=98=E5=8C=96=E6=9F=A5=E8=AF=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/constant/UserConstants.java | 10 ++++++++++ .../system/service/impl/SysDeptServiceImpl.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java index 6f3b0b96b..76f6dd4ad 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java @@ -67,6 +67,16 @@ public interface UserConstants { */ String DICT_NORMAL = "0"; + /** + * 通用存在标志 + */ + String DEL_FLAG_NORMAL = "0"; + + /** + * 通用删除标志 + */ + String DEL_FLAG_REMOVED = "2"; + /** * 是否为系统默认(是) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 505403642..160238df3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -78,7 +78,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(SysDept::getDelFlag, "0"); + lqw.eq(SysDept::getDelFlag, UserConstants.DEL_FLAG_NORMAL); lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); From 5bcdea061f34772373bc0b0f3884efe5762a4f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 2 Aug 2024 11:37:21 +0800 Subject: [PATCH 022/227] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ad9c2cee7..71895dc3f 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
| 数据库连接池 | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下 | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般 | | 数据库主键 | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁 | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一 | | WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物 | 无 | +| SSE推送 | 采用 Spring SSE 实现 扩展了Token鉴权与分布式会话同步 | 无 | | 序列化 | 采用 Jackson Spring官方内置序列化 靠谱!!! | 采用 fastjson bugjson 远近闻名 | | 分布式幂等 | 参考美团GTIS防重系统简化实现(细节可看文档) | 手动编写注解基于aop实现 | | 分布式锁 | 采用 Lock4j 底层基于 Redisson | 无 | @@ -72,6 +73,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
| 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释
只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 | | 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 | | Excel框架 | 采用 Alibaba EasyExcel 基于插件化
框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 | +| 工作流支持 | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能 | 无 | | 工具类框架 | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码 | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等 | | 监控框架 | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制
实时监控服务状态 框架还为其扩展了在线日志查看监控 | 无 | | 链路追踪 | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗
用了它即可实时查看请求经过的每一处每一个节点 | 无 | From acc4499e3f6b84f400486a013bfd35da7a48219d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 2 Aug 2024 17:09:46 +0800 Subject: [PATCH 023/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=9D=83=E9=99=90=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index c38d0d055..6fbeab56d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -26,10 +26,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.SysUserPost; -import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.domain.vo.SysRoleVo; @@ -473,17 +470,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { if (ArrayUtil.isNotEmpty(roleIds)) { - // 判断是否具有此角色的操作权限 - List roles = roleMapper.selectRoleList(new LambdaQueryWrapper<>()); - if (CollUtil.isEmpty(roles)) { - throw new ServiceException("没有权限访问角色的数据"); - } - List roleList = StreamUtils.toList(roles, SysRoleVo::getRoleId); + List roleList = new ArrayList<>(List.of(roleIds)); if (!LoginHelper.isSuperAdmin(userId)) { roleList.remove(UserConstants.SUPER_ADMIN_ID); } - List canDoRoleList = StreamUtils.filter(List.of(roleIds), roleList::contains); - if (CollUtil.isEmpty(canDoRoleList)) { + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList( + new QueryWrapper().in("r.role_id", roleList)); + if (CollUtil.isEmpty(roles)) { throw new ServiceException("没有权限访问角色的数据"); } if (clear) { @@ -491,7 +485,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); } // 新增用户与角色管理 - List list = StreamUtils.toList(canDoRoleList, roleId -> { + List list = StreamUtils.toList(roleList, roleId -> { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); From 838a1ef43ad84d22dbf2f5e60dcf4251095ef65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 4 Aug 2024 10:40:12 +0800 Subject: [PATCH 024/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=B8=80?= =?UTF-8?q?=E7=BA=A7=E7=BC=93=E5=AD=98key=E6=9C=AA=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/redis/manager/CaffeineCacheDecorator.java | 8 +++++--- .../common/redis/manager/PlusSpringCacheManager.java | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java index ee1d405f2..793e21f5c 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java @@ -15,15 +15,17 @@ public class CaffeineCacheDecorator implements Cache { private static final com.github.benmanes.caffeine.cache.Cache CAFFEINE = SpringUtils.getBean("caffeine"); + private final String name; private final Cache cache; - public CaffeineCacheDecorator(Cache cache) { + public CaffeineCacheDecorator(String name, Cache cache) { + this.name = name; this.cache = cache; } @Override public String getName() { - return cache.getName(); + return name; } @Override @@ -32,7 +34,7 @@ public class CaffeineCacheDecorator implements Cache { } public String getUniqueKey(Object key) { - return cache.getName() + ":" + key; + return name + ":" + key; } @Override diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index a48cb1422..740e2a13b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -156,7 +156,7 @@ public class PlusSpringCacheManager implements CacheManager { private Cache createMap(String name, CacheConfig config) { RMap map = RedisUtils.getClient().getMap(name); - Cache cache = new CaffeineCacheDecorator(new RedissonCache(map, allowNullValues)); + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } @@ -170,7 +170,7 @@ public class PlusSpringCacheManager implements CacheManager { private Cache createMapCache(String name, CacheConfig config) { RMapCache map = RedisUtils.getClient().getMapCache(name); - Cache cache = new CaffeineCacheDecorator(new RedissonCache(map, config, allowNullValues)); + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, config, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } From 36ea21128f63c1a515a1df100bef7fe1f392006b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 4 Aug 2024 10:45:25 +0800 Subject: [PATCH 025/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20TenantSpr?= =?UTF-8?q?ingCacheManager=20=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/tenant/manager/TenantSpringCacheManager.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java index d230afc1a..346e36f1c 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java @@ -1,5 +1,7 @@ package org.dromara.common.tenant.manager; +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.manager.PlusSpringCacheManager; @@ -11,6 +13,7 @@ import org.springframework.cache.Cache; * * @author Lion Li */ +@Slf4j public class TenantSpringCacheManager extends PlusSpringCacheManager { public TenantSpringCacheManager() { @@ -18,10 +21,16 @@ public class TenantSpringCacheManager extends PlusSpringCacheManager { @Override public Cache getCache(String name) { + if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { + return super.getCache(name); + } if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { return super.getCache(name); } String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.error("无法获取有效的租户id -> Null"); + } if (StringUtils.startsWith(name, tenantId)) { // 如果存在则直接返回 return super.getCache(name); From 019516318143996bb3a03aff971146b691f153b8 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 17 Aug 2024 11:18:53 +0800 Subject: [PATCH 026/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 19 ++++++++++++----- .../service/IFlwDefinitionService.java | 9 ++++++++ .../impl/FlwDefinitionServiceImpl.java | 21 +++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 74b9c9891..d71900ec5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -46,6 +46,16 @@ public class FlwDefinitionController extends BaseController { return iFlwDefinitionService.page(flowDefinition, pageQuery); } + /** + * 获取历史流程定义列表 + * + * @param flowCode 参数 + */ + @GetMapping("/getHisListByKey/{flowCode}") + public R> getHisListByKey(@PathVariable String flowCode) { + return R.ok(iFlwDefinitionService.getHisListByKey(flowCode)); + } + /** * 获取流程定义详细信息 * @@ -86,7 +96,7 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id */ @Log(title = "流程定义", businessType = BusinessType.INSERT) - @GetMapping("/publish/{id}") + @PutMapping("/publish/{id}") @Transactional(rollbackFor = Exception.class) public R publish(@PathVariable Long id) { return R.ok(defService.publish(id)); @@ -98,11 +108,10 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id */ @Log(title = "流程定义", businessType = BusinessType.INSERT) - @GetMapping("/unPublish/{id}") + @PutMapping("/unPublish/{id}") @Transactional(rollbackFor = Exception.class) - public R unPublish(@PathVariable Long id) { - defService.unPublish(id); - return R.ok(); + public R unPublish(@PathVariable Long id) { + return R.ok(defService.unPublish(id)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index eebab213a..01b82f0b0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import java.io.IOException; +import java.util.List; /** * 流程定义 服务层 @@ -24,6 +25,14 @@ public interface IFlwDefinitionService { */ TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery); + /** + * 获取历史流程定义列表 + * + * @param flowCode 参数 + * @return 返回列表 + */ + List getHisListByKey(String flowCode); + /** * 导出流程定义 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index a0d1cf30e..1cc3b45d6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -1,10 +1,13 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.warm.flow.core.entity.Definition; +import com.warm.flow.core.enums.PublishStatus; import com.warm.flow.core.service.DefService; import com.warm.flow.core.utils.page.Page; import com.warm.flow.orm.entity.FlowDefinition; +import com.warm.flow.orm.mapper.FlowDefinitionMapper; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,6 +21,8 @@ import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.stereotype.Service; import java.io.IOException; +import java.util.Arrays; +import java.util.List; /** * 流程定义 服务层实现 @@ -30,6 +35,8 @@ import java.io.IOException; public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final DefService defService; + private final FlowDefinitionMapper flowDefinitionMapper; + /** * 分页查询 * @@ -46,6 +53,20 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { return build; } + /** + * 获取历史流程定义列表 + * + * @param flowCode 参数 + */ + @Override + public List getHisListByKey(String flowCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(FlowDefinition::getFlowCode, flowCode); + wrapper.in(FlowDefinition::getIsPublish, Arrays.asList(PublishStatus.UNPUBLISHED.getKey(), PublishStatus.EXPIRED.getKey())); + List list = flowDefinitionMapper.selectList(wrapper); + return BeanUtil.copyToList(list, FlowDefinitionVo.class); + } + /** * 导出流程定义 * From 3adf9180677b33916de30719a1c5a69f3ab8ecc7 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 23 Aug 2024 21:37:53 +0800 Subject: [PATCH 027/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=BF=80=E6=B4=BB/=E6=8C=82=E8=B5=B7=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20=E5=8D=87=E7=BA=A7warm-flow=E5=88=B01.2.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../controller/FlwDefinitionController.java | 15 +++++++++++++++ .../controller/FlwInstanceController.java | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a94677676..4ba306848 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 8.7.2-20240808 - 1.2.3 + 1.2.4 3.2.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index d71900ec5..c3e4b6459 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -184,4 +184,19 @@ public class FlwDefinitionController extends BaseController { return R.ok(defService.flowChart(instanceId)); } + /** + * 激活/挂起流程定义 + * + * @param id 流程定义id + * @param active 激活/挂起 + */ + @PutMapping("/updateDefinitionState/{id}/{active}") + public R active(@PathVariable Long id, @PathVariable boolean active) { + if (active) { + return R.ok(defService.unActive(id)); + } else { + return R.ok(defService.active(id)); + } + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 61abe356c..2edcda60e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -1,6 +1,7 @@ package org.dromara.workflow.controller; import com.warm.flow.core.entity.Instance; +import com.warm.flow.core.service.InsService; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; @@ -24,6 +25,7 @@ import java.util.List; public class FlwInstanceController extends BaseController { private final IFlwInstanceService flwInstanceService; + private final InsService insService; /** * 分页查询正在运行的流程实例 @@ -76,4 +78,19 @@ public class FlwInstanceController extends BaseController { public R cancelProcessApply(@PathVariable String businessId) { return toAjax(flwInstanceService.cancelProcessApply(businessId)); } + + /** + * 激活/挂起流程定义 + * + * @param id 流程定义id + * @param active 激活/挂起 + */ + @PutMapping("/active/{id}/{active}") + public R active(@PathVariable Long id, @PathVariable boolean active) { + if (active) { + return R.ok(insService.unActive(id)); + } else { + return R.ok(insService.active(id)); + } + } } From c21e0db622ec3693b22a301070eadb2df6238fbd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 23 Aug 2024 23:47:50 +0800 Subject: [PATCH 028/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=94=99=E8=AF=AF=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 6 ++--- .../service/IFlwDefinitionService.java | 9 +++++++ .../impl/FlwDefinitionServiceImpl.java | 25 +++++++++++++++++++ .../mapper/workflow/FlwTaskMapper.xml | 11 ++++---- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index c3e4b6459..691f7b0dd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -140,14 +140,12 @@ public class FlwDefinitionController extends BaseController { * 导入流程定义 * * @param file 文件 - * @throws Exception 异常 */ @Log(title = "流程定义", businessType = BusinessType.IMPORT) @PostMapping("/importDefinition") @Transactional(rollbackFor = Exception.class) - public R importDefinition(MultipartFile file) throws Exception { - defService.importXml(file.getInputStream()); - return R.ok(); + public R importDefinition(MultipartFile file) { + return R.ok(iFlwDefinitionService.importXml(file)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 01b82f0b0..b7e022d8b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @@ -41,4 +42,12 @@ public interface IFlwDefinitionService { * @throws IOException 异常 */ void exportDefinition(Long id, HttpServletResponse response) throws IOException; + + /** + * 导入流程定义 + * + * @param file 文件 + * @return 结果 + */ + boolean importXml(MultipartFile file); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 1cc3b45d6..c878a3425 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.warm.flow.core.entity.Definition; import com.warm.flow.core.enums.PublishStatus; @@ -14,11 +15,13 @@ import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.Arrays; @@ -67,6 +70,28 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { return BeanUtil.copyToList(list, FlowDefinitionVo.class); } + /** + * 导入流程定义 + * + * @param file 文件 + */ + @Override + public boolean importXml(MultipartFile file) { + try { + Definition definition = defService.importXml(file.getInputStream()); + List list = flowDefinitionMapper.selectList( + new LambdaQueryWrapper().eq(FlowDefinition::getFlowCode, definition.getFlowCode())); + List definitionList = StreamUtils.filter(list, item -> !item.getId().equals(definition.getId())); + if (CollUtil.isEmpty(definitionList)) { + defService.publish(definition.getId()); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + return true; + } + /** * 导出流程定义 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index b285b22a0..bd4b32ad8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -17,8 +17,8 @@ - - + + @@ -74,8 +74,8 @@ i.flow_status, d.flow_name, d.flow_code, - d.from_custom, - d.from_path, + d.form_custom, + d.form_path, uu.processed_by FROM flow_task AS t LEFT JOIN flow_user uu ON uu.associated = t.id @@ -105,8 +105,7 @@ t.update_time, t.tenant_id, i.business_id, - i.node_name, - d.from_path fromPath, + d.form_path fromPath, d.flow_name, d.flow_code from ( SELECT MAX(id) as id From d26772983c87c9476c23864f0e8f878438e43ad4 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 24 Aug 2024 11:34:46 +0800 Subject: [PATCH 029/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E4=BA=BA=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 17 ++++++- .../workflow/domain/vo/FlowTaskVo.java | 14 +++++- .../service/impl/FlwTaskServiceImpl.java | 17 +++++++ .../dromara/workflow/utils/WorkflowUtils.java | 49 +++++++++++++++++++ .../mapper/workflow/FlwTaskMapper.xml | 2 +- 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index f367c77b9..27eaadb1b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -1,10 +1,14 @@ package org.dromara.workflow.controller; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.dto.ModifyHandler; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.enums.CooperateType; +import com.warm.flow.core.enums.FlowStatus; +import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -40,6 +44,7 @@ public class FlwTaskController extends BaseController { private final IFlwTaskService flwTaskService; private final TaskService taskService; + private final InsService insService; /** @@ -107,8 +112,16 @@ public class FlwTaskController extends BaseController { * @param taskId 任务id */ @GetMapping("/getTaskById/{taskId}") - public R getTaskById(@PathVariable Long taskId) { - return R.ok(taskService.getById(taskId)); + public R getTaskById(@PathVariable Long taskId) { + Task task = taskService.getById(taskId); + if (ObjectUtil.isNotNull(task)) { + FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); + Instance instance = insService.getById(task.getInstanceId()); + flowTaskVo.setFlowStatus(instance.getFlowStatus()); + flowTaskVo.setFlowStatusName(FlowStatus.getValueByKey(instance.getFlowStatus())); + return R.ok(flowTaskVo); + } + return R.fail(); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 278a5eb45..0ce330c20 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -2,9 +2,11 @@ package org.dromara.workflow.domain.vo; import com.warm.flow.orm.entity.FlowTask; import lombok.Data; +import org.dromara.common.core.domain.dto.UserDTO; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 任务视图 @@ -25,5 +27,15 @@ public class FlowTaskVo extends FlowTask implements Serializable { /** * 流程状态 */ - private String flowStatus; + private Integer flowStatus; + + /** + * 流程状态 + */ + private String flowStatusName; + + /** + * 办理人 + */ + private List userDTOList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 940b1baa8..1023ddaac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -1,18 +1,22 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; +import com.warm.flow.core.entity.User; import com.warm.flow.core.enums.SkipType; import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; +import com.warm.flow.core.service.UserService; import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.entity.FlowTask; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -44,6 +48,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final TaskService taskService; private final InsService insService; private final FlwTaskMapper flwTaskMapper; + private final UserService userService; private final IWfDefinitionConfigService wfDefinitionConfigService; private final IFlwInstanceService iFlwInstanceService; @@ -133,6 +138,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService { QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + List records = page.getRecords(); + if (CollUtil.isNotEmpty(records)) { + List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); + List userList = userService.getByAssociateds(taskIds); + for (FlowTaskVo record : records) { + if (CollUtil.isNotEmpty(userList)) { + List users = StreamUtils.filter(userList, e -> e.getAssociated().toString().equals(record.getId().toString())); + record.setUserList(CollUtil.isEmpty(users) ? Collections.emptyList() : users); + record.setUserDTOList(WorkflowUtils.getHandlerUser(users)); + } + } + } return TableDataInfo.build(page); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 85373a1a8..873a9459b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -2,12 +2,15 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.warm.flow.core.entity.Task; +import com.warm.flow.core.entity.User; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mail.utils.MailUtils; @@ -91,4 +94,50 @@ public class WorkflowUtils { permissionList.add("dept:" + deptId); return permissionList; } + + /** + * 获取办理人 + * + * @param userList 办理用户 + * @return 用户 + */ + public static List getHandlerUser(List userList) { + List userDTOList = new ArrayList<>(); + if (CollUtil.isNotEmpty(userList)) { + UserService userService = SpringUtils.getBean(UserService.class); + List userIds = new ArrayList<>(); + List roleIds = new ArrayList<>(); + List deptIds = new ArrayList<>(); + for (User user : userList) { + if (user.getProcessedBy().startsWith("user:")) { + userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); + } + if (user.getProcessedBy().startsWith("role:")) { + roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); + } + if (user.getProcessedBy().startsWith("dept:")) { + deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); + } + } + if (CollUtil.isNotEmpty(userIds)) { + List users = userService.selectListByIds(userIds); + if (CollUtil.isNotEmpty(users)) { + userDTOList.addAll(users); + } + } + if (CollUtil.isNotEmpty(roleIds)) { + List users = userService.selectUsersByRoleIds(roleIds); + if (CollUtil.isNotEmpty(users)) { + userDTOList.addAll(users); + } + } + if (CollUtil.isNotEmpty(deptIds)) { + List users = userService.selectUsersByDeptIds(deptIds); + if (CollUtil.isNotEmpty(users)) { + userDTOList.addAll(users); + } + } + } + return userDTOList; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index bd4b32ad8..9944da213 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -80,7 +80,7 @@ FROM flow_task AS t LEFT JOIN flow_user uu ON uu.associated = t.id LEFT JOIN flow_definition d on t.definition_id = d.id - LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and i.flow_status = '1') t + LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and i.flow_status = '1' and t.del_flag = '0') t ${ew.getCustomSqlSegment} From 41c43f2a6771eaa42a79f1bcce53ff8097eecb90 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 24 Aug 2024 11:58:26 +0800 Subject: [PATCH 030/227] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/utils/WorkflowUtils.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 873a9459b..4c2f0a010 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -119,23 +119,17 @@ public class WorkflowUtils { deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); } } - if (CollUtil.isNotEmpty(userIds)) { - List users = userService.selectListByIds(userIds); - if (CollUtil.isNotEmpty(users)) { - userDTOList.addAll(users); - } + List users = userService.selectListByIds(userIds); + if (CollUtil.isNotEmpty(users)) { + userDTOList.addAll(users); } - if (CollUtil.isNotEmpty(roleIds)) { - List users = userService.selectUsersByRoleIds(roleIds); - if (CollUtil.isNotEmpty(users)) { - userDTOList.addAll(users); - } + List roleUsers = userService.selectUsersByRoleIds(roleIds); + if (CollUtil.isNotEmpty(roleUsers)) { + userDTOList.addAll(roleUsers); } - if (CollUtil.isNotEmpty(deptIds)) { - List users = userService.selectUsersByDeptIds(deptIds); - if (CollUtil.isNotEmpty(users)) { - userDTOList.addAll(users); - } + List deptUsers = userService.selectUsersByDeptIds(deptIds); + if (CollUtil.isNotEmpty(deptUsers)) { + userDTOList.addAll(deptUsers); } } return userDTOList; From a084520280fb0031b466d87094e808279727856e Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 25 Aug 2024 17:45:23 +0800 Subject: [PATCH 031/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=EF=BC=8C=E5=BE=85=E5=8A=9E=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwInstanceController.java | 5 +- .../workflow/domain/bo/FlowInstanceBo.java | 41 +++++ .../workflow/domain/bo/FlowTaskBo.java | 3 + .../workflow/domain/vo/FlowHisTaskVo.java | 141 +++++++++++++++++- .../workflow/domain/vo/FlowInstanceVo.java | 111 ++++++++++++++ .../workflow/domain/vo/FlowTaskVo.java | 87 ++++++++++- .../workflow/mapper/FlwInstanceMapper.java | 27 ++++ .../workflow/service/IFlwInstanceService.java | 5 +- .../service/impl/FlwInstanceServiceImpl.java | 43 +++--- .../mapper/workflow/FlwInstanceMapper.xml | 50 +++++++ .../mapper/workflow/FlwTaskMapper.xml | 19 +-- 11 files changed, 487 insertions(+), 45 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 2edcda60e..47d7046e2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -7,6 +7,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,7 +35,7 @@ public class FlwInstanceController extends BaseController { * @param pageQuery 分页 */ @GetMapping("/getPageByRunning") - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { return flwInstanceService.getPageByRunning(instance, pageQuery); } @@ -45,7 +46,7 @@ public class FlwInstanceController extends BaseController { * @param pageQuery 分页 */ @GetMapping("/getPageByFinish") - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { return flwInstanceService.getPageByFinish(instance, pageQuery); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java new file mode 100644 index 000000000..df8b6be7d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -0,0 +1,41 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +public class FlowInstanceBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String nodeName; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程实例id + */ + private Long instanceId; + + private List permissionList; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 8f677e60f..74a5d554e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -33,6 +33,9 @@ public class FlowTaskBo implements Serializable { */ private String flowCode; + /** + * 流程实例id + */ private Long instanceId; private List permissionList; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1802cd376..1155d1dce 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,10 +1,13 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.orm.entity.FlowHisTask; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; +import java.util.Date; +import java.util.List; /** * 历史任务视图 @@ -12,13 +15,147 @@ import java.io.Serializable; * @author may */ @Data -public class FlowHisTaskVo extends FlowHisTask implements Serializable { +public class FlowHisTaskVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 任务表id + */ + private Long taskId; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private Integer cooperateType; + + /** + * 业务id + */ + private String businessId; + + /** + * 开始节点编码 + */ + private String nodeCode; + + /** + * 开始节点名称 + */ + private String nodeName; + + /** + * 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 目标节点编码 + */ + private String targetNodeCode; + + /** + * 结束节点名称 + */ + private String targetNodeName; + + /** + * 审批者 + */ + private String approver; + + /** + * 协作人(只有转办、会签、票签、委派) + */ + private String collaborator; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 跳转类型(PASS通过 REJECT退回 NONE无动作) + */ + private String skipType; + + /** + * 流程状态(1审批中 2 审批通过 9已退回 10失效) + */ + private Integer flowStatus; + + /** + * 审批意见 + */ + private String message; + + /** + * 业务详情 存业务类的json + */ + private String ext; + + /** + * 创建者 + */ + private String createBy; + + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + /** * 流程定义编码 */ private String flowCode; + + /** + * 审批者 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") + private String approverName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java new file mode 100644 index 000000000..6e4181c6c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -0,0 +1,111 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 流程实例视图 + * + * @author may + */ +@Data +public class FlowInstanceVo { + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 流程名称 + */ + private String flowCode; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + + /** + * 流程节点名称 + */ + private String nodeName; + + /** + * 流程变量 + */ + private String variable; + + /** + * 流程状态(0待提交 1审批中 2 审批通过 3自动通过 8已完成 9已退回 10失效) + */ + private Integer flowStatus; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 创建者 + */ + private String createBy; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + /** + * 流程定义版本 + */ + private String version; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 0ce330c20..304a37ceb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -1,11 +1,12 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.orm.entity.FlowTask; +import com.warm.flow.core.entity.User; import lombok.Data; import org.dromara.common.core.domain.dto.UserDTO; import java.io.Serial; import java.io.Serializable; +import java.util.Date; import java.util.List; /** @@ -14,16 +15,98 @@ import java.util.List; * @author may */ @Data -public class FlowTaskVo extends FlowTask implements Serializable { +public class FlowTaskVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点编码 + */ + private String nodeCode; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 流程用户列表 + */ + private List userList; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单 + */ + private String formPath; + /** * 流程定义编码 */ private String flowCode; + /** + * 流程版本号 + */ + private String version; + /** * 流程状态 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java new file mode 100644 index 000000000..6bb0f1ece --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -0,0 +1,27 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; + +/** + * 实例信息Mapper接口 + * + * @author may + * @date 2024-03-02 + */ +public interface FlwInstanceMapper { + /** + * 流程实例信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + + Page page(@Param("page") Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index b21bb15dc..a47a15690 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -4,6 +4,7 @@ import com.warm.flow.core.entity.Instance; import com.warm.flow.orm.entity.FlowInstance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; @@ -21,7 +22,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); + TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); /** * 分页查询已结束的流程实例 @@ -30,7 +31,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); + TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); /** * 按照业务id查询流程实例 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 29fec5852..87fa0e45b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -1,8 +1,11 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.FlowFactory; import com.warm.flow.core.constant.ExceptionCons; import com.warm.flow.core.dto.FlowParams; @@ -15,7 +18,6 @@ import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.NodeService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.utils.AssertUtil; -import com.warm.flow.core.utils.page.Page; import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; @@ -23,6 +25,9 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; +import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; @@ -45,6 +50,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final DefService defService; private final TaskService taskService; private final FlowInstanceMapper flowInstanceMapper; + private final FlwInstanceMapper flwInstanceMapper; /** * 分页查询正在运行的流程实例 @@ -53,12 +59,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { - Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); - instance.setFlowStatus(FlowStatus.APPROVAL.getKey()); - page = insService.orderByCreateTime().desc().page(instance, page); - TableDataInfo build = TableDataInfo.build(); - build.setRows(page.getList()); + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("t.flow_status", FlowStatus.APPROVAL.getKey()); + Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); build.setTotal(page.getTotal()); return build; } @@ -70,12 +76,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { - Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); - instance.setFlowStatus(FlowStatus.FINISHED.getKey()); - page = insService.orderByCreateTime().desc().page(instance, page); - TableDataInfo build = TableDataInfo.build(); - build.setRows(page.getList()); + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("t.flow_status", FlowStatus.FINISHED.getKey()); + Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); build.setTotal(page.getTotal()); return build; } @@ -136,10 +142,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { // 获取下一个节点,如果是网关节点,则重新获取后续节点 List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); Node node = nextNodes.get(0); - FlowParams flowParams = FlowParams.build() - .nodeCode(node.getNodeCode()) - .skipType(SkipType.PASS.getKey()) - .permissionFlag(WorkflowUtils.permissionList()); + FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { throw new RuntimeException(e); @@ -148,10 +151,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } private Node getFirstBetween(Node startNode) { - List skips = FlowFactory.skipService().list(FlowFactory.newSkip() - .setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); + List skips = FlowFactory.skipService().list(FlowFactory.newSkip().setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); Skip skip = skips.get(0); - return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()) - .setNodeCode(skip.getNextNodeCode())); + return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()).setNodeCode(skip.getNextNodeCode())); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml new file mode 100644 index 000000000..0836f981e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 9944da213..813186382 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -45,20 +45,7 @@ - - - - - - - - - - - - - - select*from ( SELECT distinct t.id, @@ -84,7 +71,7 @@ ${ew.getCustomSqlSegment} - select * from ( select t.id, @@ -111,7 +98,7 @@ from ( SELECT MAX(id) as id FROM flow_his_task - flow_status '10']]> + flow_status '10']]> and node_type = 1 AND approver in From 187db3656f51f31f78f775053f686139964c06ee Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Sep 2024 20:55:52 +0800 Subject: [PATCH 032/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=88=91?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E7=9A=84=E5=8D=95=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/config/WarmFlowConfig.java | 2 +- .../controller/FlwInstanceController.java | 13 +++++ .../workflow/domain/bo/InstanceBo.java | 6 +-- .../workflow/domain/vo/FlowInstanceVo.java | 5 ++ .../workflow/service/IFlwInstanceService.java | 10 ++++ .../service/impl/FlwInstanceServiceImpl.java | 47 +++++++++++++++++++ 6 files changed, 79 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java index 5df842ae5..6e663c00b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration; import org.dromara.common.satoken.utils.LoginHelper; /** - * 任务状态枚举 + * warmFlow配置 * * @author may */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 47d7046e2..c517addb0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -7,6 +7,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.validation.annotation.Validated; @@ -94,4 +95,16 @@ public class FlwInstanceController extends BaseController { return R.ok(insService.active(id)); } } + + + /** + * 获取当前登陆人发起的流程实例 + * + * @param instanceBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByCurrent") + public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { + return flwInstanceService.getPageByCurrent(instanceBo, pageQuery); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java index e259e352e..750e2304b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java @@ -19,12 +19,12 @@ public class InstanceBo implements Serializable { /** * 流程名称 */ - private String name; + private String flowName; /** - * 流程key + * 流程编码 */ - private String key; + private String flowCode; /** * 任务发起人 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index 6e4181c6c..d46637704 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -79,6 +79,11 @@ public class FlowInstanceVo { */ private Integer flowStatus; + /** + * 流程状态 + */ + private String flowStatusName; + /** * 流程激活状态(0挂起 1激活) */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index a47a15690..ebdb71019 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -4,6 +4,7 @@ import com.warm.flow.core.entity.Instance; import com.warm.flow.orm.entity.FlowInstance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; @@ -64,4 +65,13 @@ public interface IFlwInstanceService { * @return 结果 */ boolean cancelProcessApply(String businessId); + + /** + * 获取当前登陆人发起的流程实例 + * + * @param instanceBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 87fa0e45b..8f005576b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.FlowFactory; import com.warm.flow.core.constant.ExceptionCons; @@ -18,14 +19,19 @@ import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.NodeService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.utils.AssertUtil; +import com.warm.flow.orm.entity.FlowDefinition; import com.warm.flow.orm.entity.FlowInstance; +import com.warm.flow.orm.mapper.FlowDefinitionMapper; import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; @@ -51,6 +57,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final TaskService taskService; private final FlowInstanceMapper flowInstanceMapper; private final FlwInstanceMapper flwInstanceMapper; + private final FlowDefinitionMapper flowDefinitionMapper; /** * 分页查询正在运行的流程实例 @@ -155,4 +162,44 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { Skip skip = skips.get(0); return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()).setNodeCode(skip.getNextNodeCode())); } + + /** + * 获取当前登陆人发起的流程实例 + * + * @param instanceBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + + if (StringUtils.isNotBlank(instanceBo.getFlowCode())) { + List flowDefinitions = flowDefinitionMapper.selectList( + new LambdaQueryWrapper().eq(FlowDefinition::getFlowCode, instanceBo.getFlowCode())); + if (CollUtil.isNotEmpty(flowDefinitions)) { + List defIdList = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); + wrapper.in(FlowInstance::getDefinitionId, defIdList); + } + } + wrapper.eq(FlowInstance::getCreateBy, LoginHelper.getUserId()); + Page page = flowInstanceMapper.selectPage(pageQuery.build(), wrapper); + TableDataInfo build = TableDataInfo.build(); + List flowInstanceVos = BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class); + if (CollUtil.isNotEmpty(flowInstanceVos)) { + List definitionIds = StreamUtils.toList(flowInstanceVos, FlowInstanceVo::getDefinitionId); + List flowDefinitions = flowDefinitionMapper.selectBatchIds(definitionIds); + for (FlowInstanceVo vo : flowInstanceVos) { + flowDefinitions.stream().filter(e -> e.getId().toString().equals(vo.getDefinitionId().toString())).findFirst().ifPresent(e -> { + vo.setFlowName(e.getFlowName()); + vo.setFlowCode(e.getFlowCode()); + vo.setVersion(e.getVersion()); + vo.setFlowStatusName(FlowStatus.getValueByKey(vo.getFlowStatus())); + }); + } + + } + build.setRows(flowInstanceVos); + build.setTotal(page.getTotal()); + return build; + } } From 281c9c0e8eb29d41c45da08a563dd5bd38ac77aa Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 16 Sep 2024 21:16:31 +0800 Subject: [PATCH 033/227] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=B2=E5=8A=9E?= =?UTF-8?q?=EF=BC=8C=E6=9C=AA=E5=8A=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 23 ++++ .../workflow/domain/vo/FlowHisTaskVo.java | 17 ++- .../workflow/mapper/FlwTaskMapper.java | 4 +- .../workflow/service/IFlwTaskService.java | 20 ++++ .../service/impl/FlwInstanceServiceImpl.java | 1 - .../service/impl/FlwTaskServiceImpl.java | 112 +++++++++++++----- .../mapper/workflow/FlwTaskMapper.xml | 68 ++++------- 7 files changed, 162 insertions(+), 83 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 27eaadb1b..8deb8e879 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -95,6 +95,29 @@ public class FlwTaskController extends BaseController { return flwTaskService.getPageByTaskFinish(flowTaskBo, pageQuery); } + /** + * 查询待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getPageByAllTaskWait") + public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.getPageByAllTaskWait(flowTaskBo, pageQuery); + } + + /** + * 查询已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + + @GetMapping("/getPageByAllTaskFinish") + public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.getPageByAllTaskFinish(flowTaskBo, pageQuery); + } + /** * 查询当前用户的抄送 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1155d1dce..f708b9796 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -102,6 +102,12 @@ public class FlowHisTaskVo implements Serializable { */ private String approver; + /** + * 审批者 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") + private String approveName; + /** * 协作人(只有转办、会签、票签、委派) */ @@ -122,6 +128,11 @@ public class FlowHisTaskVo implements Serializable { */ private Integer flowStatus; + /** + * 流程状态 + */ + private String flowStatusName; + /** * 审批意见 */ @@ -152,10 +163,4 @@ public class FlowHisTaskVo implements Serializable { * 流程定义编码 */ private String flowCode; - - /** - * 审批者 - */ - @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") - private String approverName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index c39c90914..cad896379 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -32,12 +32,10 @@ public interface FlwTaskMapper { * * @param page 分页 * @param queryWrapper 条件 - * @param flowTaskBo 条件 * @return 结果 */ Page getTaskFinishByPage(@Param("page") Page page, - @Param(Constants.WRAPPER) Wrapper queryWrapper, - @Param("flowTaskBo") FlowTaskBo flowTaskBo); + @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 查询当前用户的抄送 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index d6a2389c3..237fe56b3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -49,6 +49,26 @@ public interface IFlwTaskService { */ TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + + /** + * 查询待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + /** + * 查询已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + /** * 查询当前用户的抄送 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 8f005576b..ea62842d1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -172,7 +172,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - if (StringUtils.isNotBlank(instanceBo.getFlowCode())) { List flowDefinitions = flowDefinitionMapper.selectList( new LambdaQueryWrapper().eq(FlowDefinition::getFlowCode, instanceBo.getFlowCode())); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 1023ddaac..5f52eba03 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -7,6 +7,8 @@ import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.User; +import com.warm.flow.core.enums.FlowStatus; +import com.warm.flow.core.enums.NodeType; import com.warm.flow.core.enums.SkipType; import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; @@ -135,21 +137,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); - Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); - List records = page.getRecords(); - if (CollUtil.isNotEmpty(records)) { - List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); - List userList = userService.getByAssociateds(taskIds); - for (FlowTaskVo record : records) { - if (CollUtil.isNotEmpty(userList)) { - List users = StreamUtils.filter(userList, e -> e.getAssociated().toString().equals(record.getId().toString())); - record.setUserList(CollUtil.isEmpty(users) ? Collections.emptyList() : users); - record.setUserDTOList(WorkflowUtils.getHandlerUser(users)); - } - } - } + queryWrapper.in("t.flow_status", FlowStatus.APPROVAL.getKey()); + Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); return TableDataInfo.build(page); } @@ -161,12 +152,83 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); - flowTaskBo.setPermissionList(WorkflowUtils.permissionList()); - Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper, flowTaskBo); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("t.approver", LoginHelper.getUserId()); + Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); return TableDataInfo.build(page); } + /** + * 查询待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); + Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); + return TableDataInfo.build(page); + } + + private Page buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { + commonCondition(queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + List records = page.getRecords(); + if (CollUtil.isNotEmpty(records)) { + List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); + List userList = userService.getByAssociateds(taskIds); + for (FlowTaskVo data : records) { + if (CollUtil.isNotEmpty(userList)) { + List users = StreamUtils.filter(userList, e -> e.getAssociated().toString().equals(data.getId().toString())); + data.setUserList(CollUtil.isEmpty(users) ? Collections.emptyList() : users); + data.setUserDTOList(WorkflowUtils.getHandlerUser(users)); + } + data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); + } + } + return page; + } + + /** + * 通用条件 + * + * @param queryWrapper 查询条件 + * @param flowTaskBo 参数 + */ + private void commonCondition(QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { + queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); + queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); + } + + /** + * 查询已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); + return TableDataInfo.build(page); + } + + private Page buildTaskFinishPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { + commonCondition(queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); + List records = page.getRecords(); + if (CollUtil.isNotEmpty(records)) { + for (FlowHisTaskVo data : records) { + data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); + } + } + return page; + } + /** * 查询当前用户的抄送 * @@ -175,24 +237,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = getFlowTaskBoQueryWrapper(flowTaskBo); - flowTaskBo.setPermissionList(WorkflowUtils.permissionList()); - Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); - return TableDataInfo.build(page); - } - - - /** - * 查询参数 - * - * @param flowTaskBo 参数 - */ - private QueryWrapper getFlowTaskBoQueryWrapper(FlowTaskBo flowTaskBo) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); - return queryWrapper; + Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 813186382..0a10a3de8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -67,54 +67,38 @@ FROM flow_task AS t LEFT JOIN flow_user uu ON uu.associated = t.id LEFT JOIN flow_definition d on t.definition_id = d.id - LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and i.flow_status = '1' and t.del_flag = '0') t + LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0') t ${ew.getCustomSqlSegment} select * from ( SELECT + b.id , b.flow_status, b.business_id, a.create_time, b.node_name, b.node_code, - b.id , d.flow_name, - d.flow_code, + d.flow_code FROM `flow_user` a LEFT JOIN flow_instance b ON a.associated = b.id LEFT JOIN flow_definition d on b.definition_id=d.id WHERE - a.type = 4 ORDER BY create_time DESC + a.type = 4 ) t ${ew.getCustomSqlSegment} From 71224b62a38a49eb73acb41331ffcfb1cb8a1536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 18 Sep 2024 10:12:23 +0800 Subject: [PATCH 035/227] update warm-flow 1.2.4 => 1.2.7 --- pom.xml | 9 +++++++-- ruoyi-admin/src/main/resources/application.yml | 18 ++---------------- ruoyi-modules/ruoyi-workflow/pom.xml | 5 +++++ .../workflow/config/WarmFlowConfig.java | 10 ---------- .../workflow/domain/vo/FlowHisTaskVo.java | 2 +- .../workflow/domain/vo/FlowInstanceVo.java | 2 +- .../dromara/workflow/domain/vo/FlowTaskVo.java | 2 +- 7 files changed, 17 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index c58c9a4e1..df198d0c4 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 8.7.2-20240808 - 1.2.4 + 1.2.7 3.2.2 @@ -122,9 +122,14 @@ io.github.minliuhua warm-flow-mybatis-plus-sb-starter - ${warm-flow} + ${warm-flow.version} + + io.github.minliuhua + warm-flow-plugin-spel + ${warm-flow.version} + diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 60c1873d9..bee3da50f 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -273,19 +273,5 @@ websocket: --- # warm-flow工作流配置 warm-flow: - # 是否显示banner图,默认是 - banner: true - # 填充器 (可配置文件注入,也可用@Bean/@Component方式) - data-fill-handler-path: com.ruoyi.system.handle.CustomDataFillHandler - # 全局租户处理器(可配置文件注入,也可用@Bean/@Component方式) - tenant_handler_path: com.ruoyi.system.handle.CustomTenantHandler - # 是否开启逻辑删除 - logic_delete: false - # 逻辑删除字段值(开启后默认为2) - logic_delete_value: 2 - # 逻辑未删除字段(开启后默认为0) - logic_not_delete_value: 0 - # 数据源类型, mybatis模块对orm进一步的封装, 由于各数据库分页语句存在差异, - # 当配置此参数时, 以此参数结果为基准, 未配置时, 取DataSource中数据源类型, - # 兜底为mysql数据库 - data_source_type: mysql + # 是否开启工作流,默认true + enabled: true diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index fb4e192e1..8ace150c0 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -65,10 +65,15 @@ org.dromara ruoyi-common-security + io.github.minliuhua warm-flow-mybatis-plus-sb-starter + + io.github.minliuhua + warm-flow-plugin-spel +
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java index 6e663c00b..a38c83e27 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -1,10 +1,7 @@ package org.dromara.workflow.config; -import com.warm.flow.core.handler.TenantHandler; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.dromara.common.satoken.utils.LoginHelper; /** * warmFlow配置 @@ -14,12 +11,5 @@ import org.dromara.common.satoken.utils.LoginHelper; @Configuration public class WarmFlowConfig { - /** - * 全局租户处理器(可配置文件注入,也可用@Bean/@Component方式) - */ - @Bean - public TenantHandler tenantHandler() { - return LoginHelper::getTenantId; - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index f708b9796..c7dca17b9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -126,7 +126,7 @@ public class FlowHisTaskVo implements Serializable { /** * 流程状态(1审批中 2 审批通过 9已退回 10失效) */ - private Integer flowStatus; + private String flowStatus; /** * 流程状态 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index d46637704..a8a85fb51 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -77,7 +77,7 @@ public class FlowInstanceVo { /** * 流程状态(0待提交 1审批中 2 审批通过 3自动通过 8已完成 9已退回 10失效) */ - private Integer flowStatus; + private String flowStatus; /** * 流程状态 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 304a37ceb..9761f2d5b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -110,7 +110,7 @@ public class FlowTaskVo implements Serializable { /** * 流程状态 */ - private Integer flowStatus; + private String flowStatus; /** * 流程状态 From 996faa1bf3a636f9c8d224c8c0f9de1504cb71e1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 20 Sep 2024 22:02:17 +0800 Subject: [PATCH 036/227] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=BD=AC=E5=8A=9E?= =?UTF-8?q?=EF=BC=8C=E5=A7=94=E6=89=98=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/controller/FlwTaskController.java | 5 +++-- .../main/java/org/dromara/workflow/domain/bo/DelegateBo.java | 2 +- .../main/java/org/dromara/workflow/domain/bo/TransferBo.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 8deb8e879..8575fdec1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -28,6 +28,7 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; + import java.util.Collections; import java.util.Map; @@ -176,7 +177,7 @@ public class FlwTaskController extends BaseController { bo.getTaskId(), String.valueOf(LoginHelper.getUserId()), WorkflowUtils.permissionList(), - bo.getUserIds(), + Collections.singletonList(bo.getUserId()), bo.getMessage())); } @@ -193,7 +194,7 @@ public class FlwTaskController extends BaseController { bo.getTaskId(), String.valueOf(LoginHelper.getUserId()), WorkflowUtils.permissionList(), - bo.getUserIds(), + Collections.singletonList(bo.getUserId()), bo.getMessage())); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java index f176034b6..a560b9530 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java @@ -23,7 +23,7 @@ public class DelegateBo implements Serializable { * 委派人id */ @NotNull(message = "委派人id不能为空", groups = {AddGroup.class}) - private List userIds; + private String userId; /** * 任务id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java index 18a95f4e1..8d0d5d235 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java @@ -23,7 +23,7 @@ public class TransferBo implements Serializable { * 转办人id */ @NotNull(message = "转办人id不能为空", groups = {AddGroup.class}) - private List userIds; + private String userId; /** * 任务id From 47ba2bc40477fe7475d0ea5da2335e72fe40bb0a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 5 Oct 2024 11:36:39 +0800 Subject: [PATCH 037/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E8=AE=BE=E7=BD=AE=E5=8A=9E=E7=90=86?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/FlowTaskVo.java | 5 ++ .../service/impl/FlwInstanceServiceImpl.java | 8 +-- .../service/impl/FlwTaskServiceImpl.java | 33 ++++++++++- .../dromara/workflow/utils/WorkflowUtils.java | 55 +++++++++++++++++-- .../mapper/workflow/FlwTaskMapper.xml | 8 ++- 5 files changed, 97 insertions(+), 12 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 9761f2d5b..54a5edf46 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -121,4 +121,9 @@ public class FlowTaskVo implements Serializable { * 办理人 */ private List userDTOList; + + /** + * 办理人类型 + */ + private String type; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index ea62842d1..4689b8128 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -147,10 +147,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); // 获取下一个节点,如果是网关节点,则重新获取后续节点 - List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); - Node node = nextNodes.get(0); - FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); - taskService.skip(list.get(0).getId(), flowParams); + //List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); + //Node node = nextNodes.get(0); + // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); + // taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 69e16a197..7fb014396 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; @@ -15,8 +16,10 @@ import com.warm.flow.core.service.TaskService; import com.warm.flow.core.service.UserService; import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.entity.FlowTask; +import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -54,6 +57,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final IWfDefinitionConfigService wfDefinitionConfigService; private final IFlwInstanceService iFlwInstanceService; + private final FlowTaskMapper flowTaskMapper; + /** * 启动任务 * @@ -121,7 +126,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.message(completeTaskBo.getMessage()); flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); - taskService.skip(taskId, flowParams); + Instance instance = taskService.skip(taskId, flowParams); + setHandler(instance); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -129,6 +135,31 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } + /** + * 设置办理人 + * + * @param instance 实例 + */ + private void setHandler(Instance instance) { + if (instance != null) { + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instance.getId())); + for (FlowTask flowTask : flowTasks) { + List userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); + if (CollUtil.isNotEmpty(userList)) { + Set users = WorkflowUtils.getUser(userList); + if (CollUtil.isNotEmpty(users)) { + userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); + for (User user : users) { + user.setAssociated(flowTask.getId()); + } + userService.saveBatch(new ArrayList<>(users)); + } + } + } + } + } + /** * 查询当前用户的待办任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 4c2f0a010..20d5d3c2f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.User; +import com.warm.flow.orm.entity.FlowUser; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; @@ -111,12 +112,12 @@ public class WorkflowUtils { for (User user : userList) { if (user.getProcessedBy().startsWith("user:")) { userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); - } - if (user.getProcessedBy().startsWith("role:")) { + } else if (user.getProcessedBy().startsWith("role:")) { roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); - } - if (user.getProcessedBy().startsWith("dept:")) { + } else if (user.getProcessedBy().startsWith("dept:")) { deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); + } else { + userIds.add(Long.valueOf(user.getProcessedBy())); } } List users = userService.selectListByIds(userIds); @@ -134,4 +135,50 @@ public class WorkflowUtils { } return userDTOList; } + + /** + * 获取办理人 + * + * @param userList 办理用户 + * @return 用户 + */ + public static Set getUser(List userList) { + Set list = new HashSet<>(); + if (CollUtil.isNotEmpty(userList)) { + UserService userService = SpringUtils.getBean(UserService.class); + for (User user : userList) { + if (user.getProcessedBy().startsWith("user:")) { + Long userId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); + List users = userService.selectListByIds(List.of(userId)); + if (CollUtil.isNotEmpty(users)) { + FlowUser u = new FlowUser(); + u.setType(user.getType()); + u.setProcessedBy(String.valueOf(StreamUtils.toList(users, UserDTO::getUserId).get(0))); + list.add(u); + } + } + if (user.getProcessedBy().startsWith("role:")) { + Long roleId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); + List roleUsers = userService.selectUsersByRoleIds(List.of(roleId)); + for (UserDTO roleUser : roleUsers) { + FlowUser u = new FlowUser(); + u.setType(user.getType()); + u.setProcessedBy(String.valueOf(roleUser.getUserId())); + list.add(u); + } + } + if (user.getProcessedBy().startsWith("dept:")) { + Long deptId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); + List deptUsers = userService.selectUsersByDeptIds(List.of(deptId)); + for (UserDTO deptUser : deptUsers) { + FlowUser u = new FlowUser(); + u.setType(user.getType()); + u.setProcessedBy(String.valueOf(deptUser.getUserId())); + list.add(u); + } + } + } + } + return list; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 6544f77a4..52061053f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -20,6 +20,7 @@ + @@ -63,11 +64,12 @@ d.flow_code, d.form_custom, d.form_path, - uu.processed_by + uu.processed_by, + uu.type FROM flow_task AS t LEFT JOIN flow_user uu ON uu.associated = t.id LEFT JOIN flow_definition d on t.definition_id = d.id - LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0') t + LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0' and uu.del_flag = '0') t ${ew.getCustomSqlSegment} @@ -117,7 +119,7 @@ LEFT JOIN flow_instance b ON a.associated = b.id LEFT JOIN flow_definition d on b.definition_id=d.id WHERE - a.type = 4 + a.type = 4 and a.del_flag = '0' ) t ${ew.getCustomSqlSegment} From 7322266c8df8945738bec3d8aea470e337e679cf Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 5 Oct 2024 11:37:19 +0800 Subject: [PATCH 038/227] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index df198d0c4..a3c7f3d38 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 8.7.2-20240808 - 1.2.7 + 1.2.10 3.2.2 From 49112f43aa86b5021b4ea4cdf83dea58302f069d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 6 Oct 2024 19:47:44 +0800 Subject: [PATCH 039/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 13 +++++ .../workflow/domain/bo/BackProcessBo.java | 2 +- .../workflow/service/IFlwTaskService.java | 11 +++- .../service/impl/FlwInstanceServiceImpl.java | 7 +-- .../service/impl/FlwTaskServiceImpl.java | 53 ++++++++++++++++--- 5 files changed, 75 insertions(+), 11 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 8575fdec1..a167cb5c8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.dto.ModifyHandler; +import com.warm.flow.core.entity.HisTask; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.enums.CooperateType; @@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -265,4 +267,15 @@ public class FlwTaskController extends BaseController { return toAjax(flwTaskService.backProcess(bo)); } + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + */ + @GetMapping("/getBackTaskNode/{instanceId}") + public R> getBackTaskNode(@PathVariable String instanceId) { + return R.ok(flwTaskService.getBackTaskNode(instanceId)); + } + + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index ac1251e2c..60bd30feb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -39,7 +39,7 @@ public class BackProcessBo implements Serializable { * 驳回的节点id(目前未使用,直接驳回到申请人) */ @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) - private String targetNodeCode; + private String nodeCode; /** * 办理意见 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 237fe56b3..6424073ed 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,11 +1,13 @@ package org.dromara.workflow.service; +import com.warm.flow.core.entity.HisTask; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.List; import java.util.Map; /** @@ -50,7 +52,6 @@ public interface IFlwTaskService { TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); - /** * 查询待办任务 * @@ -85,4 +86,12 @@ public interface IFlwTaskService { * @return 结果 */ boolean backProcess(BackProcessBo bo); + + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + * @return 结果 + */ + List getBackTaskNode(String instanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 4689b8128..512cd925d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -39,6 +39,7 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; import java.util.List; /** @@ -85,7 +86,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("t.flow_status", FlowStatus.FINISHED.getKey()); + queryWrapper.in("t.flow_status", Arrays.asList(FlowStatus.FINISHED.getKey(), FlowStatus.AUTO_PASS.getKey())); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -149,8 +150,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { // 获取下一个节点,如果是网关节点,则重新获取后续节点 //List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); //Node node = nextNodes.get(0); - // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); - // taskService.skip(list.get(0).getId(), flowParams); + // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); + // taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 7fb014396..3bc3b623e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; +import com.warm.flow.core.entity.HisTask; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.User; @@ -14,12 +15,15 @@ import com.warm.flow.core.enums.SkipType; import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.service.UserService; +import com.warm.flow.orm.entity.FlowHisTask; import com.warm.flow.orm.entity.FlowInstance; +import com.warm.flow.orm.entity.FlowSkip; import com.warm.flow.orm.entity.FlowTask; +import com.warm.flow.orm.mapper.FlowHisTaskMapper; +import com.warm.flow.orm.mapper.FlowSkipMapper; import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -37,6 +41,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; @@ -56,8 +61,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final UserService userService; private final IWfDefinitionConfigService wfDefinitionConfigService; private final IFlwInstanceService iFlwInstanceService; - private final FlowTaskMapper flowTaskMapper; + private final FlowHisTaskMapper flowHisTaskMapper; + private final FlowSkipMapper flowSkipMapper; /** * 启动任务 @@ -92,7 +98,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - + flowParams.setHandler(String.valueOf(LoginHelper.getUserId())); Instance instance; try { instance = insService.start(startProcessBo.getBusinessKey(), flowParams); @@ -286,17 +292,52 @@ public class FlwTaskServiceImpl implements IFlwTaskService { try { String userId = String.valueOf(LoginHelper.getUserId()); Long taskId = bo.getTaskId(); + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); + if (CollUtil.isEmpty(flowTasks)) { + throw new ServiceException("任务不存在!"); + } + Long definitionId = flowTasks.get(0).getDefinitionId(); + List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); + FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); + //开始节点的下一节点 + assert flowSkip != null; + String nextNodeCode = flowSkip.getNextNodeCode(); + FlowParams flowParams = new FlowParams(); flowParams.variable(bo.getVariables()); - flowParams.skipType(SkipType.REJECT.getKey()); + if (nextNodeCode.equals(bo.getNodeCode())) { + flowParams.skipType(SkipType.REJECT.getKey()); + } else { + flowParams.skipType(SkipType.PASS.getKey()); + } flowParams.message(bo.getMessage()); flowParams.handler(userId); - flowParams.nodeCode(bo.getTargetNodeCode()); - taskService.skip(taskId, flowParams); + flowParams.nodeCode(bo.getNodeCode()); + flowParams.setPermissionFlag(WorkflowUtils.permissionList()); + Instance instance = taskService.skip(taskId, flowParams); + setHandler(instance); return true; } catch (Exception e) { log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } + + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + */ + @Override + public List getBackTaskNode(String instanceId) { + LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) + .eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, 1) + .orderByDesc(FlowHisTask::getCreateTime); + List flowHisTasks = flowHisTaskMapper.selectList(lw); + if (CollUtil.isNotEmpty(flowHisTasks)) { + return flowHisTasks.stream().distinct().collect(Collectors.toList()); + } + return Collections.emptyList(); + } } From ccf28de33df1c0f2a7fc3b9499b90551a17f45e6 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 13 Oct 2024 13:56:51 +0800 Subject: [PATCH 040/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8Bxml=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/controller/FlwDefinitionController.java | 4 ++-- .../org/dromara/workflow/service/IFlwDefinitionService.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 691f7b0dd..689a81a3a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -168,7 +168,7 @@ public class FlwDefinitionController extends BaseController { */ @GetMapping("/xmlString/{id}") public R xmlString(@PathVariable Long id) { - return R.ok(defService.xmlString(id)); + return R.ok("操作成功", defService.xmlString(id)); } /** @@ -179,7 +179,7 @@ public class FlwDefinitionController extends BaseController { */ @GetMapping("/flowChart/{instanceId}") public R flowChart(@PathVariable Long instanceId) throws IOException { - return R.ok(defService.flowChart(instanceId)); + return R.ok("操作成功", defService.flowChart(instanceId)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index b7e022d8b..0511c5eb8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -1,6 +1,5 @@ package org.dromara.workflow.service; -import com.warm.flow.core.entity.Definition; import com.warm.flow.orm.entity.FlowDefinition; import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.PageQuery; From 4d40a1f4fa7f8b2461469b26e318d20481df1c0f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 26 Oct 2024 17:35:41 +0800 Subject: [PATCH 041/227] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow?= =?UTF-8?q?=E5=88=B01.3.0=20=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E5=8A=9E?= =?UTF-8?q?=E7=90=86=20=EF=BC=8C=E9=A9=B3=E5=9B=9E=EF=BC=8C=E7=BB=88?= =?UTF-8?q?=E6=AD=A2=E7=AD=89=20=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +- .../core/domain/event/ProcessEvent.java | 4 +- .../core/domain/event/ProcessTaskEvent.java | 8 +- ruoyi-modules/ruoyi-workflow/pom.xml | 4 + .../controller/FlwDefinitionController.java | 11 -- .../controller/FlwInstanceController.java | 12 ++ .../controller/FlwTaskController.java | 8 +- .../workflow/domain/vo/FlowHisTaskVo.java | 10 ++ .../handler/FlowProcessEventHandler.java | 50 ++++++++ .../workflow/service/IFlwInstanceService.java | 9 ++ .../workflow/service/IFlwTaskService.java | 9 ++ .../service/impl/FlwInstanceServiceImpl.java | 113 +++++++++++------- .../service/impl/FlwTaskServiceImpl.java | 61 +++++++++- .../service/impl/TestLeaveServiceImpl.java | 15 +-- .../dromara/workflow/utils/WorkflowUtils.java | 57 --------- script/bpmn/leaveFlow-serial1.xml | 30 ++--- 16 files changed, 259 insertions(+), 150 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java diff --git a/pom.xml b/pom.xml index a3c7f3d38..723885860 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 8.7.2-20240808 - 1.2.10 + 1.3.0 3.2.2 @@ -130,6 +130,12 @@ warm-flow-plugin-spel ${warm-flow.version} + + io.github.minliuhua + warm-flow-plugin-ui-sb-web + ${warm-flow.version} + + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index 61c7efc39..df9eebcac 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -18,9 +18,9 @@ public class ProcessEvent implements Serializable { private static final long serialVersionUID = 1L; /** - * 流程定义key + * 流程定义编码 */ - private String key; + private String flowCode; /** * 业务id diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java index 019ca823b..78d0d9e29 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -18,14 +18,14 @@ public class ProcessTaskEvent implements Serializable { private static final long serialVersionUID = 1L; /** - * 流程定义key + * 流程定义编码 */ - private String key; + private String flowCode; /** - * 审批节点key + * 审批节点编码 */ - private String taskDefinitionKey; + private String nodeCode; /** * 任务id diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 8ace150c0..6e18f8680 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -74,6 +74,10 @@ io.github.minliuhua warm-flow-plugin-spel + + io.github.minliuhua + warm-flow-plugin-ui-sb-web + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 689a81a3a..4bb15ca2b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -171,17 +171,6 @@ public class FlwDefinitionController extends BaseController { return R.ok("操作成功", defService.xmlString(id)); } - /** - * 查询流程图 - * - * @param instanceId 流程实例id - * @throws IOException 异常 - */ - @GetMapping("/flowChart/{instanceId}") - public R flowChart(@PathVariable Long instanceId) throws IOException { - return R.ok("操作成功", defService.flowChart(instanceId)); - } - /** * 激活/挂起流程定义 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index c517addb0..a22a5e471 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -14,6 +14,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; /** * 流程实例管理 控制层 @@ -107,4 +108,15 @@ public class FlwInstanceController extends BaseController { public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { return flwInstanceService.getPageByCurrent(instanceBo, pageQuery); } + + + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + */ + @GetMapping("/getFlowImage/{businessId}") + public R> getFlowImage(@PathVariable String businessId) { + return R.ok(flwInstanceService.getFlowImage(businessId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index a167cb5c8..16ee315a4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -158,12 +158,8 @@ public class FlwTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/terminationTask") - public R terminationTask(@RequestBody TerminationBo bo) { - FlowParams flowParams = new FlowParams(); - flowParams.handler(String.valueOf(LoginHelper.getUserId())); - flowParams.message(bo.getComment()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); - return R.ok(taskService.termination(bo.getTaskId(), flowParams)); + public R terminationTask(@RequestBody TerminationBo bo) { + return R.ok(flwTaskService.terminationTask(bo)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index c7dca17b9..5ab3520e9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -67,6 +67,11 @@ public class FlowHisTaskVo implements Serializable { */ private Integer cooperateType; + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private String cooperateTypeName; + /** * 业务id */ @@ -163,4 +168,9 @@ public class FlowHisTaskVo implements Serializable { * 流程定义编码 */ private String flowCode; + + /** + * 运行时长 + */ + private String runDuration; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java new file mode 100644 index 000000000..7c8e15633 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -0,0 +1,50 @@ +package org.dromara.workflow.handler; + +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.domain.event.ProcessTaskEvent; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Component; + +/** + * 流程监听服务 + * + * @author may + * @date 2024-06-02 + */ +@Component +public class FlowProcessEventHandler { + + /** + * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) + * + * @param flowCode 流程定义编码 + * @param businessKey 业务id + * @param status 状态 + * @param submit 当为true时为申请人节点办理 + */ + public void processHandler(String flowCode, String businessKey, String status, boolean submit) { + ProcessEvent processEvent = new ProcessEvent(); + processEvent.setFlowCode(flowCode); + processEvent.setBusinessKey(businessKey); + processEvent.setStatus(status); + processEvent.setSubmit(submit); + SpringUtils.context().publishEvent(processEvent); + } + + /** + * 执行办理任务监听 + * + * @param flowCode 流程定义编码 + * @param nodeCode 审批节点编码 + * @param taskId 任务id + * @param businessKey 业务id + */ + public void processTaskHandler(String flowCode, String nodeCode, String taskId, String businessKey) { + ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); + processTaskEvent.setFlowCode(flowCode); + processTaskEvent.setNodeCode(nodeCode); + processTaskEvent.setTaskId(taskId); + processTaskEvent.setBusinessKey(businessKey); + SpringUtils.context().publishEvent(processTaskEvent); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index ebdb71019..65712a22e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -8,6 +8,7 @@ import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; +import java.util.Map; /** * 流程实例 服务层 @@ -74,4 +75,12 @@ public interface IFlwInstanceService { * @return 结果 */ TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery); + + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + * @return 结果 + */ + Map getFlowImage(String businessId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 6424073ed..2f1eee3dd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service; import com.warm.flow.core.entity.HisTask; +import com.warm.flow.core.entity.Instance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.*; @@ -94,4 +95,12 @@ public interface IFlwTaskService { * @return 结果 */ List getBackTaskNode(String instanceId); + + /** + * 终止任务 + * + * @param bo 参数 + * @return 结果 + */ + boolean terminationTask(TerminationBo bo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 512cd925d..00302d1b3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -2,29 +2,24 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.FlowFactory; -import com.warm.flow.core.constant.ExceptionCons; -import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.entity.*; +import com.warm.flow.core.enums.CooperateType; import com.warm.flow.core.enums.FlowStatus; import com.warm.flow.core.enums.NodeType; -import com.warm.flow.core.enums.SkipType; -import com.warm.flow.core.service.DefService; -import com.warm.flow.core.service.InsService; -import com.warm.flow.core.service.NodeService; -import com.warm.flow.core.service.TaskService; -import com.warm.flow.core.utils.AssertUtil; +import com.warm.flow.core.service.*; import com.warm.flow.orm.entity.FlowDefinition; +import com.warm.flow.orm.entity.FlowHisTask; import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.mapper.FlowDefinitionMapper; +import com.warm.flow.orm.mapper.FlowHisTaskMapper; import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -32,15 +27,18 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.InstanceBo; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; -import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 流程实例 服务层实现 @@ -53,9 +51,8 @@ import java.util.List; public class FlwInstanceServiceImpl implements IFlwInstanceService { private final InsService insService; - private final NodeService nodeService; private final DefService defService; - private final TaskService taskService; + private final FlowHisTaskMapper flowHisTaskMapper; private final FlowInstanceMapper flowInstanceMapper; private final FlwInstanceMapper flwInstanceMapper; private final FlowDefinitionMapper flowDefinitionMapper; @@ -70,6 +67,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("t.flow_status", FlowStatus.APPROVAL.getKey()); + queryWrapper.eq("t.del_flag", UserConstants.USER_NORMAL); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -130,38 +128,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return insService.remove(instanceIds); } + /** + * 撤销流程 + * + * @param businessId 业务id + */ @Override @Transactional(rollbackFor = Exception.class) public boolean cancelProcessApply(String businessId) { - FlowInstance flowInstance = instanceByBusinessId(businessId); - if (ObjectUtil.isNull(flowInstance)) { - return false; - } - try { - Definition definition = defService.getById(flowInstance.getDefinitionId()); - List list = taskService.list(FlowFactory.newTask().setInstanceId(flowInstance.getId())); - // 获取已发布的流程节点 - List nodes = nodeService.getByFlowCode(definition.getFlowCode()); - AssertUtil.isTrue(CollUtil.isEmpty(nodes), ExceptionCons.NOT_PUBLISH_NODE); - // 获取开始节点 - Node startNode = nodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); - AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); - - // 获取下一个节点,如果是网关节点,则重新获取后续节点 - //List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); - //Node node = nextNodes.get(0); - // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); - // taskService.skip(list.get(0).getId(), flowParams); - } catch (Exception e) { - throw new RuntimeException(e); - } - return false; - } - - private Node getFirstBetween(Node startNode) { - List skips = FlowFactory.skipService().list(FlowFactory.newSkip().setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); - Skip skip = skips.get(0); - return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()).setNodeCode(skip.getNextNodeCode())); + throw new RuntimeException("暂未开发"); } /** @@ -202,4 +177,58 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { build.setTotal(page.getTotal()); return build; } + + @Override + public Map getFlowImage(String businessId) { + Map map = new HashMap<>(); + FlowInstance flowInstance = instanceByBusinessId(businessId); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); + wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); + wrapper.orderByDesc(FlowHisTask::getCreateTime); + List flowHisTasks = flowHisTaskMapper.selectList(wrapper); + List list = BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class); + for (FlowHisTaskVo vo : list) { + vo.setCooperateTypeName(CooperateType.getValueByKey(vo.getCooperateType())); + if (vo.getUpdateTime() != null && vo.getCreateTime() != null) { + vo.setRunDuration(getDuration(vo.getUpdateTime().getTime() - vo.getCreateTime().getTime())); + } + } + map.put("list", list); + try { + String flowChart = defService.flowChart(flowInstance.getId()); + map.put("image", flowChart); + } catch (IOException e) { + throw new RuntimeException(e); + } + return map; + } + + /** + * 任务完成时间处理 + * + * @param time 时间 + */ + private String getDuration(long time) { + + long day = time / (24 * 60 * 60 * 1000); + long hour = (time / (60 * 60 * 1000) - day * 24); + long minute = ((time / (60 * 1000)) - day * 24 * 60 - hour * 60); + long second = (time / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); + + if (day > 0) { + return day + "天" + hour + "小时" + minute + "分钟"; + } + if (hour > 0) { + return hour + "小时" + minute + "分钟"; + } + if (minute > 0) { + return minute + "分钟"; + } + if (second > 0) { + return second + "秒"; + } else { + return 0 + "秒"; + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 3bc3b623e..e67cbf1ea 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -5,13 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; -import com.warm.flow.core.entity.HisTask; -import com.warm.flow.core.entity.Instance; -import com.warm.flow.core.entity.Task; -import com.warm.flow.core.entity.User; +import com.warm.flow.core.entity.*; import com.warm.flow.core.enums.FlowStatus; import com.warm.flow.core.enums.NodeType; import com.warm.flow.core.enums.SkipType; +import com.warm.flow.core.service.DefService; import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.service.UserService; @@ -32,6 +30,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; @@ -64,6 +63,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlowTaskMapper flowTaskMapper; private final FlowHisTaskMapper flowHisTaskMapper; private final FlowSkipMapper flowSkipMapper; + private final FlowProcessEventHandler flowProcessEventHandler; + private final DefService defService; /** * 启动任务 @@ -126,14 +127,31 @@ public class FlwTaskServiceImpl implements IFlwTaskService { try { String userId = String.valueOf(LoginHelper.getUserId()); Long taskId = completeTaskBo.getTaskId(); + FlowTask flowTask = flowTaskMapper.selectById(taskId); + Instance ins = insService.getById(flowTask.getInstanceId()); + //流程定义 + Definition definition = defService.getById(flowTask.getDefinitionId()); + //流程提交监听 + if (FlowStatus.TOBESUBMIT.getKey().equals(ins.getFlowStatus()) || FlowStatus.REJECT.getKey().equals(ins.getFlowStatus())) { + flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); + } + //办理任务监听 + flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), + taskId.toString(), ins.getBusinessId()); FlowParams flowParams = new FlowParams(); flowParams.variable(completeTaskBo.getVariables()); flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); - Instance instance = taskService.skip(taskId, flowParams); - setHandler(instance); + setHandler(taskService.skip(taskId, flowParams)); + //判断是否流程结束 + Instance instance = insService.getById(ins.getId()); + if (FlowStatus.isFinished(instance.getFlowStatus())) { + //流程结束执行监听 + flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), + FlowStatus.FINISHED.getKey(), false); + } return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -297,6 +315,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException("任务不存在!"); } Long definitionId = flowTasks.get(0).getDefinitionId(); + Definition definition = defService.getById(definitionId); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); //开始节点的下一节点 @@ -316,6 +335,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.setPermissionFlag(WorkflowUtils.permissionList()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance); + flowProcessEventHandler.processHandler(definition.getFlowCode(), + instance.getBusinessId(), FlowStatus.REJECT.getKey(), false); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -340,4 +361,32 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } return Collections.emptyList(); } + + /** + * 终止任务 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean terminationTask(TerminationBo bo) { + try { + FlowTask flowTask = flowTaskMapper.selectById(bo.getTaskId()); + Instance ins = insService.getById(flowTask.getInstanceId()); + //流程定义 + Definition definition = defService.getById(flowTask.getDefinitionId()); + FlowParams flowParams = new FlowParams(); + flowParams.handler(String.valueOf(LoginHelper.getUserId())); + flowParams.message(bo.getComment()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + taskService.termination(bo.getTaskId(), flowParams); + //流程终止监听 + flowProcessEventHandler.processHandler(definition.getFlowCode(), + ins.getBusinessId(), FlowStatus.INVALID.getKey(), false); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index e4ef38ce6..a99a578d6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.warm.flow.core.enums.FlowStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; @@ -84,7 +85,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { public TestLeaveVo insertByBo(TestLeaveBo bo) { TestLeave add = MapstructUtils.convert(bo, TestLeave.class); if (StringUtils.isBlank(add.getStatus())) { - add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); + add.setStatus(FlowStatus.TOBESUBMIT.getKey()); } boolean flag = baseMapper.insert(add) > 0; if (flag) { @@ -116,25 +117,25 @@ public class TestLeaveServiceImpl implements ITestLeaveService { /** * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) - * 正常使用只需#processEvent.key=='leave1' + * 正常使用只需#processEvent.flowCode=='leave1' * 示例为了方便则使用startsWith匹配了全部示例key * * @param processEvent 参数 */ - @EventListener(condition = "#processEvent.key.startsWith('leave')") + @EventListener(condition = "#processEvent.flowCode.startsWith('leaveFlow-serial1')") public void processHandler(ProcessEvent processEvent) { log.info("当前任务执行了{}", processEvent.toString()); TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey())); testLeave.setStatus(processEvent.getStatus()); if (processEvent.isSubmit()) { - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + testLeave.setStatus(FlowStatus.APPROVAL.getKey()); } baseMapper.updateById(testLeave); } /** * 执行办理任务监听 - * 示例:也可通过 @EventListener(condition = "#processTaskEvent.key=='leave1'")进行判断 + * 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断 * 在方法中判断流程节点key * if ("xxx".equals(processTaskEvent.getTaskDefinitionKey())) { * //执行业务逻辑 @@ -142,11 +143,11 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * * @param processTaskEvent 参数 */ - @EventListener(condition = "#processTaskEvent.key=='leave1' && #processTaskEvent.taskDefinitionKey=='Activity_14633hx'") + @EventListener(condition = "#processTaskEvent.flowCode=='leaveFlow-serial1' && #processTaskEvent.nodeCode=='Activity_14633hx'") public void processTaskHandler(ProcessTaskEvent processTaskEvent) { log.info("当前任务执行了{}", processTaskEvent.toString()); TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + testLeave.setStatus(FlowStatus.APPROVAL.getKey()); baseMapper.updateById(testLeave); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 20d5d3c2f..62412781f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,9 +1,7 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; import lombok.AccessLevel; @@ -14,12 +12,7 @@ import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.dromara.workflow.common.enums.MessageTypeEnum; -import org.dromara.workflow.domain.vo.ParticipantVo; import java.util.*; @@ -31,56 +24,6 @@ import java.util.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { - /** - * 发送消息 - * - * @param list 任务 - * @param name 流程名称 - * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 - */ - public static void sendMessage(List list, String name, List messageType, String message, UserService userService) { - Set userIds = new HashSet<>(); - if (StringUtils.isBlank(message)) { - message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。"; - } - for (Task t : list) { - ParticipantVo taskParticipant = null; //= WorkflowUtils.getCurrentTaskParticipant(t.getId(), userService); - if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { - List userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); - if (CollUtil.isNotEmpty(userIdList)) { - userIds.addAll(userIdList); - } - } - List candidate = taskParticipant.getCandidate(); - if (CollUtil.isNotEmpty(candidate)) { - userIds.addAll(candidate); - } - } - if (CollUtil.isNotEmpty(userIds)) { - List userList = userService.selectListByIds(new ArrayList<>(userIds)); - for (String code : messageType) { - MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); - if (ObjectUtil.isNotEmpty(messageTypeEnum)) { - switch (messageTypeEnum) { - case SYSTEM_MESSAGE: - WebSocketMessageDto dto = new WebSocketMessageDto(); - dto.setSessionKeys(new ArrayList<>(userIds)); - dto.setMessage(message); - WebSocketUtils.publishMessage(dto); - break; - case EMAIL_MESSAGE: - MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); - break; - case SMS_MESSAGE: - //todo 短信发送 - break; - } - } - } - } - } - /** * 当前用户所有权限 * diff --git a/script/bpmn/leaveFlow-serial1.xml b/script/bpmn/leaveFlow-serial1.xml index 34fedaadd..5f51196ac 100644 --- a/script/bpmn/leaveFlow-serial1.xml +++ b/script/bpmn/leaveFlow-serial1.xml @@ -1,38 +1,40 @@ - + + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"> 2 + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"> 3 + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"> 4 + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"> 5 2 + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"> 6 + listenerType="start,assignment,finish,create" + listenerPath="com.ruoyi.system.Listener.StartListener@@com.ruoyi.system.Listener.AssignmentListener@@com.ruoyi.system.Listener.FinishListener@@com.ruoyi.system.Listener.CreateListener"/> From c409a3a58226ab8cd1482cba5d2b63372ac658f8 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 26 Oct 2024 19:53:09 +0800 Subject: [PATCH 042/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/mapper/FlwDefMapper.java | 26 +++++++++++++++++++ .../impl/FlwDefinitionServiceImpl.java | 14 +++++----- .../mapper/workflow/FlwDefMapper.xml | 14 ++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java new file mode 100644 index 000000000..b7131184e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java @@ -0,0 +1,26 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.warm.flow.orm.entity.FlowDefinition; +import org.apache.ibatis.annotations.Param; + +/** + * 实例信息Mapper接口 + * + * @author may + * @date 2024-03-02 + */ +public interface FlwDefMapper { + /** + * 流程实例信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + + Page page(@Param("page") Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index c878a3425..f0604913f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -3,10 +3,11 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.entity.Definition; import com.warm.flow.core.enums.PublishStatus; import com.warm.flow.core.service.DefService; -import com.warm.flow.core.utils.page.Page; import com.warm.flow.orm.entity.FlowDefinition; import com.warm.flow.orm.mapper.FlowDefinitionMapper; import jakarta.servlet.http.HttpServletResponse; @@ -19,6 +20,7 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -37,8 +39,8 @@ import java.util.List; @Service public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final DefService defService; - private final FlowDefinitionMapper flowDefinitionMapper; + private final FlwDefMapper flwDefMapper; /** * 分页查询 @@ -48,10 +50,11 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { */ @Override public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { - Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); - page = defService.orderByCreateTime().desc().page(flowDefinition, page); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("create_time"); + Page page = flwDefMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getList(), FlowDefinitionVo.class)); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); build.setTotal(page.getTotal()); return build; } @@ -65,7 +68,6 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { public List getHisListByKey(String flowCode) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(FlowDefinition::getFlowCode, flowCode); - wrapper.in(FlowDefinition::getIsPublish, Arrays.asList(PublishStatus.UNPUBLISHED.getKey(), PublishStatus.EXPIRED.getKey())); List list = flowDefinitionMapper.selectList(wrapper); return BeanUtil.copyToList(list, FlowDefinitionVo.class); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml new file mode 100644 index 000000000..ce3912789 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -0,0 +1,14 @@ + + + + + + From dcb1e6e05f891948fffa8f31208b7559ccae261d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 27 Oct 2024 13:20:27 +0800 Subject: [PATCH 043/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=8A=9E?= =?UTF-8?q?=E7=90=86=20=E9=A9=B3=E5=9B=9E=20=E7=BB=88=E6=AD=A2=E7=AD=89?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/IFlwInstanceService.java | 8 +++++++ .../service/impl/FlwInstanceServiceImpl.java | 24 +++++++++++++++++-- .../service/impl/FlwTaskServiceImpl.java | 23 ++++++++++++++---- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 65712a22e..b491f9f9a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -83,4 +83,12 @@ public interface IFlwInstanceService { * @return 结果 */ Map getFlowImage(String businessId); + + /** + * 按照实例id更新状态 + * + * @param instanceId 实例id + * @param status 状态 + */ + void updateStatus(Long instanceId, String status); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 00302d1b3..875e51b93 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.entity.*; @@ -162,7 +163,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { List flowInstanceVos = BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class); if (CollUtil.isNotEmpty(flowInstanceVos)) { List definitionIds = StreamUtils.toList(flowInstanceVos, FlowInstanceVo::getDefinitionId); - List flowDefinitions = flowDefinitionMapper.selectBatchIds(definitionIds); + List flowDefinitions = flowDefinitionMapper.selectByIds(definitionIds); for (FlowInstanceVo vo : flowInstanceVos) { flowDefinitions.stream().filter(e -> e.getId().toString().equals(vo.getDefinitionId().toString())).findFirst().ifPresent(e -> { vo.setFlowName(e.getFlowName()); @@ -178,9 +179,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return build; } + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + */ @Override public Map getFlowImage(String businessId) { - Map map = new HashMap<>(); + Map map = new HashMap<>(16); FlowInstance flowInstance = instanceByBusinessId(businessId); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); @@ -231,4 +237,18 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return 0 + "秒"; } } + + /** + * 按照实例id更新状态 + * + * @param instanceId 实例id + * @param status 状态 + */ + @Override + public void updateStatus(Long instanceId, String status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.set(FlowInstance::getFlowStatus, status); + wrapper.eq(FlowInstance::getId, instanceId); + flowInstanceMapper.update(wrapper); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index e67cbf1ea..b897dda6d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -22,12 +22,14 @@ import com.warm.flow.orm.mapper.FlowSkipMapper; import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.*; import org.dromara.workflow.handler.FlowProcessEventHandler; @@ -100,6 +102,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); flowParams.setHandler(String.valueOf(LoginHelper.getUserId())); + flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { instance = insService.start(startProcessBo.getBusinessKey(), flowParams); @@ -132,7 +135,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //流程定义 Definition definition = defService.getById(flowTask.getDefinitionId()); //流程提交监听 - if (FlowStatus.TOBESUBMIT.getKey().equals(ins.getFlowStatus()) || FlowStatus.REJECT.getKey().equals(ins.getFlowStatus())) { + if (BusinessStatusEnum.DRAFT.getStatus().equals(ins.getFlowStatus()) || BusinessStatusEnum.CANCEL.getStatus().equals(ins.getFlowStatus()) + || BusinessStatusEnum.BACK.getStatus().equals(ins.getFlowStatus())) { flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); } //办理任务监听 @@ -144,13 +148,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.message(completeTaskBo.getMessage()); flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()) + .hisStatus(TaskStatusEnum.PASS.getStatus()); setHandler(taskService.skip(taskId, flowParams)); + iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); //判断是否流程结束 Instance instance = insService.getById(ins.getId()); if (FlowStatus.isFinished(instance.getFlowStatus())) { + iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); //流程结束执行监听 flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), - FlowStatus.FINISHED.getKey(), false); + BusinessStatusEnum.FINISH.getStatus(), false); } return true; } catch (Exception e) { @@ -194,7 +202,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); - queryWrapper.in("t.flow_status", FlowStatus.APPROVAL.getKey()); + queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); return TableDataInfo.build(page); } @@ -326,9 +334,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.variable(bo.getVariables()); if (nextNodeCode.equals(bo.getNodeCode())) { flowParams.skipType(SkipType.REJECT.getKey()); + flowParams.flowStatus(BusinessStatusEnum.BACK.getStatus()); } else { flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()); } + flowParams.hisStatus(TaskStatusEnum.BACK.getStatus()); flowParams.message(bo.getMessage()); flowParams.handler(userId); flowParams.nodeCode(bo.getNodeCode()); @@ -336,7 +347,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = taskService.skip(taskId, flowParams); setHandler(instance); flowProcessEventHandler.processHandler(definition.getFlowCode(), - instance.getBusinessId(), FlowStatus.REJECT.getKey(), false); + instance.getBusinessId(), BusinessStatusEnum.BACK.getStatus(), false); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -379,10 +390,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.handler(String.valueOf(LoginHelper.getUserId())); flowParams.message(bo.getComment()); flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) + .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); taskService.termination(bo.getTaskId(), flowParams); //流程终止监听 flowProcessEventHandler.processHandler(definition.getFlowCode(), - ins.getBusinessId(), FlowStatus.INVALID.getKey(), false); + ins.getBusinessId(), BusinessStatusEnum.TERMINATION.getStatus(), false); return true; } catch (Exception e) { log.error(e.getMessage(), e); From fc44fd7790cb61f5f93ba763a6978609ac189df4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 6 Nov 2024 17:07:48 +0800 Subject: [PATCH 044/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/BusinessStatusEnum.java | 16 +++ .../common/satoken/utils/LoginHelper.java | 7 + .../controller/FlwTaskController.java | 10 +- .../workflow/domain/bo/CompleteTaskBo.java | 1 - .../workflow/domain/bo/DelegateBo.java | 1 - .../workflow/domain/bo/FlowInstanceBo.java | 3 + .../workflow/domain/bo/FlowTaskBo.java | 3 + .../impl/FlwDefinitionServiceImpl.java | 2 - .../service/impl/FlwTaskServiceImpl.java | 120 ++++++++++++------ .../dromara/workflow/utils/WorkflowUtils.java | 69 +++++----- 10 files changed, 152 insertions(+), 80 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 0af943a78..580d8b136 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -16,18 +16,22 @@ import java.util.Arrays; @Getter @AllArgsConstructor public enum BusinessStatusEnum { + /** * 已撤销 */ CANCEL("cancel", "已撤销"), + /** * 草稿 */ DRAFT("draft", "草稿"), + /** * 待审核 */ WAITING("waiting", "待审核"), + /** * 已完成 */ @@ -36,10 +40,12 @@ public enum BusinessStatusEnum { * 已作废 */ INVALID("invalid", "已作废"), + /** * 已退回 */ BACK("back", "已退回"), + /** * 已终止 */ @@ -71,6 +77,16 @@ public enum BusinessStatusEnum { .orElse(StrUtil.EMPTY); } + /** + * 判断是否为指定的状态之一:草稿、已撤销或已退回 + * + * @param status 要检查的状态 + * @return 如果状态为草稿、已撤销或已退回之一,则返回 true;否则返回 false + */ + public static boolean isDraftOrCancelOrBack(String status) { + return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); + } + /** * 启动流程校验 * diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 4ab7d4eeb..0f8e8391a 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -88,6 +88,13 @@ public class LoginHelper { return Convert.toLong(getExtra(USER_KEY)); } + /** + * 获取用户id + */ + public static String getUserIdStr() { + return Convert.toStr(getExtra(USER_KEY)); + } + /** * 获取用户账户 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 16ee315a4..85fb17ace 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -173,7 +173,7 @@ public class FlwTaskController extends BaseController { public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { return toAjax(taskService.depute( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), Collections.singletonList(bo.getUserId()), bo.getMessage())); @@ -190,7 +190,7 @@ public class FlwTaskController extends BaseController { public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { return toAjax(taskService.transfer( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), Collections.singletonList(bo.getUserId()), bo.getMessage())); @@ -207,7 +207,7 @@ public class FlwTaskController extends BaseController { public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { return toAjax(taskService.addSignature( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), bo.getUserIds(), bo.getMessage())); @@ -224,7 +224,7 @@ public class FlwTaskController extends BaseController { public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { return toAjax(taskService.reductionSignature( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), bo.getUserIds(), bo.getMessage())); @@ -246,7 +246,7 @@ public class FlwTaskController extends BaseController { .setPermissionFlag(WorkflowUtils.permissionList()) .setCooperateType(CooperateType.APPROVAL.getKey()) .setMessage("修改任务办理人") - .setCurUser(String.valueOf(LoginHelper.getUserId())) + .setCurUser(LoginHelper.getUserIdStr()) .setIgnore(false); return toAjax(taskService.updateHandler(modifyHandler)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 7da247df1..b83942a71 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java index a560b9530..5738cd367 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java @@ -6,7 +6,6 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; -import java.util.List; /** * 委派任务请求对象 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index df8b6be7d..18305ebbe 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -37,5 +37,8 @@ public class FlowInstanceBo implements Serializable { */ private Long instanceId; + /** + * 权限列表 + */ private List permissionList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 74a5d554e..59e6bac1b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -38,5 +38,8 @@ public class FlowTaskBo implements Serializable { */ private Long instanceId; + /** + * 权限列表 + */ private List permissionList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index f0604913f..0edade533 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.entity.Definition; -import com.warm.flow.core.enums.PublishStatus; import com.warm.flow.core.service.DefService; import com.warm.flow.orm.entity.FlowDefinition; import com.warm.flow.orm.mapper.FlowDefinitionMapper; @@ -26,7 +25,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.Arrays; import java.util.List; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index b897dda6d..c92ad1e3a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -31,7 +31,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; @@ -44,7 +46,8 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; -import static org.dromara.workflow.common.constant.FlowConstant.*; +import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY; +import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; /** * 任务 服务层实现 @@ -76,36 +79,35 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override @Transactional(rollbackFor = Exception.class) public Map startWorkFlow(StartProcessBo startProcessBo) { - Map map = new HashMap<>(16); - if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { + String businessKey = startProcessBo.getBusinessKey(); + String userId = LoginHelper.getUserIdStr(); + if (StringUtils.isBlank(businessKey)) { throw new ServiceException("启动工作流时必须包含业务ID"); } // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 流程发起人 - variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); + variables.put(INITIATOR, userId); // 业务id - variables.put(BUSINESS_KEY, startProcessBo.getBusinessKey()); + variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); if (wfDefinitionConfigVo == null) { throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); } - FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(startProcessBo.getBusinessKey()); + FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - map.put("processInstanceId", taskList.get(0).getInstanceId()); - map.put("taskId", taskList.get(0).getId()); - return map; + return buildMap(taskList.get(0).getInstanceId(), taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - flowParams.setHandler(String.valueOf(LoginHelper.getUserId())); + flowParams.setHandler(userId); flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { - instance = insService.start(startProcessBo.getBusinessKey(), flowParams); + instance = insService.start(businessKey, flowParams); } catch (Exception e) { throw new ServiceException(e.getMessage()); } @@ -114,9 +116,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } - map.put("processInstanceId", instance.getId()); - map.put("taskId", taskList.get(0).getId()); - return map; + return buildMap(instance.getId(), taskList.get(0).getId()); + } + + /** + * 构建一个包含给定 `processInstanceId` 和 `taskId` 的 Map + * + * @param instanceId 流程实例的 ID + * @param taskId 任务的 ID + * @return 返回一个包含 `processInstanceId` 和 `taskId` 的不可变 Map + */ + private Map buildMap(Object instanceId, Object taskId) { + return Map.of("processInstanceId", instanceId, "taskId", taskId); } /** @@ -128,35 +139,46 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Transactional(rollbackFor = Exception.class) public boolean completeTask(CompleteTaskBo completeTaskBo) { try { - String userId = String.valueOf(LoginHelper.getUserId()); + // 获取当前用户ID作为任务处理人 + String userId = LoginHelper.getUserIdStr(); + + // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); - //流程定义 + + // 获取流程定义信息 Definition definition = defService.getById(flowTask.getDefinitionId()); - //流程提交监听 - if (BusinessStatusEnum.DRAFT.getStatus().equals(ins.getFlowStatus()) || BusinessStatusEnum.CANCEL.getStatus().equals(ins.getFlowStatus()) - || BusinessStatusEnum.BACK.getStatus().equals(ins.getFlowStatus())) { + + // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 + if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); } - //办理任务监听 - flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), - taskId.toString(), ins.getBusinessId()); + + // 办理任务监听,记录任务执行信息 + flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), taskId.toString(), ins.getBusinessId()); + + // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 FlowParams flowParams = new FlowParams(); flowParams.variable(completeTaskBo.getVariables()); flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); - flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()) - .hisStatus(TaskStatusEnum.PASS.getStatus()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); + + // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams)); + + // 更新实例状态为待审核状态 iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); //判断是否流程结束 Instance instance = insService.getById(ins.getId()); + // 重新获取实例信息,检查流程是否已结束 if (FlowStatus.isFinished(instance.getFlowStatus())) { + // 若流程已结束,更新状态为已完成 iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - //流程结束执行监听 + // 流程结束监听,处理结束后的业务逻辑 flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), BusinessStatusEnum.FINISH.getStatus(), false); } @@ -174,19 +196,22 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ private void setHandler(Instance instance) { if (instance != null) { + // 根据流程实例ID查询所有关联的任务 List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) .eq(FlowTask::getInstanceId, instance.getId())); + + // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { + // 获取与当前任务关联的用户列表 List userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); - if (CollUtil.isNotEmpty(userList)) { - Set users = WorkflowUtils.getUser(userList); - if (CollUtil.isNotEmpty(users)) { - userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); - for (User user : users) { - user.setAssociated(flowTask.getId()); - } - userService.saveBatch(new ArrayList<>(users)); - } + // 通过工具方法过滤和获取有效用户 + Set users = WorkflowUtils.getUser(userList); + if (CollUtil.isNotEmpty(users)) { + // 删除现有的任务办理人记录,确保后续数据清理和更新 + userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); + // 将新的办理人关联到任务ID,并批量保存新的办理人列表 + users.forEach(user -> user.setAssociated(flowTask.getId())); + userService.saveBatch(new ArrayList<>(users)); } } } @@ -235,6 +260,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return TableDataInfo.build(page); } + /** + * 构建待处理任务分页对象 + * + * @param pageQuery 分页查询对象 + * @param queryWrapper 查询条件封装对象 + * @param flowTaskBo 流程任务业务对象 + * @return 分页后的待处理任务列表 + */ private Page buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { commonCondition(queryWrapper, flowTaskBo); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); @@ -281,14 +314,21 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return TableDataInfo.build(page); } + /** + * 构建已完成任务分页对象 + * + * @param pageQuery 分页查询对象 + * @param queryWrapper 查询条件封装对象 + * @param flowTaskBo 流程任务业务对象 + * @return 分页后的已完成任务列表 + */ private Page buildTaskFinishPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { commonCondition(queryWrapper, flowTaskBo); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); List records = page.getRecords(); + // 如果有任务记录,为每条记录设置流程状态名称 if (CollUtil.isNotEmpty(records)) { - for (FlowHisTaskVo data : records) { - data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); - } + records.forEach(data -> data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus()))); } return page; } @@ -316,7 +356,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public boolean backProcess(BackProcessBo bo) { try { - String userId = String.valueOf(LoginHelper.getUserId()); + String userId = LoginHelper.getUserIdStr(); Long taskId = bo.getTaskId(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { @@ -387,7 +427,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //流程定义 Definition definition = defService.getById(flowTask.getDefinitionId()); FlowParams flowParams = new FlowParams(); - flowParams.handler(String.valueOf(LoginHelper.getUserId())); + flowParams.handler(LoginHelper.getUserIdStr()); flowParams.message(bo.getComment()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 62412781f..63a769375 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -31,10 +31,9 @@ public class WorkflowUtils { */ public static List permissionList() { List roles = LoginHelper.getLoginUser().getRoles(); - Long userId = LoginHelper.getUserId(); Long deptId = LoginHelper.getDeptId(); List permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId()); - permissionList.add(String.valueOf(userId)); + permissionList.add(LoginHelper.getUserIdStr()); permissionList.add("dept:" + deptId); return permissionList; } @@ -90,38 +89,46 @@ public class WorkflowUtils { if (CollUtil.isNotEmpty(userList)) { UserService userService = SpringUtils.getBean(UserService.class); for (User user : userList) { - if (user.getProcessedBy().startsWith("user:")) { - Long userId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List users = userService.selectListByIds(List.of(userId)); - if (CollUtil.isNotEmpty(users)) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(StreamUtils.toList(users, UserDTO::getUserId).get(0))); - list.add(u); - } - } - if (user.getProcessedBy().startsWith("role:")) { - Long roleId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List roleUsers = userService.selectUsersByRoleIds(List.of(roleId)); - for (UserDTO roleUser : roleUsers) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(roleUser.getUserId())); - list.add(u); - } - } - if (user.getProcessedBy().startsWith("dept:")) { - Long deptId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List deptUsers = userService.selectUsersByDeptIds(List.of(deptId)); - for (UserDTO deptUser : deptUsers) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(deptUser.getUserId())); - list.add(u); - } + // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 + List users = getAssociatedUsers(userService, user); + // 转换为 FlowUser 并添加到结果集合 + if (CollUtil.isNotEmpty(users)) { + users.forEach(dto -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(user.getType()); + flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + list.add(flowUser); + }); } } } return list; } + + /** + * 根据用户的 `processedBy` 前缀(user、role、dept)获取关联的用户列表 + * + * @param userService 用户服务,用于从数据库中查询用户信息 + * @param user 办理用户实例,通过 `processedBy` 字段识别处理人类型 + * @return 返回符合条件的用户DTO列表,如果未找到匹配的前缀则返回空列表 + */ + private static List getAssociatedUsers(UserService userService, User user) { + String processedBy = user.getProcessedBy(); + // 提取 processedBy 字段中 ":" 后的部分作为ID + Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); + + if (processedBy.startsWith("user:")) { + // 如果前缀为 "user:",根据用户ID查询 + return userService.selectListByIds(List.of(id)); + } else if (processedBy.startsWith("role:")) { + // 如果前缀为 "role:",根据角色ID查询用户 + return userService.selectUsersByRoleIds(List.of(id)); + } else if (processedBy.startsWith("dept:")) { + // 如果前缀为 "dept:",根据部门ID查询用户 + return userService.selectUsersByDeptIds(List.of(id)); + } + // 未匹配任何前缀,返回空列表 + return Collections.emptyList(); + } + } From 64f950437e2d7b114a9da5f0d01414470d2d46e4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 6 Nov 2024 17:51:19 +0800 Subject: [PATCH 045/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=B7=A5=E5=85=B7=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/FormTypeEnum.java | 20 ++--- .../common/enums/MessageTypeEnum.java | 20 ++--- .../workflow/common/enums/TaskStatusEnum.java | 30 ++++--- .../dromara/workflow/mapper/FlwDefMapper.java | 4 +- .../workflow/mapper/FlwInstanceMapper.java | 4 +- .../workflow/mapper/FlwTaskMapper.java | 10 +-- .../dromara/workflow/utils/WorkflowUtils.java | 79 +++++++++---------- 7 files changed, 86 insertions(+), 81 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java index 083ab7b85..ae043bdb6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java @@ -3,9 +3,10 @@ package org.dromara.workflow.common.enums; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; /** * 任务状态枚举 @@ -15,10 +16,12 @@ import java.util.Arrays; @Getter @AllArgsConstructor public enum FormTypeEnum { + /** * 自定义表单 */ STATIC("static", "自定义表单"), + /** * 动态表单 */ @@ -34,21 +37,18 @@ public enum FormTypeEnum { */ private final String desc; + private static final Map TYPE_DESC_MAP = Arrays.stream(values()) + .collect(Collectors.toConcurrentMap(FormTypeEnum::getType, FormTypeEnum::getDesc)); + /** * 表单类型 * * @param formType 表单类型 */ public static String findByType(String formType) { - if (StringUtils.isBlank(formType)) { - return StrUtil.EMPTY; - } - - return Arrays.stream(FormTypeEnum.values()) - .filter(statusEnum -> statusEnum.getType().equals(formType)) - .findFirst() - .map(FormTypeEnum::getDesc) - .orElse(StrUtil.EMPTY); + // 从缓存中直接获取描述 + return TYPE_DESC_MAP.getOrDefault(formType, StrUtil.EMPTY); } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java index a28295822..0fe5cfe90 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java @@ -3,8 +3,10 @@ package org.dromara.workflow.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 消息类型枚举 @@ -14,14 +16,17 @@ import java.util.concurrent.ConcurrentHashMap; @Getter @AllArgsConstructor public enum MessageTypeEnum { + /** * 站内信 */ SYSTEM_MESSAGE("1", "站内信"), + /** * 邮箱 */ EMAIL_MESSAGE("2", "邮箱"), + /** * 短信 */ @@ -31,21 +36,18 @@ public enum MessageTypeEnum { private final String desc; - private final static Map MESSAGE_TYPE_ENUM_MAP = new ConcurrentHashMap<>(MessageTypeEnum.values().length); - - static { - for (MessageTypeEnum messageType : MessageTypeEnum.values()) { - MESSAGE_TYPE_ENUM_MAP.put(messageType.code, messageType); - } - } + private static final Map MESSAGE_TYPE_ENUM_MAP = Arrays.stream(values()) + .collect(Collectors.toConcurrentMap(MessageTypeEnum::getCode, Function.identity())); /** * 根据消息类型 code 获取 MessageTypeEnum + * * @param code 消息类型code * @return MessageTypeEnum */ public static MessageTypeEnum getByCode(String code) { - return MESSAGE_TYPE_ENUM_MAP.get(code); + return MESSAGE_TYPE_ENUM_MAP.getOrDefault(code, null); } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java index 7b2f55c20..f6eca80cd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -3,9 +3,10 @@ package org.dromara.workflow.common.enums; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; /** * 任务状态枚举 @@ -15,50 +16,62 @@ import java.util.Arrays; @Getter @AllArgsConstructor public enum TaskStatusEnum { + /** * 撤销 */ CANCEL("cancel", "撤销"), + /** * 通过 */ PASS("pass", "通过"), + /** * 待审核 */ WAITING("waiting", "待审核"), + /** * 作废 */ INVALID("invalid", "作废"), + /** * 退回 */ BACK("back", "退回"), + /** * 终止 */ TERMINATION("termination", "终止"), + /** * 转办 */ TRANSFER("transfer", "转办"), + /** * 委托 */ PENDING("pending", "委托"), + /** * 抄送 */ COPY("copy", "抄送"), + /** * 加签 */ SIGN("sign", "加签"), + /** * 减签 */ SIGN_OFF("sign_off", "减签"), + /** * 超时 */ @@ -74,21 +87,18 @@ public enum TaskStatusEnum { */ private final String desc; + private static final Map STATUS_DESC_MAP = Arrays.stream(values()) + .collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc)); + /** * 任务业务状态 * * @param status 状态 */ public static String findByStatus(String status) { - if (StringUtils.isBlank(status)) { - return StrUtil.EMPTY; - } - - return Arrays.stream(TaskStatusEnum.values()) - .filter(statusEnum -> statusEnum.getStatus().equals(status)) - .findFirst() - .map(TaskStatusEnum::getDesc) - .orElse(StrUtil.EMPTY); + // 从缓存中直接获取描述 + return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY); } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java index b7131184e..4b316d98d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java @@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Param; * @date 2024-03-02 */ public interface FlwDefMapper { + /** * 流程实例信息 * @@ -20,7 +21,6 @@ public interface FlwDefMapper { * @param queryWrapper 条件 * @return 结果 */ + Page page(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - Page page(@Param("page") Page page, - @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index 6bb0f1ece..bf63475f7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -14,6 +14,7 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo; * @date 2024-03-02 */ public interface FlwInstanceMapper { + /** * 流程实例信息 * @@ -21,7 +22,6 @@ public interface FlwInstanceMapper { * @param queryWrapper 条件 * @return 结果 */ + Page page(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - Page page(@Param("page") Page page, - @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index cad896379..18a37d081 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -17,6 +17,7 @@ import org.dromara.workflow.domain.vo.FlowTaskVo; * @date 2024-03-02 */ public interface FlwTaskMapper { + /** * 获取待办信息 * @@ -24,8 +25,7 @@ public interface FlwTaskMapper { * @param queryWrapper 条件 * @return 结果 */ - Page getTaskWaitByPage(@Param("page") Page page, - @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 获取已办 @@ -34,8 +34,7 @@ public interface FlwTaskMapper { * @param queryWrapper 条件 * @return 结果 */ - Page getTaskFinishByPage(@Param("page") Page page, - @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page getTaskFinishByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 查询当前用户的抄送 @@ -44,6 +43,5 @@ public interface FlwTaskMapper { * @param queryWrapper 条件 * @return 结果 */ - Page getTaskCopyByPage(@Param("page") Page page, - @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 63a769375..4977a66bb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -45,36 +45,30 @@ public class WorkflowUtils { * @return 用户 */ public static List getHandlerUser(List userList) { - List userDTOList = new ArrayList<>(); - if (CollUtil.isNotEmpty(userList)) { - UserService userService = SpringUtils.getBean(UserService.class); - List userIds = new ArrayList<>(); - List roleIds = new ArrayList<>(); - List deptIds = new ArrayList<>(); - for (User user : userList) { - if (user.getProcessedBy().startsWith("user:")) { - userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); - } else if (user.getProcessedBy().startsWith("role:")) { - roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); - } else if (user.getProcessedBy().startsWith("dept:")) { - deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); - } else { - userIds.add(Long.valueOf(user.getProcessedBy())); - } - } - List users = userService.selectListByIds(userIds); - if (CollUtil.isNotEmpty(users)) { - userDTOList.addAll(users); - } - List roleUsers = userService.selectUsersByRoleIds(roleIds); - if (CollUtil.isNotEmpty(roleUsers)) { - userDTOList.addAll(roleUsers); - } - List deptUsers = userService.selectUsersByDeptIds(deptIds); - if (CollUtil.isNotEmpty(deptUsers)) { - userDTOList.addAll(deptUsers); + if (CollUtil.isEmpty(userList)) { + return List.of(); + } + UserService userService = SpringUtils.getBean(UserService.class); + List userIds = new ArrayList<>(); + List roleIds = new ArrayList<>(); + List deptIds = new ArrayList<>(); + for (User user : userList) { + String processedBy = user.getProcessedBy(); + Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); + if (processedBy.startsWith("user:")) { + userIds.add(id); + } else if (processedBy.startsWith("role:")) { + roleIds.add(id); + } else if (processedBy.startsWith("dept:")) { + deptIds.add(id); + } else { + userIds.add(Long.valueOf(processedBy)); } } + // 合并不同类型用户 + List userDTOList = new ArrayList<>(userService.selectListByIds(userIds)); + userDTOList.addAll(userService.selectUsersByRoleIds(roleIds)); + userDTOList.addAll(userService.selectUsersByDeptIds(deptIds)); return userDTOList; } @@ -85,21 +79,22 @@ public class WorkflowUtils { * @return 用户 */ public static Set getUser(List userList) { + if (CollUtil.isEmpty(userList)) { + return Set.of(); + } Set list = new HashSet<>(); - if (CollUtil.isNotEmpty(userList)) { - UserService userService = SpringUtils.getBean(UserService.class); - for (User user : userList) { - // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = getAssociatedUsers(userService, user); - // 转换为 FlowUser 并添加到结果集合 - if (CollUtil.isNotEmpty(users)) { - users.forEach(dto -> { - FlowUser flowUser = new FlowUser(); - flowUser.setType(user.getType()); - flowUser.setProcessedBy(String.valueOf(dto.getUserId())); - list.add(flowUser); - }); - } + UserService userService = SpringUtils.getBean(UserService.class); + for (User user : userList) { + // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 + List users = getAssociatedUsers(userService, user); + // 转换为 FlowUser 并添加到结果集合 + if (CollUtil.isNotEmpty(users)) { + users.forEach(dto -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(user.getType()); + flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + list.add(flowUser); + }); } } return list; From 22cd701d94db3f071cb7da913e079e79e2a3cf64 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 10:02:15 +0800 Subject: [PATCH 046/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=8A=9E=E7=90=86=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/dto/TaskAssigneeDTO.java | 102 ++++++++++++++ .../core/domain/model/TaskAssigneeBody.java | 56 ++++++++ .../common/core/service/UserService.java | 10 ++ .../service/impl/SysUserServiceImpl.java | 33 +++++ .../common/enums/TaskAssigneeEnum.java | 109 +++++++++++++++ .../impl/WfTaskAssigneeServiceImpl.java | 125 ++++++++++++++++++ .../dromara/workflow/utils/WorkflowUtils.java | 18 +-- 7 files changed, 444 insertions(+), 9 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java new file mode 100644 index 000000000..4465c0457 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -0,0 +1,102 @@ +package org.dromara.common.core.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 任务受让人 + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class TaskAssigneeDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 总大小 + */ + private Long total = 0L; + + /** + * + */ + private List list; + + public TaskAssigneeDTO(Long total, List list) { + this.total = total; + this.list = list; + } + + /** + * 将源列表转换为 TaskHandler 列表 + * + * @param 通用类型 + * @param sourceList 待转换的源列表 + * @param storageId 提取 storageId 的函数 + * @param handlerCode 提取 handlerCode 的函数 + * @param handlerName 提取 handlerName 的函数 + * @param groupName 提取 groupName 的函数 + * @param createTimeMapper 提取 createTime 的函数 + * @return 转换后的 TaskHandler 列表 + */ + public static List convertToHandlerList( + List sourceList, + Function storageId, + Function handlerCode, + Function handlerName, + Function groupName, + Function createTimeMapper) { + return sourceList.stream() + .map(item -> new TaskHandler( + String.valueOf(storageId.apply(item)), + handlerCode != null ? handlerCode.apply(item) : "无", + handlerName != null ? handlerName.apply(item) : "无", + groupName != null ? groupName.apply(item) : "默认分组", + createTimeMapper != null ? createTimeMapper.apply(item) : null + )) + .collect(Collectors.toList()); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class TaskHandler { + + /** + * 主键 + */ + private String storageId; + + /** + * 权限编码 + */ + private String handlerCode = "无"; + + /** + * 权限名称 + */ + private String handlerName = "无"; + + /** + * 权限分组 + */ + private String groupName = "默认分组"; + + /** + * 创建时间 + */ + private Date createTime; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java new file mode 100644 index 000000000..0cbed2f18 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java @@ -0,0 +1,56 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 任务受让人 + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class TaskAssigneeBody implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 权限编码 + */ + private String handlerCode; + + /** + * 权限名称 + */ + private String handlerName; + + /** + * 权限分组 + */ + private String groupId; + + /** + * 开始时间 + */ + private String beginTime; + + /** + * 结束时间 + */ + private String endTime; + + /** + * 当前页 + */ + private Integer pageNum = 1; + + /** + * 每页显示条数 + */ + private Integer pageSize = 10; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 43aef28cb..92fb967e7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -1,6 +1,8 @@ package org.dromara.common.core.service; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; import java.util.List; @@ -82,4 +84,12 @@ public interface UserService { * @return 用户 */ List selectUsersByDeptIds(List deptIds); + + /** + * 查询角色信息 + * + * @return 角色信息列表 + */ + TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 8c6d1d5f5..aefb0b532 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -15,7 +15,9 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.MapstructUtils; @@ -702,4 +704,35 @@ public class SysUserServiceImpl implements ISysUserService, UserService { .in(SysUser::getDeptId, deptIds)); return BeanUtil.copyToList(list, UserDTO.class); } + + /** + * 根据角色列表查询用户信息。 + * + * @param taskQuery 包含查询条件的请求体对象,包含分页参数、权限编码、权限名称、时间范围等信息。 + * @return 返回包含查询结果的 `TaskAssigneeDTO` 对象,其中包含符合条件的总记录数和处理人列表。 + */ + @Override + public TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery) { + // 创建分页查询对象,并设置分页大小和页码 + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageSize(taskQuery.getPageSize()); + pageQuery.setPageNum(taskQuery.getPageNum()); + + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysRole::getRoleName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysRole::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysRoleVo 对象的 Page + Page page = roleMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java new file mode 100644 index 000000000..42971c624 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java @@ -0,0 +1,109 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 任务分配人枚举 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum TaskAssigneeEnum { + + /** + * 用户 + */ + USER("用户", "user:"), + + /** + * 角色 + */ + ROLE("角色", "role:"), + + /** + * 部门 + */ + DEPT("部门", "dept:"), + + /** + * 岗位 + */ + POST("岗位", "post:"); + + private final String desc; + private final String code; + + /** + * 根据描述获取对应的枚举类型 + *

+ * 通过传入描述,查找并返回匹配的枚举项。如果未找到匹配项,会抛出 {@link ServiceException}。 + *

+ * + * @param desc 描述,用于匹配对应的枚举项 + * @return TaskAssigneeEnum 返回对应的枚举类型 + * @throws ServiceException 如果未找到匹配的枚举项 + */ + public static TaskAssigneeEnum fromDesc(String desc) { + for (TaskAssigneeEnum type : values()) { + if (type.getDesc().equals(desc)) { + return type; + } + } + throw new ServiceException("未知的办理人类型: " + desc); + } + + /** + * 根据代码获取对应的枚举类型 + *

+ * 通过传入代码,查找并返回匹配的枚举项。如果未找到匹配项,会抛出 {@link ServiceException}。 + *

+ * + * @param code 代码,用于匹配对应的枚举项 + * @return TaskAssigneeEnum 返回对应的枚举类型 + * @throws IllegalArgumentException 如果未找到匹配的枚举项 + */ + public static TaskAssigneeEnum fromCode(String code) { + for (TaskAssigneeEnum type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + throw new ServiceException("未知的办理人类型代码: " + code); + } + + /** + * 获取所有办理人类型的描述列表 + *

+ * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项。 + *

+ * + * @return List 返回所有办理人类型的描述列表 + */ + public static List getAssigneeTypeList() { + return Arrays.stream(values()) + .map(TaskAssigneeEnum::getDesc) + .collect(Collectors.toList()); + } + + /** + * 获取所有办理人类型的代码列表 + *

+ * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断。 + *

+ * + * @return List 返回所有办理人类型的代码列表 + */ + public static List getAssigneeCodeList() { + return Arrays.stream(values()) + .map(TaskAssigneeEnum::getCode) + .collect(Collectors.toList()); + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java new file mode 100644 index 000000000..9e607d902 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -0,0 +1,125 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.warm.flow.ui.dto.HandlerFunDto; +import com.warm.flow.ui.dto.HandlerQuery; +import com.warm.flow.ui.service.HandlerSelectService; +import com.warm.flow.ui.vo.HandlerSelectVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static org.dromara.workflow.common.enums.TaskAssigneeEnum.ROLE; + +/** + * 流程设计器-获取办理人权限设置列表 + * + * @author AprilWind + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class WfTaskAssigneeServiceImpl implements HandlerSelectService { + private final UserService userService; + + /** + * 获取办理人权限设置列表tabs页签 + * + * @return tabs页签 + */ + @Override + public List getHandlerType() { + return TaskAssigneeEnum.getAssigneeTypeList(); + } + + /** + * 获取用户列表, 同时构建左侧部门树状结构 + * + * @param query 查询条件 + * @return HandlerSelectVo + */ + @Override + public HandlerSelectVo getHandlerSelect(HandlerQuery query) { + TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType()); + TaskAssigneeBody taskQuery = BeanUtil.toBean(query, TaskAssigneeBody.class); + TaskAssigneeDTO dto = new TaskAssigneeDTO(); + if (TaskAssigneeEnum.USER == type) { + // 处理用户相关的业务逻辑 + } else if (ROLE == type) { + // 处理角色相关的业务逻辑 + dto = userService.selectUsersByRoleList(taskQuery); + } else if (TaskAssigneeEnum.DEPT == type) { + // 处理部门相关的业务逻辑 + } else if (TaskAssigneeEnum.POST == type) { + // 处理岗位相关的业务逻辑 + } + // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 + HandlerFunDto handlerFunDto = new HandlerFunDto<>(dto.getList(), dto.getTotal()) + .setStorageId(assignee -> ROLE.getCode() + assignee.getStorageId()) + .setHandlerCode(TaskAssigneeDTO.TaskHandler::getHandlerCode) + .setHandlerName(TaskAssigneeDTO.TaskHandler::getHandlerName) + .setGroupName(TaskAssigneeDTO.TaskHandler::getGroupName) + .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); + return getHandlerSelectVo(handlerFunDto); + } + +// /** +// * 获取用户列表 +// * +// * @param query 查询条件 +// * @return HandlerSelectVo +// */ +// private HandlerSelectVo getDept(HandlerQuery query) { +// // 查询部门列表 +// List deptList = userService.selectDeptList(sysDept); +// long total = new PageInfo<>(deptList).getTotal(); +// +// // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 +// HandlerFunDto handlerFunDto = new HandlerFunDto<>(deptList, total) +// .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户、部门的主键重复 +// .setHandlerName(SysDept::getDeptName) // 权限名称 +// .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime())); +// +// return getHandlerSelectVo(handlerFunDto); +// +// } +// +// /** +// * 获取用户列表, 同时构建左侧部门树状结构 +// * +// * @param query 查询条件 +// * @return HandlerSelectVo +// */ +// private HandlerSelectVo getUser(HandlerQuery query) { +// ...... +// // 查询用户列表 +// List userList = userService.selectUserList(sysUser); +// long total = new PageInfo<>(userList).getTotal(); +// // 查询部门列表,构建树状结构 +// List deptList = deptMapper.selectDeptList(new SysDept()); +// +// // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 +// HandlerFunDto handlerFunDto = new HandlerFunDto<>(userList, total) +// .setStorageId(user -> user.getUserId().toString()) +// .setHandlerCode(SysUser::getUserName) // 权限编码 +// .setHandlerName(SysUser::getNickName) // 权限名称 +// .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime())) +// .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : ""); +// +// // 业务系统机构,转成组件内部左侧树列表能够显示的数据 +// TreeFunDto treeFunDto = new TreeFunDto<>(deptList) +// .setId(dept -> dept.getDeptId().toString()) // 左侧树ID +// .setName(SysDept::getDeptName) // 左侧树名称 +// .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID +// +// return getHandlerSelectVo(handlerFunDto, treeFunDto); +// } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 4977a66bb..9dcb2b6da 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -13,6 +13,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; import java.util.*; @@ -32,9 +33,9 @@ public class WorkflowUtils { public static List permissionList() { List roles = LoginHelper.getLoginUser().getRoles(); Long deptId = LoginHelper.getDeptId(); - List permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId()); + List permissionList = StreamUtils.toList(roles, role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()); permissionList.add(LoginHelper.getUserIdStr()); - permissionList.add("dept:" + deptId); + permissionList.add(TaskAssigneeEnum.DEPT.getCode() + deptId); return permissionList; } @@ -55,11 +56,11 @@ public class WorkflowUtils { for (User user : userList) { String processedBy = user.getProcessedBy(); Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); - if (processedBy.startsWith("user:")) { + if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) { userIds.add(id); - } else if (processedBy.startsWith("role:")) { + } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { roleIds.add(id); - } else if (processedBy.startsWith("dept:")) { + } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { deptIds.add(id); } else { userIds.add(Long.valueOf(processedBy)); @@ -111,14 +112,13 @@ public class WorkflowUtils { String processedBy = user.getProcessedBy(); // 提取 processedBy 字段中 ":" 后的部分作为ID Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); - - if (processedBy.startsWith("user:")) { + if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) { // 如果前缀为 "user:",根据用户ID查询 return userService.selectListByIds(List.of(id)); - } else if (processedBy.startsWith("role:")) { + } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { // 如果前缀为 "role:",根据角色ID查询用户 return userService.selectUsersByRoleIds(List.of(id)); - } else if (processedBy.startsWith("dept:")) { + } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { // 如果前缀为 "dept:",根据部门ID查询用户 return userService.selectUsersByDeptIds(List.of(id)); } From e46d26b54eb5a78e8c6bb14ff59c7148d51abf7d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 12:20:20 +0800 Subject: [PATCH 047/227] =?UTF-8?q?update=20=E5=AE=8C=E5=96=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/dto/DeptDTO.java | 37 ++++++ .../core/domain/dto/TaskAssigneeDTO.java | 2 +- .../common/core/service/UserService.java | 37 +++++- .../common/mybatis/core/page/PageQuery.java | 5 + .../service/impl/SysUserServiceImpl.java | 109 ++++++++++++++++-- .../impl/WfTaskAssigneeServiceImpl.java | 79 ++++--------- 6 files changed, 196 insertions(+), 73 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java new file mode 100644 index 000000000..65c012faf --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java @@ -0,0 +1,37 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 部门 + * + * @author AprilWind + */ + +@Data +@NoArgsConstructor +public class DeptDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java index 4465c0457..b51fb569b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -63,7 +63,7 @@ public class TaskAssigneeDTO implements Serializable { handlerCode != null ? handlerCode.apply(item) : "无", handlerName != null ? handlerName.apply(item) : "无", groupName != null ? groupName.apply(item) : "默认分组", - createTimeMapper != null ? createTimeMapper.apply(item) : null + createTimeMapper != null ? createTimeMapper.apply(item) : new Date() )) .collect(Collectors.toList()); } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 92fb967e7..e8287ce1b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -1,5 +1,6 @@ package org.dromara.common.core.service; +import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -86,10 +87,42 @@ public interface UserService { List selectUsersByDeptIds(List deptIds); /** - * 查询角色信息 + * 查询角色并返回任务指派的列表,支持分页 * - * @return 角色信息列表 + * @param taskQuery 查询条件 + * @return 办理人 */ TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery); + /** + * 查询用户并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectUsersByUserList(TaskAssigneeBody taskQuery); + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectUsersByDeptList(TaskAssigneeBody taskQuery); + + /** + * 查询部门 + * + * @return 部门列表 + */ + List selectUsersByDeptList(); + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectUsersByPostList(TaskAssigneeBody taskQuery); + } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index 6ca9b2756..a3b0ac821 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -117,4 +117,9 @@ public class PageQuery implements Serializable { return (pageNum - 1) * pageSize; } + public PageQuery(Integer pageSize, Integer pageNum) { + this.pageSize = pageSize; + this.pageNum = pageNum; + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index aefb0b532..67250f01b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -30,10 +31,7 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysPostVo; -import org.dromara.system.domain.vo.SysRoleVo; -import org.dromara.system.domain.vo.SysUserExportVo; -import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.domain.vo.*; import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; @@ -706,18 +704,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService { } /** - * 根据角色列表查询用户信息。 + * 查询并返回任务指派的列表,支持分页 * - * @param taskQuery 包含查询条件的请求体对象,包含分页参数、权限编码、权限名称、时间范围等信息。 - * @return 返回包含查询结果的 `TaskAssigneeDTO` 对象,其中包含符合条件的总记录数和处理人列表。 + * @param taskQuery 查询条件 + * @return 办理人 */ @Override public TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery) { - // 创建分页查询对象,并设置分页大小和页码 - PageQuery pageQuery = new PageQuery(); - pageQuery.setPageSize(taskQuery.getPageSize()); - pageQuery.setPageNum(taskQuery.getPageNum()); - + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); // 使用 LambdaQueryWrapper 构建查询条件 LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode()) @@ -735,4 +729,95 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return new TaskAssigneeDTO(page.getTotal(), handlers); } + /** + * 查询并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectUsersByUserList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysUser::getUserName, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysUser::getNickName, taskQuery.getHandlerName()) + .eq(StringUtils.isNotBlank(taskQuery.getGroupId()), SysUser::getDeptId, taskQuery.getGroupId()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysUser::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysUserVo 对象的 Page + Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptName, SysUserVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectUsersByDeptList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysDeptVo 对象的 Page + Page page = deptMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, null, SysDeptVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询部门 + * + * @return 部门列表 + */ + @Override + public List selectUsersByDeptList() { + List list = deptMapper.selectVoList(); + return BeanUtil.copyToList(list, DeptDTO.class); + } + + /** + * 查询并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectUsersByPostList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) + .like(StringUtils.isNotBlank(taskQuery.getGroupId()), SysPost::getDeptId, taskQuery.getGroupId()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysPostVo 对象的 Page + Page page = postMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptName, SysPostVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 9e607d902..5561a3620 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -3,10 +3,12 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import com.warm.flow.ui.dto.HandlerFunDto; import com.warm.flow.ui.dto.HandlerQuery; +import com.warm.flow.ui.dto.TreeFunDto; import com.warm.flow.ui.service.HandlerSelectService; import com.warm.flow.ui.vo.HandlerSelectVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.service.UserService; @@ -14,10 +16,9 @@ import org.dromara.common.core.utils.DateUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; -import static org.dromara.workflow.common.enums.TaskAssigneeEnum.ROLE; - /** * 流程设计器-获取办理人权限设置列表 * @@ -40,7 +41,7 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { } /** - * 获取用户列表, 同时构建左侧部门树状结构 + * 获取办理列表, 同时构建左侧部门树状结构 * * @param query 查询条件 * @return HandlerSelectVo @@ -49,77 +50,39 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { public HandlerSelectVo getHandlerSelect(HandlerQuery query) { TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType()); TaskAssigneeBody taskQuery = BeanUtil.toBean(query, TaskAssigneeBody.class); + List depts = new ArrayList<>(); TaskAssigneeDTO dto = new TaskAssigneeDTO(); if (TaskAssigneeEnum.USER == type) { // 处理用户相关的业务逻辑 - } else if (ROLE == type) { + dto = userService.selectUsersByUserList(taskQuery); + depts = userService.selectUsersByDeptList(); + } else if (TaskAssigneeEnum.ROLE == type) { // 处理角色相关的业务逻辑 dto = userService.selectUsersByRoleList(taskQuery); } else if (TaskAssigneeEnum.DEPT == type) { // 处理部门相关的业务逻辑 + dto = userService.selectUsersByDeptList(taskQuery); } else if (TaskAssigneeEnum.POST == type) { // 处理岗位相关的业务逻辑 + dto = userService.selectUsersByPostList(taskQuery); + depts = userService.selectUsersByDeptList(); } + + // 业务系统机构,转成组件内部左侧树列表能够显示的数据 + TreeFunDto treeFunDto = new TreeFunDto<>(depts) + .setId(dept -> String.valueOf(dept.getDeptId())) + .setName(DeptDTO::getDeptName) + .setParentId(dept -> String.valueOf(dept.getParentId())); + // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 HandlerFunDto handlerFunDto = new HandlerFunDto<>(dto.getList(), dto.getTotal()) - .setStorageId(assignee -> ROLE.getCode() + assignee.getStorageId()) + .setStorageId(assignee -> type.getCode() + assignee.getStorageId()) .setHandlerCode(TaskAssigneeDTO.TaskHandler::getHandlerCode) .setHandlerName(TaskAssigneeDTO.TaskHandler::getHandlerName) .setGroupName(TaskAssigneeDTO.TaskHandler::getGroupName) .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); - return getHandlerSelectVo(handlerFunDto); + + return getHandlerSelectVo(handlerFunDto, treeFunDto); } -// /** -// * 获取用户列表 -// * -// * @param query 查询条件 -// * @return HandlerSelectVo -// */ -// private HandlerSelectVo getDept(HandlerQuery query) { -// // 查询部门列表 -// List deptList = userService.selectDeptList(sysDept); -// long total = new PageInfo<>(deptList).getTotal(); -// -// // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 -// HandlerFunDto handlerFunDto = new HandlerFunDto<>(deptList, total) -// .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户、部门的主键重复 -// .setHandlerName(SysDept::getDeptName) // 权限名称 -// .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime())); -// -// return getHandlerSelectVo(handlerFunDto); -// -// } -// -// /** -// * 获取用户列表, 同时构建左侧部门树状结构 -// * -// * @param query 查询条件 -// * @return HandlerSelectVo -// */ -// private HandlerSelectVo getUser(HandlerQuery query) { -// ...... -// // 查询用户列表 -// List userList = userService.selectUserList(sysUser); -// long total = new PageInfo<>(userList).getTotal(); -// // 查询部门列表,构建树状结构 -// List deptList = deptMapper.selectDeptList(new SysDept()); -// -// // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 -// HandlerFunDto handlerFunDto = new HandlerFunDto<>(userList, total) -// .setStorageId(user -> user.getUserId().toString()) -// .setHandlerCode(SysUser::getUserName) // 权限编码 -// .setHandlerName(SysUser::getNickName) // 权限名称 -// .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime())) -// .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : ""); -// -// // 业务系统机构,转成组件内部左侧树列表能够显示的数据 -// TreeFunDto treeFunDto = new TreeFunDto<>(deptList) -// .setId(dept -> dept.getDeptId().toString()) // 左侧树ID -// .setName(SysDept::getDeptName) // 左侧树名称 -// .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID -// -// return getHandlerSelectVo(handlerFunDto, treeFunDto); -// } - } From d4466cec387582386b230ddbc7ea92b670dc9383 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 12:31:44 +0800 Subject: [PATCH 048/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WfTaskAssigneeServiceImpl.java | 67 ++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 5561a3620..5c05aec9f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; @@ -48,41 +49,61 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { */ @Override public HandlerSelectVo getHandlerSelect(HandlerQuery query) { + // 获取任务办理类型 TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType()); + // 转换查询条件为 TaskAssigneeBody TaskAssigneeBody taskQuery = BeanUtil.toBean(query, TaskAssigneeBody.class); - List depts = new ArrayList<>(); - TaskAssigneeDTO dto = new TaskAssigneeDTO(); - if (TaskAssigneeEnum.USER == type) { - // 处理用户相关的业务逻辑 - dto = userService.selectUsersByUserList(taskQuery); - depts = userService.selectUsersByDeptList(); - } else if (TaskAssigneeEnum.ROLE == type) { - // 处理角色相关的业务逻辑 - dto = userService.selectUsersByRoleList(taskQuery); - } else if (TaskAssigneeEnum.DEPT == type) { - // 处理部门相关的业务逻辑 - dto = userService.selectUsersByDeptList(taskQuery); - } else if (TaskAssigneeEnum.POST == type) { - // 处理岗位相关的业务逻辑 - dto = userService.selectUsersByPostList(taskQuery); - depts = userService.selectUsersByDeptList(); - } - // 业务系统机构,转成组件内部左侧树列表能够显示的数据 - TreeFunDto treeFunDto = new TreeFunDto<>(depts) + // 统一查询并构建业务数据 + TaskAssigneeDTO dto = fetchTaskAssigneeData(type, taskQuery); + List depts = fetchDeptData(type); + + return getHandlerSelectVo(buildHandlerData(dto, type), buildDeptTree(depts)); + } + + /** + * 根据任务办理类型查询对应的数据 + */ + private TaskAssigneeDTO fetchTaskAssigneeData(TaskAssigneeEnum type, TaskAssigneeBody taskQuery) { + return switch (type) { + case USER -> userService.selectUsersByUserList(taskQuery); + case ROLE -> userService.selectUsersByRoleList(taskQuery); + case DEPT -> userService.selectUsersByDeptList(taskQuery); + case POST -> userService.selectUsersByPostList(taskQuery); + default -> throw new ServiceException("Unsupported handler type"); + }; + } + + /** + * 根据任务办理类型获取部门数据 + */ + private List fetchDeptData(TaskAssigneeEnum type) { + if (type == TaskAssigneeEnum.USER || type == TaskAssigneeEnum.POST) { + return userService.selectUsersByDeptList(); + } + return new ArrayList<>(); + } + + /** + * 构建部门树状结构 + */ + private TreeFunDto buildDeptTree(List depts) { + return new TreeFunDto<>(depts) .setId(dept -> String.valueOf(dept.getDeptId())) .setName(DeptDTO::getDeptName) .setParentId(dept -> String.valueOf(dept.getParentId())); + } - // 业务系统数据,转成组件内部能够显示的数据, total是业务数据总数,用于分页显示 - HandlerFunDto handlerFunDto = new HandlerFunDto<>(dto.getList(), dto.getTotal()) + /** + * 构建任务办理人数据 + */ + private HandlerFunDto buildHandlerData(TaskAssigneeDTO dto, TaskAssigneeEnum type) { + return new HandlerFunDto<>(dto.getList(), dto.getTotal()) .setStorageId(assignee -> type.getCode() + assignee.getStorageId()) .setHandlerCode(TaskAssigneeDTO.TaskHandler::getHandlerCode) .setHandlerName(TaskAssigneeDTO.TaskHandler::getHandlerName) .setGroupName(TaskAssigneeDTO.TaskHandler::getGroupName) .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); - - return getHandlerSelectVo(handlerFunDto, treeFunDto); } } From 178027931d5e7044bf5868a6a6f2872ea99de5f3 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 12:56:29 +0800 Subject: [PATCH 049/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DeptService.java | 21 ++++ .../common/core/service/PostService.java | 21 ++++ .../common/core/service/RoleService.java | 21 ++++ .../common/core/service/UserService.java | 34 +----- .../service/impl/SysDeptServiceImpl.java | 43 ++++++++ .../service/impl/SysPostServiceImpl.java | 33 +++++- .../service/impl/SysRoleServiceImpl.java | 36 ++++++- .../service/impl/SysUserServiceImpl.java | 100 ++---------------- .../impl/WfTaskAssigneeServiceImpl.java | 16 ++- 9 files changed, 189 insertions(+), 136 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java index db9463e79..739847154 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -1,5 +1,11 @@ package org.dromara.common.core.service; +import org.dromara.common.core.domain.dto.DeptDTO; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; + +import java.util.List; + /** * 通用 部门服务 * @@ -15,4 +21,19 @@ public interface DeptService { */ String selectDeptNameByIds(String deptIds); + /** + * 查询部门 + * + * @return 部门列表 + */ + List selectDeptsByList(); + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery); + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java new file mode 100644 index 000000000..6e4ead244 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -0,0 +1,21 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; + +/** + * 通用 岗位服务 + * + * @author AprilWind + */ +public interface PostService { + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java new file mode 100644 index 000000000..f2307215f --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java @@ -0,0 +1,21 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; + +/** + * 通用 角色服务 + * + * @author AprilWind + */ +public interface RoleService { + + /** + * 查询角色并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index e8287ce1b..2c8b99bbb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -1,6 +1,5 @@ package org.dromara.common.core.service; -import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -86,43 +85,12 @@ public interface UserService { */ List selectUsersByDeptIds(List deptIds); - /** - * 查询角色并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery); - /** * 查询用户并返回任务指派的列表,支持分页 * * @param taskQuery 查询条件 * @return 办理人 */ - TaskAssigneeDTO selectUsersByUserList(TaskAssigneeBody taskQuery); - - /** - * 查询部门并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectUsersByDeptList(TaskAssigneeBody taskQuery); - - /** - * 查询部门 - * - * @return 部门列表 - */ - List selectUsersByDeptList(); - - /** - * 查询岗位并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectUsersByPostList(TaskAssigneeBody taskQuery); + TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 49b18b7ab..b3505310c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; @@ -7,15 +8,20 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.DeptDTO; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.satoken.utils.LoginHelper; @@ -166,6 +172,43 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return String.join(StringUtils.SEPARATOR, list); } + /** + * 查询部门 + * + * @return 部门列表 + */ + @Override + public List selectDeptsByList() { + List list = baseMapper.selectVoList(); + return BeanUtil.copyToList(list, DeptDTO.class); + } + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysDeptVo 对象的 Page + Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, null, SysDeptVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + /** * 根据ID查询所有子部门数(正常状态) * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 2c38129ac..a02617f34 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -7,7 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -36,7 +39,7 @@ import java.util.stream.Collectors; */ @RequiredArgsConstructor @Service -public class SysPostServiceImpl implements ISysPostService { +public class SysPostServiceImpl implements ISysPostService, PostService { private final SysPostMapper baseMapper; private final SysDeptMapper deptMapper; @@ -239,4 +242,32 @@ public class SysPostServiceImpl implements ISysPostService { SysPost post = MapstructUtils.convert(bo, SysPost.class); return baseMapper.updateById(post); } + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) + .like(StringUtils.isNotBlank(taskQuery.getGroupId()), SysPost::getDeptId, taskQuery.getGroupId()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysPostVo 对象的 Page + Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptName, SysPostVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 9b8b0ecbe..9ae250b05 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -14,8 +14,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.RoleService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -45,7 +48,7 @@ import java.util.*; */ @RequiredArgsConstructor @Service -public class SysRoleServiceImpl implements ISysRoleService { +public class SysRoleServiceImpl implements ISysRoleService, RoleService { private final SysRoleMapper baseMapper; private final SysRoleMenuMapper roleMenuMapper; @@ -348,7 +351,7 @@ public class SysRoleServiceImpl implements ISysRoleService { private int insertRoleMenu(SysRoleBo role) { int rows = 1; // 新增用户与角色管理 - List list = new ArrayList(); + List list = new ArrayList<>(); for (Long menuId : role.getMenuIds()) { SysRoleMenu rm = new SysRoleMenu(); rm.setRoleId(role.getRoleId()); @@ -369,7 +372,7 @@ public class SysRoleServiceImpl implements ISysRoleService { private int insertRoleDept(SysRoleBo role) { int rows = 1; // 新增角色与部门(数据权限)管理 - List list = new ArrayList(); + List list = new ArrayList<>(); for (Long deptId : role.getDeptIds()) { SysRoleDept rd = new SysRoleDept(); rd.setRoleId(role.getRoleId()); @@ -511,4 +514,31 @@ public class SysRoleServiceImpl implements ISysRoleService { } }); } + + /** + * 查询角色并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + // 使用 LambdaQueryWrapper 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysRole::getRoleName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysRole::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + + // 执行分页查询,并将查询结果封装为 SysRoleVo 对象的 Page + Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); + + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 67250f01b..886393f93 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -15,7 +15,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -31,7 +30,10 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.*; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserExportVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; @@ -704,39 +706,13 @@ public class SysUserServiceImpl implements ISysUserService, UserService { } /** - * 查询并返回任务指派的列表,支持分页 + * 查询用户并返回任务指派的列表,支持分页 * * @param taskQuery 查询条件 * @return 办理人 */ @Override - public TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysRole::getRoleName, taskQuery.getHandlerName()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysRole::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - - // 执行分页查询,并将查询结果封装为 SysRoleVo 对象的 Page - Page page = roleMapper.selectVoPage(pageQuery.build(), wrapper); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - - /** - * 查询并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectUsersByUserList(TaskAssigneeBody taskQuery) { + public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); // 使用 LambdaQueryWrapper 构建查询条件 LambdaQueryWrapper wrapper = new LambdaQueryWrapper() @@ -756,68 +732,4 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return new TaskAssigneeDTO(page.getTotal(), handlers); } - /** - * 查询并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectUsersByDeptList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - - // 执行分页查询,并将查询结果封装为 SysDeptVo 对象的 Page - Page page = deptMapper.selectVoPage(pageQuery.build(), wrapper); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, null, SysDeptVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - - /** - * 查询部门 - * - * @return 部门列表 - */ - @Override - public List selectUsersByDeptList() { - List list = deptMapper.selectVoList(); - return BeanUtil.copyToList(list, DeptDTO.class); - } - - /** - * 查询并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectUsersByPostList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) - .like(StringUtils.isNotBlank(taskQuery.getGroupId()), SysPost::getDeptId, taskQuery.getGroupId()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - - // 执行分页查询,并将查询结果封装为 SysPostVo 对象的 Page - Page page = postMapper.selectVoPage(pageQuery.build(), wrapper); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptName, SysPostVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 5c05aec9f..73280edb1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -12,6 +12,9 @@ import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.service.PostService; +import org.dromara.common.core.service.RoleService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; @@ -30,6 +33,9 @@ import java.util.List; @Service public class WfTaskAssigneeServiceImpl implements HandlerSelectService { private final UserService userService; + private final DeptService deptService; + private final RoleService roleService; + private final PostService postService; /** * 获取办理人权限设置列表tabs页签 @@ -66,10 +72,10 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { */ private TaskAssigneeDTO fetchTaskAssigneeData(TaskAssigneeEnum type, TaskAssigneeBody taskQuery) { return switch (type) { - case USER -> userService.selectUsersByUserList(taskQuery); - case ROLE -> userService.selectUsersByRoleList(taskQuery); - case DEPT -> userService.selectUsersByDeptList(taskQuery); - case POST -> userService.selectUsersByPostList(taskQuery); + case USER -> userService.selectUsersByTaskAssigneeList(taskQuery); + case ROLE -> roleService.selectRolesByTaskAssigneeList(taskQuery); + case DEPT -> deptService.selectDeptsByTaskAssigneeList(taskQuery); + case POST -> postService.selectPostsByTaskAssigneeList(taskQuery); default -> throw new ServiceException("Unsupported handler type"); }; } @@ -79,7 +85,7 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { */ private List fetchDeptData(TaskAssigneeEnum type) { if (type == TaskAssigneeEnum.USER || type == TaskAssigneeEnum.POST) { - return userService.selectUsersByDeptList(); + return deptService.selectDeptsByList(); } return new ArrayList<>(); } From 4f3d79faa0f97c372ccd95c6919142d933fe2f46 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 14:29:35 +0800 Subject: [PATCH 050/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/dto/TaskAssigneeDTO.java | 9 +++-- .../dromara/system/mapper/SysDeptMapper.java | 14 ++++++- .../service/impl/SysDeptServiceImpl.java | 39 ++++++++++++++----- .../service/impl/SysPostServiceImpl.java | 27 ++++++++----- .../service/impl/SysRoleServiceImpl.java | 20 ++++++---- .../service/impl/SysUserServiceImpl.java | 29 +++++++------- .../resources/mapper/system/SysDeptMapper.xml | 11 ++++++ .../service/impl/FlwTaskServiceImpl.java | 15 +------ .../impl/WfTaskAssigneeServiceImpl.java | 2 +- 9 files changed, 108 insertions(+), 58 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java index b51fb569b..d70a0d84d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -3,6 +3,7 @@ package org.dromara.common.core.domain.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; import java.io.Serial; import java.io.Serializable; @@ -60,10 +61,10 @@ public class TaskAssigneeDTO implements Serializable { return sourceList.stream() .map(item -> new TaskHandler( String.valueOf(storageId.apply(item)), - handlerCode != null ? handlerCode.apply(item) : "无", - handlerName != null ? handlerName.apply(item) : "无", - groupName != null ? groupName.apply(item) : "默认分组", - createTimeMapper != null ? createTimeMapper.apply(item) : new Date() + StringUtils.blankToDefault(handlerCode.apply(item), "无"), + StringUtils.blankToDefault(handlerName.apply(item), "无"), + StringUtils.blankToDefault(groupName != null ? groupName.apply(item) : null, "默认分组"), + createTimeMapper.apply(item) )) .collect(Collectors.toList()); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 08dda662c..9e7f93e58 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -2,12 +2,13 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.vo.SysDeptVo; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -29,6 +30,17 @@ public interface SysDeptMapper extends BaseMapperPlus { }) List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 分页查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + }) + Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + @DataPermission({ @DataColumn(key = "deptName", value = "dept_id") }) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index b3505310c..b2c2c3a5d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -41,6 +41,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 部门管理 服务实现 @@ -179,7 +180,9 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { */ @Override public List selectDeptsByList() { - List list = baseMapper.selectVoList(); + List list = baseMapper.selectDeptList(new LambdaQueryWrapper() + .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getParentId) + .eq(SysDept::getStatus, UserConstants.DEPT_NORMAL)); return BeanUtil.copyToList(list, DeptDTO.class); } @@ -193,18 +196,36 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysDept::getDelFlag, UserConstants.DEL_FLAG_NORMAL); + wrapper.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()); + wrapper.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + //部门树搜索 + wrapper.and(x -> { + List deptIds = baseMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(taskQuery.getGroupId(), "ancestors"))) + .stream() + .map(SysDept::getDeptId) + .collect(Collectors.toList()); + deptIds.add(Long.valueOf(taskQuery.getGroupId())); + x.in(SysDept::getDeptId, deptIds); + }); + } + wrapper.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + wrapper.orderByAsc(SysDept::getAncestors); + wrapper.orderByAsc(SysDept::getParentId); + wrapper.orderByAsc(SysDept::getOrderNum); + wrapper.orderByAsc(SysDept::getDeptId); - // 执行分页查询,并将查询结果封装为 SysDeptVo 对象的 Page - Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + Page page = baseMapper.selectPageDeptList(pageQuery.build(), wrapper); + // TODO 需要回显父部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, null, SysDeptVo::getCreateTime); + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentName, SysDeptVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index a02617f34..590b8bc8d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -30,6 +30,7 @@ import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -252,16 +253,24 @@ public class SysPostServiceImpl implements ISysPostService, PostService { @Override public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) - .like(StringUtils.isNotBlank(taskQuery.getGroupId()), SysPost::getDeptId, taskQuery.getGroupId()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - // 执行分页查询,并将查询结果封装为 SysPostVo 对象的 Page - Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + SysPostBo post = new SysPostBo(); + post.setPostCategory(taskQuery.getHandlerCode()); + post.setPostName(taskQuery.getHandlerName()); + Optional.ofNullable(taskQuery.getGroupId()) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .ifPresent(post::setBelongDeptId); + + LambdaQueryWrapper wrapper = buildQueryWrapper(post); + // 如果 beginTime 和 endTime 都有值,才添加到 params 中 + if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { + wrapper.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + } + + Page page = baseMapper.selectPagePostList(pageQuery.build(), wrapper); + // TODO 需要回显部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 9ae250b05..eb7b30f54 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -524,15 +524,19 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { @Override public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysRole::getRoleName, taskQuery.getHandlerName()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysRole::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - // 执行分页查询,并将查询结果封装为 SysRoleVo 对象的 Page - Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + SysRoleBo role = new SysRoleBo(); + role.setRoleKey(taskQuery.getHandlerCode()); + role.setRoleName(taskQuery.getHandlerName()); + + // 如果 beginTime 和 endTime 都有值,才添加到 params 中 + if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { + Map params = role.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + } + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + // TODO 回显数据范围 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 886393f93..8bb93b5e6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -41,10 +41,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 用户 业务层处理 @@ -714,16 +711,22 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysUser::getUserName, taskQuery.getHandlerCode()) - .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysUser::getNickName, taskQuery.getHandlerName()) - .eq(StringUtils.isNotBlank(taskQuery.getGroupId()), SysUser::getDeptId, taskQuery.getGroupId()) - .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysUser::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + SysUserBo user = new SysUserBo(); + user.setUserName(taskQuery.getHandlerCode()); + user.setNickName(taskQuery.getHandlerName()); + Optional.ofNullable(taskQuery.getGroupId()) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .ifPresent(user::setDeptId); - // 执行分页查询,并将查询结果封装为 SysUserVo 对象的 Page - Page page = baseMapper.selectVoPage(pageQuery.build(), wrapper); + // 如果 beginTime 和 endTime 都有值,才添加到 params 中 + if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { + Map params = user.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + } + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + // TODO 需要回显部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 6ad866f29..9057a0e22 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -18,6 +18,17 @@ from sys_dept ${ew.getCustomSqlSegment} + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c92ad1e3a..965ee4d07 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -98,7 +98,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - return buildMap(taskList.get(0).getInstanceId(), taskList.get(0).getId()); + return Map.of("processInstanceId", taskList.get(0).getInstanceId(), "taskId", taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); @@ -116,18 +116,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } - return buildMap(instance.getId(), taskList.get(0).getId()); - } - - /** - * 构建一个包含给定 `processInstanceId` 和 `taskId` 的 Map - * - * @param instanceId 流程实例的 ID - * @param taskId 任务的 ID - * @return 返回一个包含 `processInstanceId` 和 `taskId` 的不可变 Map - */ - private Map buildMap(Object instanceId, Object taskId) { - return Map.of("processInstanceId", instanceId, "taskId", taskId); + return Map.of("processInstanceId", instance.getId(), "taskId", taskList.get(0).getId()); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 73280edb1..73789731c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -84,7 +84,7 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { * 根据任务办理类型获取部门数据 */ private List fetchDeptData(TaskAssigneeEnum type) { - if (type == TaskAssigneeEnum.USER || type == TaskAssigneeEnum.POST) { + if (type == TaskAssigneeEnum.USER || type == TaskAssigneeEnum.DEPT || type == TaskAssigneeEnum.POST) { return deptService.selectDeptsByList(); } return new ArrayList<>(); From a0282b693ac19bf98c71f424b5e26826dc82302a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 15:24:07 +0800 Subject: [PATCH 051/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/dto/TaskAssigneeDTO.java | 18 ++++++++---------- .../service/impl/SysDeptServiceImpl.java | 3 +-- .../service/impl/SysPostServiceImpl.java | 3 +-- .../service/impl/SysRoleServiceImpl.java | 1 - .../service/impl/SysUserServiceImpl.java | 3 +-- .../impl/WfTaskAssigneeServiceImpl.java | 12 +++++++++--- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java index d70a0d84d..85893e1dc 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -3,7 +3,6 @@ package org.dromara.common.core.domain.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.StringUtils; import java.io.Serial; import java.io.Serializable; @@ -56,17 +55,16 @@ public class TaskAssigneeDTO implements Serializable { Function storageId, Function handlerCode, Function handlerName, - Function groupName, + Function groupName, Function createTimeMapper) { return sourceList.stream() .map(item -> new TaskHandler( String.valueOf(storageId.apply(item)), - StringUtils.blankToDefault(handlerCode.apply(item), "无"), - StringUtils.blankToDefault(handlerName.apply(item), "无"), - StringUtils.blankToDefault(groupName != null ? groupName.apply(item) : null, "默认分组"), + handlerCode.apply(item), + handlerName.apply(item), + groupName != null ? String.valueOf(groupName.apply(item)) : null, createTimeMapper.apply(item) - )) - .collect(Collectors.toList()); + )).collect(Collectors.toList()); } @Data @@ -82,17 +80,17 @@ public class TaskAssigneeDTO implements Serializable { /** * 权限编码 */ - private String handlerCode = "无"; + private String handlerCode; /** * 权限名称 */ - private String handlerName = "无"; + private String handlerName; /** * 权限分组 */ - private String groupName = "默认分组"; + private String groupName; /** * 创建时间 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index b2c2c3a5d..c11a4e556 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -221,11 +221,10 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { wrapper.orderByAsc(SysDept::getDeptId); Page page = baseMapper.selectPageDeptList(pageQuery.build(), wrapper); - // TODO 需要回显父部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentName, SysDeptVo::getCreateTime); + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 590b8bc8d..45ef799cb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -270,11 +270,10 @@ public class SysPostServiceImpl implements ISysPostService, PostService { } Page page = baseMapper.selectPagePostList(pageQuery.build(), wrapper); - // TODO 需要回显部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptName, SysPostVo::getCreateTime); + SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index eb7b30f54..72db67b3b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -536,7 +536,6 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { params.put("endTime", taskQuery.getEndTime()); } Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); - // TODO 回显数据范围 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 8bb93b5e6..02ce28321 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -726,11 +726,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService { params.put("endTime", taskQuery.getEndTime()); } Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); - // TODO 需要回显部门名称 // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptName, SysUserVo::getCreateTime); + SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 73789731c..e89f3a18a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -17,11 +17,13 @@ import org.dromara.common.core.service.PostService; import org.dromara.common.core.service.RoleService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * 流程设计器-获取办理人权限设置列表 @@ -32,6 +34,7 @@ import java.util.List; @RequiredArgsConstructor @Service public class WfTaskAssigneeServiceImpl implements HandlerSelectService { + final static String DEFAULT_GROUP_NAME = "默认分组"; private final UserService userService; private final DeptService deptService; private final RoleService roleService; @@ -106,9 +109,12 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { private HandlerFunDto buildHandlerData(TaskAssigneeDTO dto, TaskAssigneeEnum type) { return new HandlerFunDto<>(dto.getList(), dto.getTotal()) .setStorageId(assignee -> type.getCode() + assignee.getStorageId()) - .setHandlerCode(TaskAssigneeDTO.TaskHandler::getHandlerCode) - .setHandlerName(TaskAssigneeDTO.TaskHandler::getHandlerName) - .setGroupName(TaskAssigneeDTO.TaskHandler::getGroupName) + .setHandlerCode(assignee -> StringUtils.blankToDefault(assignee.getHandlerCode(), "无")) + .setHandlerName(assignee -> StringUtils.blankToDefault(assignee.getHandlerName(), "无")) + .setGroupName(assignee -> StringUtils.defaultIfBlank( + Optional.ofNullable(assignee.getGroupName()) + .map(deptService::selectDeptNameByIds) + .orElse(DEFAULT_GROUP_NAME), DEFAULT_GROUP_NAME)) .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); } From a1b71d654cfa40ffdf4cb10ca8dbebbc34da3d29 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 7 Nov 2024 16:03:48 +0800 Subject: [PATCH 052/227] =?UTF-8?q?update=20=E6=9F=A5=E8=AF=A2=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=B9=B6=E8=BF=94=E5=9B=9E=E4=BB=BB=E5=8A=A1=E6=8C=87?= =?UTF-8?q?=E6=B4=BE=E7=9A=84=E5=88=97=E8=A1=A8=E6=A0=B9=E6=8D=AE=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=A0=91=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysDeptServiceImpl.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 1bfedec86..84c3844da 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -17,11 +17,7 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.core.utils.*; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; @@ -42,7 +38,6 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * 部门管理 服务实现 @@ -215,13 +210,10 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { if (StringUtils.isNotBlank(taskQuery.getGroupId())) { //部门树搜索 wrapper.and(x -> { - List deptIds = baseMapper.selectList(new LambdaQueryWrapper() - .select(SysDept::getDeptId) - .apply(DataBaseHelper.findInSet(taskQuery.getGroupId(), "ancestors"))) - .stream() - .map(SysDept::getDeptId) - .collect(Collectors.toList()); - deptIds.add(Long.valueOf(taskQuery.getGroupId())); + Long parentId = Long.valueOf(taskQuery.getGroupId()); + List deptList = baseMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); x.in(SysDept::getDeptId, deptIds); }); } From dd01def219b5fe95d947fcfbc0fccfb0d4b696a7 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 11 Nov 2024 16:07:51 +0800 Subject: [PATCH 053/227] =?UTF-8?q?fix=20=E4=BF=AE=E6=94=B9=E6=97=A0?= =?UTF-8?q?=E6=95=88=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwInstanceServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 875e51b93..48bb04089 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -7,11 +7,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.entity.*; +import com.warm.flow.core.entity.Instance; import com.warm.flow.core.enums.CooperateType; import com.warm.flow.core.enums.FlowStatus; import com.warm.flow.core.enums.NodeType; -import com.warm.flow.core.service.*; +import com.warm.flow.core.service.DefService; +import com.warm.flow.core.service.InsService; import com.warm.flow.orm.entity.FlowDefinition; import com.warm.flow.orm.entity.FlowHisTask; import com.warm.flow.orm.entity.FlowInstance; @@ -20,7 +21,7 @@ import com.warm.flow.orm.mapper.FlowHisTaskMapper; import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -68,7 +69,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("t.flow_status", FlowStatus.APPROVAL.getKey()); - queryWrapper.eq("t.del_flag", UserConstants.USER_NORMAL); + queryWrapper.eq("t.del_flag", SystemConstants.NORMAL); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); From e82352deffd411318697ed542fe72c608f6683cc Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 10:31:10 +0800 Subject: [PATCH 054/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=B7=A5=E5=85=B7=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E8=8E=B7=E5=8F=96=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/utils/WorkflowUtils.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 9dcb2b6da..df3655160 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -6,16 +6,17 @@ import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 工作流工具 @@ -31,12 +32,16 @@ public class WorkflowUtils { * @return 权限列表 */ public static List permissionList() { - List roles = LoginHelper.getLoginUser().getRoles(); - Long deptId = LoginHelper.getDeptId(); - List permissionList = StreamUtils.toList(roles, role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()); - permissionList.add(LoginHelper.getUserIdStr()); - permissionList.add(TaskAssigneeEnum.DEPT.getCode() + deptId); - return permissionList; + LoginUser loginUser = LoginHelper.getLoginUser(); + Long deptId = loginUser.getDeptId(); + //todo 岗位获取待考虑 + return Stream.concat( + loginUser.getRoles().stream().map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + Stream.of( + TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), + TaskAssigneeEnum.DEPT.getCode() + deptId + ) + ).collect(Collectors.toList()); } /** From b5ba8de7b710b7796edf60fb77095375f313739c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 14:22:36 +0800 Subject: [PATCH 055/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E4=BB=BB=E5=8A=A1=E6=9F=A5=E8=AF=A2=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B5=81=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/AssigneeService.java | 30 +++ .../translation/constant/TransConstant.java | 5 + .../impl/TaskAssigneeTranslationImpl.java | 27 +++ .../workflow/domain/bo/FlowTaskBo.java | 1 - .../workflow/domain/vo/FlowHisTaskVo.java | 7 + .../workflow/domain/vo/FlowTaskVo.java | 8 +- .../service/IWfTaskAssigneeService.java | 22 +++ .../service/impl/FlwTaskServiceImpl.java | 176 +++++++++--------- .../impl/WfTaskAssigneeServiceImpl.java | 41 +++- .../dromara/workflow/utils/WorkflowUtils.java | 74 ++------ 10 files changed, 240 insertions(+), 151 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java new file mode 100644 index 000000000..73311cee5 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 通用 办理人服务 + * + * @author AprilWind + */ +public interface AssigneeService { + + /** + * 通过taskId查询对应的任务办理人 + * + * @param taskIds taskId串逗号分隔 + * @return 任务办理人名称串逗号分隔 + */ + String selectAssigneeByIds(String taskIds); + + /** + * 通过taskId查询对应的任务办理人列表 + * + * @param taskIds taskId串逗号分隔 + * @return 列表 + */ + List selectByIds(String taskIds); + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index c084ea1a0..c14175ebe 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -32,4 +32,9 @@ public interface TransConstant { */ String OSS_ID_TO_URL = "oss_id_to_url"; + /** + * 任务Id转任务办理人名称 + */ + String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; + } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java new file mode 100644 index 000000000..7a2502b1c --- /dev/null +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java @@ -0,0 +1,27 @@ +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.AssigneeService; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * 任务办理人翻译实现 + * + * @author AprilWind + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.TASK_ID_TO_ASSIGNEE) +public class TaskAssigneeTranslationImpl implements TranslationInterface { + + private final AssigneeService assigneeService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String id) { + return assigneeService.selectAssigneeByIds(id); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 59e6bac1b..66dc70a61 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.Future; import lombok.Data; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 5ab3520e9..d44121f15 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,5 +1,6 @@ package org.dromara.workflow.domain.vo; +import com.warm.flow.core.enums.FlowStatus; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; @@ -173,4 +174,10 @@ public class FlowHisTaskVo implements Serializable { * 运行时长 */ private String runDuration; + + public void setFlowStatus(String flowStatus) { + this.flowStatus = flowStatus; + // TODO 建议前端使用字典 + this.flowStatusName = FlowStatus.getValueByKey(flowStatus); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 54a5edf46..7a7b6c54a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -2,7 +2,8 @@ package org.dromara.workflow.domain.vo; import com.warm.flow.core.entity.User; import lombok.Data; -import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; @@ -118,9 +119,10 @@ public class FlowTaskVo implements Serializable { private String flowStatusName; /** - * 办理人 + * 办理人名称 */ - private List userDTOList; + @Translation(type = TransConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") + private String transactorNames; /** * 办理人类型 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java new file mode 100644 index 000000000..928c55c07 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 流程设计器-获取办理人 + * + * @author AprilWind + */ +public interface IWfTaskAssigneeService { + + /** + * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * + * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") + * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + */ + List fetchUsersByStorageId(String storageId); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 965ee4d07..c16567aba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.entity.*; @@ -22,8 +23,10 @@ import com.warm.flow.orm.mapper.FlowSkipMapper; import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.AssigneeService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -43,7 +46,10 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY; @@ -57,7 +63,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; @Slf4j @RequiredArgsConstructor @Service -public class FlwTaskServiceImpl implements IFlwTaskService { +public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final TaskService taskService; private final InsService insService; @@ -184,26 +190,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param instance 实例 */ private void setHandler(Instance instance) { - if (instance != null) { - // 根据流程实例ID查询所有关联的任务 - List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) - .eq(FlowTask::getInstanceId, instance.getId())); + if (instance == null) { + return; + } + // 根据流程实例ID查询所有关联的任务 + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instance.getId())); + List userList = new ArrayList<>(); - // 遍历任务列表,处理每个任务的办理人 - for (FlowTask flowTask : flowTasks) { - // 获取与当前任务关联的用户列表 - List userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); - // 通过工具方法过滤和获取有效用户 - Set users = WorkflowUtils.getUser(userList); - if (CollUtil.isNotEmpty(users)) { - // 删除现有的任务办理人记录,确保后续数据清理和更新 - userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); - // 将新的办理人关联到任务ID,并批量保存新的办理人列表 - users.forEach(user -> user.setAssociated(flowTask.getId())); - userService.saveBatch(new ArrayList<>(users)); - } + // 遍历任务列表,处理每个任务的办理人 + for (FlowTask flowTask : flowTasks) { + // 获取与当前任务关联的用户列表 + List associatedUsers = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); + if (CollUtil.isNotEmpty(associatedUsers)) { + userList.addAll(WorkflowUtils.getUser(associatedUsers, flowTask.getId())); } } + + // 批量删除现有任务的办理人记录 + userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + + // 确保要保存的 userList 不为空 + if (CollUtil.isNotEmpty(userList)) { + userService.saveBatch(userList); + } } /** @@ -214,10 +224,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -229,9 +240,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.approver", LoginHelper.getUserId()); - Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -243,51 +255,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); - Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); - return TableDataInfo.build(page); - } - - /** - * 构建待处理任务分页对象 - * - * @param pageQuery 分页查询对象 - * @param queryWrapper 查询条件封装对象 - * @param flowTaskBo 流程任务业务对象 - * @return 分页后的待处理任务列表 - */ - private Page buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { - commonCondition(queryWrapper, flowTaskBo); - Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); - List records = page.getRecords(); - if (CollUtil.isNotEmpty(records)) { - List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); - List userList = userService.getByAssociateds(taskIds); - for (FlowTaskVo data : records) { - if (CollUtil.isNotEmpty(userList)) { - List users = StreamUtils.filter(userList, e -> e.getAssociated().toString().equals(data.getId().toString())); - data.setUserList(CollUtil.isEmpty(users) ? Collections.emptyList() : users); - data.setUserDTOList(WorkflowUtils.getHandlerUser(users)); - } - data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); - } - } - return page; - } - - /** - * 通用条件 - * - * @param queryWrapper 查询条件 - * @param flowTaskBo 参数 - */ - private void commonCondition(QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.orderByDesc("t.create_time"); + queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** @@ -298,28 +270,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); - return TableDataInfo.build(page); - } - - /** - * 构建已完成任务分页对象 - * - * @param pageQuery 分页查询对象 - * @param queryWrapper 查询条件封装对象 - * @param flowTaskBo 流程任务业务对象 - * @return 分页后的已完成任务列表 - */ - private Page buildTaskFinishPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { - commonCondition(queryWrapper, flowTaskBo); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - List records = page.getRecords(); - // 如果有任务记录,为每条记录设置流程状态名称 - if (CollUtil.isNotEmpty(records)) { - records.forEach(data -> data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus()))); - } - return page; + return TableDataInfo.build(page); } /** @@ -330,13 +283,20 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } + private QueryWrapper buildQueryWrapper(FlowTaskBo flowTaskBo) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); + wrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + wrapper.orderByDesc("t.create_time"); + return wrapper; + } + /** * 驳回任务 * @@ -431,4 +391,38 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException(e.getMessage()); } } + + /** + * 通过taskId查询对应的任务办理人 + * + * @param taskIds taskId串逗号分隔 + * @return 任务办理人名称串逗号分隔 + */ + @Override + public String selectAssigneeByIds(String taskIds) { + if (StringUtils.isBlank(taskIds)) { + return null; + } + List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + // 获取处理用户的昵称并将其合并为一个字符串 + return WorkflowUtils.getHandlerUser(userList).stream() + .map(UserDTO::getNickName) + .collect(Collectors.joining(",")); + } + + /** + * 通过taskId查询对应的任务办理人列表 + * + * @param taskIds taskId串逗号分隔 + * @return 列表 + */ + @Override + public List selectByIds(String taskIds) { + if (StringUtils.isBlank(taskIds)) { + return Collections.emptyList(); + } + List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + return WorkflowUtils.getHandlerUser(userList); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index e89f3a18a..f9d5e24a6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.warm.flow.ui.dto.HandlerFunDto; import com.warm.flow.ui.dto.HandlerQuery; import com.warm.flow.ui.dto.TreeFunDto; @@ -10,6 +11,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; @@ -19,9 +21,11 @@ import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -33,7 +37,7 @@ import java.util.Optional; @Slf4j @RequiredArgsConstructor @Service -public class WfTaskAssigneeServiceImpl implements HandlerSelectService { +public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, HandlerSelectService { final static String DEFAULT_GROUP_NAME = "默认分组"; private final UserService userService; private final DeptService deptService; @@ -118,4 +122,39 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); } + /** + * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * + * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") + * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + */ + @Override + public List fetchUsersByStorageId(String storageId) { + String[] parts = storageId.split(StrUtil.COLON, 2); + if (parts.length < 2) { + return Collections.emptyList(); + } + return getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))); + } + + /** + * 根据指定的任务分配类型(TaskAssigneeEnum)和 ID 列表,获取对应的用户信息列表 + * + * @param type 任务分配类型,表示用户、角色、部门或其他(TaskAssigneeEnum 枚举值) + * @param ids 与指定分配类型关联的 ID 列表(例如用户ID、角色ID、部门ID等) + * @return 返回包含用户信息的列表。如果类型为用户(USER),则通过用户ID列表查询; + * 如果类型为角色(ROLE),则通过角色ID列表查询; + * 如果类型为部门(DEPT),则通过部门ID列表查询; + * 如果类型为岗位(POST)或无法识别的类型,则返回空列表 + */ + private List getUsersByType(TaskAssigneeEnum type, List ids) { + return switch (type) { + case USER -> userService.selectListByIds(ids); + case ROLE -> userService.selectUsersByRoleIds(ids); + case DEPT -> userService.selectUsersByDeptIds(ids); + // todo 岗位后续待添加 + default -> Collections.emptyList(); + }; + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index df3655160..741f94e4f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,20 +1,22 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; +import java.util.Collections; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.workflow.service.IWfTaskAssigneeService; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -52,53 +54,40 @@ public class WorkflowUtils { */ public static List getHandlerUser(List userList) { if (CollUtil.isEmpty(userList)) { - return List.of(); + return Collections.emptyList(); } - UserService userService = SpringUtils.getBean(UserService.class); - List userIds = new ArrayList<>(); - List roleIds = new ArrayList<>(); - List deptIds = new ArrayList<>(); - for (User user : userList) { - String processedBy = user.getProcessedBy(); - Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); - if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) { - userIds.add(id); - } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { - roleIds.add(id); - } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { - deptIds.add(id); - } else { - userIds.add(Long.valueOf(processedBy)); - } - } - // 合并不同类型用户 - List userDTOList = new ArrayList<>(userService.selectListByIds(userIds)); - userDTOList.addAll(userService.selectUsersByRoleIds(roleIds)); - userDTOList.addAll(userService.selectUsersByDeptIds(deptIds)); - return userDTOList; + IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); + // 获取所有用户的 UserDTO 列表 + return userList.stream() + .map(User::getProcessedBy) + .filter(Objects::nonNull) + .flatMap(processedBy -> taskAssigneeService.fetchUsersByStorageId(processedBy).stream()) + .collect(Collectors.toList()); } /** * 获取办理人 * * @param userList 办理用户 + * @param taskId 任务ID * @return 用户 */ - public static Set getUser(List userList) { + public static Set getUser(List userList, Long taskId) { if (CollUtil.isEmpty(userList)) { return Set.of(); } Set list = new HashSet<>(); - UserService userService = SpringUtils.getBean(UserService.class); + IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = getAssociatedUsers(userService, user); + List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { FlowUser flowUser = new FlowUser(); flowUser.setType(user.getType()); flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + flowUser.setAssociated(taskId); list.add(flowUser); }); } @@ -106,29 +95,4 @@ public class WorkflowUtils { return list; } - /** - * 根据用户的 `processedBy` 前缀(user、role、dept)获取关联的用户列表 - * - * @param userService 用户服务,用于从数据库中查询用户信息 - * @param user 办理用户实例,通过 `processedBy` 字段识别处理人类型 - * @return 返回符合条件的用户DTO列表,如果未找到匹配的前缀则返回空列表 - */ - private static List getAssociatedUsers(UserService userService, User user) { - String processedBy = user.getProcessedBy(); - // 提取 processedBy 字段中 ":" 后的部分作为ID - Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); - if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) { - // 如果前缀为 "user:",根据用户ID查询 - return userService.selectListByIds(List.of(id)); - } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { - // 如果前缀为 "role:",根据角色ID查询用户 - return userService.selectUsersByRoleIds(List.of(id)); - } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { - // 如果前缀为 "dept:",根据部门ID查询用户 - return userService.selectUsersByDeptIds(List.of(id)); - } - // 未匹配任何前缀,返回空列表 - return Collections.emptyList(); - } - } From 0a31cd0b94264f71594241ff2704847551caf18b Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 15:12:50 +0800 Subject: [PATCH 056/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86=E5=99=A8=E5=92=8C=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E5=B0=81=E8=A3=85=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-common/pom.xml | 1 + ruoyi-common/ruoyi-common-bom/pom.xml | 7 +++ ruoyi-common/ruoyi-common-workflow/pom.xml | 47 +++++++++++++++++++ .../config/WorkflowConfiguration.java | 28 +++++++++++ .../workflow}/enums/TaskAssigneeEnum.java | 6 +-- .../handler/WorkflowExceptionHandler.java | 30 ++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/common-workflow.yml | 8 ++++ ruoyi-modules/ruoyi-workflow/pom.xml | 19 ++++---- .../workflow/config/WarmFlowConfig.java | 15 ------ .../impl/WfTaskAssigneeServiceImpl.java | 2 +- .../dromara/workflow/utils/WorkflowUtils.java | 2 +- 12 files changed, 136 insertions(+), 30 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-workflow/pom.xml create mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java rename {ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common => ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow}/enums/TaskAssigneeEnum.java (96%) create mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java create mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 2930fd0b0..6f2ccdc06 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -34,6 +34,7 @@ ruoyi-common-tenant ruoyi-common-websocket ruoyi-common-sse + ruoyi-common-workflow ruoyi-common diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index dbc5f1c2b..eeadc7242 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -179,6 +179,13 @@ ${revision} + + + org.dromara + ruoyi-common-workflow + ${revision} + + diff --git a/ruoyi-common/ruoyi-common-workflow/pom.xml b/ruoyi-common/ruoyi-common-workflow/pom.xml new file mode 100644 index 000000000..c1dc6717d --- /dev/null +++ b/ruoyi-common/ruoyi-common-workflow/pom.xml @@ -0,0 +1,47 @@ + + + + ruoyi-common + org.dromara + ${revision} + + 4.0.0 + + ruoyi-common-workflow + + + ruoyi-common-workflow Warm-Flow国产工作流引擎 + + + + http://warm-flow.cn/ + + + + + + org.dromara + ruoyi-common-core + + + + + io.github.minliuhua + warm-flow-mybatis-plus-sb-starter + + + + io.github.minliuhua + warm-flow-plugin-spel + + + + io.github.minliuhua + warm-flow-plugin-ui-sb-web + + + + + diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java new file mode 100644 index 000000000..6812fcd71 --- /dev/null +++ b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java @@ -0,0 +1,28 @@ +package org.dromara.common.workflow.config; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.factory.YmlPropertySourceFactory; +import org.dromara.common.workflow.handler.WorkflowExceptionHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; + +/** + * workflow 配置属性 + * + * @author AprilWind + */ +@Slf4j +@AutoConfiguration +@PropertySource(value = "classpath:common-workflow.yml", factory = YmlPropertySourceFactory.class) +public class WorkflowConfiguration { + + /** + * workflow 异常处理器 + */ + @Bean + public WorkflowExceptionHandler workflowExceptionHandler() { + return new WorkflowExceptionHandler(); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java similarity index 96% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java rename to ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java index 42971c624..03a37b40f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java +++ b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.workflow.common.enums; +package org.dromara.common.workflow.enums; import lombok.AllArgsConstructor; import lombok.Getter; @@ -81,7 +81,7 @@ public enum TaskAssigneeEnum { /** * 获取所有办理人类型的描述列表 *

- * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项。 + * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项 *

* * @return List 返回所有办理人类型的描述列表 @@ -95,7 +95,7 @@ public enum TaskAssigneeEnum { /** * 获取所有办理人类型的代码列表 *

- * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断。 + * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断 *

* * @return List 返回所有办理人类型的代码列表 diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java new file mode 100644 index 000000000..2ef446d7b --- /dev/null +++ b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java @@ -0,0 +1,30 @@ +package org.dromara.common.workflow.handler; + +import cn.hutool.http.HttpStatus; +import com.warm.flow.core.exception.FlowException; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Workflow 异常处理器 + * + * @author AprilWind + */ +@Slf4j +@RestControllerAdvice +public class WorkflowExceptionHandler { + + /** + * 流程异常 + */ + @ExceptionHandler(FlowException.class) + public R handleForestException(FlowException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',流程异常.{}", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_UNAVAILABLE, e.getMessage()); + } + +} diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..a6da7ff44 --- /dev/null +++ b/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.workflow.config.WorkflowConfiguration diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml b/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml new file mode 100644 index 000000000..dfeb7e9cf --- /dev/null +++ b/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml @@ -0,0 +1,8 @@ +# warm-flow工作流配置 +warm-flow: + # 是否开启工作流,默认true + enabled: true + # 是否显示banner图,默认是 + banner: true + # 是否开启设计器ui,默认true + ui: true diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 6e18f8680..1dd4662ca 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -37,46 +37,45 @@ org.dromara ruoyi-common-mybatis + org.dromara ruoyi-common-web + org.dromara ruoyi-common-log + org.dromara ruoyi-common-idempotent + org.dromara ruoyi-common-excel + org.dromara ruoyi-common-translation + org.dromara ruoyi-common-tenant + org.dromara ruoyi-common-security - io.github.minliuhua - warm-flow-mybatis-plus-sb-starter - - - io.github.minliuhua - warm-flow-plugin-spel - - - io.github.minliuhua - warm-flow-plugin-ui-sb-web + org.dromara + ruoyi-common-workflow diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java deleted file mode 100644 index a38c83e27..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.config; - - -import org.springframework.context.annotation.Configuration; - -/** - * warmFlow配置 - * - * @author may - */ -@Configuration -public class WarmFlowConfig { - -} - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index f9d5e24a6..95af5891a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -20,7 +20,7 @@ import org.dromara.common.core.service.RoleService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.workflow.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 741f94e4f..26b22ff75 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -10,7 +10,7 @@ import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.workflow.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.HashSet; From 8910660078318d49f7cb596abbb57192306dc588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 12 Nov 2024 07:18:59 +0000 Subject: [PATCH 057/227] =?UTF-8?q?Revert=20"add=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E5=99=A8=E5=92=8C=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=B0=81=E8=A3=85=E5=8C=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0a31cd0b94264f71594241ff2704847551caf18b. --- ruoyi-common/pom.xml | 1 - ruoyi-common/ruoyi-common-bom/pom.xml | 7 --- ruoyi-common/ruoyi-common-workflow/pom.xml | 47 ------------------- .../config/WorkflowConfiguration.java | 28 ----------- .../handler/WorkflowExceptionHandler.java | 30 ------------ ...ot.autoconfigure.AutoConfiguration.imports | 1 - .../src/main/resources/common-workflow.yml | 8 ---- ruoyi-modules/ruoyi-workflow/pom.xml | 19 ++++---- .../common}/enums/TaskAssigneeEnum.java | 6 +-- .../workflow/config/WarmFlowConfig.java | 15 ++++++ .../impl/WfTaskAssigneeServiceImpl.java | 2 +- .../dromara/workflow/utils/WorkflowUtils.java | 2 +- 12 files changed, 30 insertions(+), 136 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-workflow/pom.xml delete mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java delete mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java delete mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml rename {ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common}/enums/TaskAssigneeEnum.java (96%) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 6f2ccdc06..2930fd0b0 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -34,7 +34,6 @@ ruoyi-common-tenant ruoyi-common-websocket ruoyi-common-sse - ruoyi-common-workflow ruoyi-common diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index eeadc7242..dbc5f1c2b 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -179,13 +179,6 @@ ${revision} - - - org.dromara - ruoyi-common-workflow - ${revision} - - diff --git a/ruoyi-common/ruoyi-common-workflow/pom.xml b/ruoyi-common/ruoyi-common-workflow/pom.xml deleted file mode 100644 index c1dc6717d..000000000 --- a/ruoyi-common/ruoyi-common-workflow/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - ruoyi-common - org.dromara - ${revision} - - 4.0.0 - - ruoyi-common-workflow - - - ruoyi-common-workflow Warm-Flow国产工作流引擎 - - - - http://warm-flow.cn/ - - - - - - org.dromara - ruoyi-common-core - - - - - io.github.minliuhua - warm-flow-mybatis-plus-sb-starter - - - - io.github.minliuhua - warm-flow-plugin-spel - - - - io.github.minliuhua - warm-flow-plugin-ui-sb-web - - - - - diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java deleted file mode 100644 index 6812fcd71..000000000 --- a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/config/WorkflowConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.dromara.common.workflow.config; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.factory.YmlPropertySourceFactory; -import org.dromara.common.workflow.handler.WorkflowExceptionHandler; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; - -/** - * workflow 配置属性 - * - * @author AprilWind - */ -@Slf4j -@AutoConfiguration -@PropertySource(value = "classpath:common-workflow.yml", factory = YmlPropertySourceFactory.class) -public class WorkflowConfiguration { - - /** - * workflow 异常处理器 - */ - @Bean - public WorkflowExceptionHandler workflowExceptionHandler() { - return new WorkflowExceptionHandler(); - } - -} diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java b/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java deleted file mode 100644 index 2ef446d7b..000000000 --- a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/handler/WorkflowExceptionHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.common.workflow.handler; - -import cn.hutool.http.HttpStatus; -import com.warm.flow.core.exception.FlowException; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * Workflow 异常处理器 - * - * @author AprilWind - */ -@Slf4j -@RestControllerAdvice -public class WorkflowExceptionHandler { - - /** - * 流程异常 - */ - @ExceptionHandler(FlowException.class) - public R handleForestException(FlowException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',流程异常.{}", requestURI, e.getMessage()); - return R.fail(HttpStatus.HTTP_UNAVAILABLE, e.getMessage()); - } - -} diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index a6da7ff44..000000000 --- a/ruoyi-common/ruoyi-common-workflow/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -org.dromara.common.workflow.config.WorkflowConfiguration diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml b/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml deleted file mode 100644 index dfeb7e9cf..000000000 --- a/ruoyi-common/ruoyi-common-workflow/src/main/resources/common-workflow.yml +++ /dev/null @@ -1,8 +0,0 @@ -# warm-flow工作流配置 -warm-flow: - # 是否开启工作流,默认true - enabled: true - # 是否显示banner图,默认是 - banner: true - # 是否开启设计器ui,默认true - ui: true diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 1dd4662ca..6e18f8680 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -37,45 +37,46 @@ org.dromara ruoyi-common-mybatis - org.dromara ruoyi-common-web - org.dromara ruoyi-common-log - org.dromara ruoyi-common-idempotent - org.dromara ruoyi-common-excel - org.dromara ruoyi-common-translation - org.dromara ruoyi-common-tenant - org.dromara ruoyi-common-security - org.dromara - ruoyi-common-workflow + io.github.minliuhua + warm-flow-mybatis-plus-sb-starter + + + io.github.minliuhua + warm-flow-plugin-spel + + + io.github.minliuhua + warm-flow-plugin-ui-sb-web diff --git a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java similarity index 96% rename from ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java index 03a37b40f..42971c624 100644 --- a/ruoyi-common/ruoyi-common-workflow/src/main/java/org/dromara/common/workflow/enums/TaskAssigneeEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.common.workflow.enums; +package org.dromara.workflow.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; @@ -81,7 +81,7 @@ public enum TaskAssigneeEnum { /** * 获取所有办理人类型的描述列表 *

- * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项 + * 获取当前枚举类所有项的描述字段列表,通常用于展示选择项。 *

* * @return List 返回所有办理人类型的描述列表 @@ -95,7 +95,7 @@ public enum TaskAssigneeEnum { /** * 获取所有办理人类型的代码列表 *

- * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断 + * 获取当前枚举类所有项的代码字段列表,通常用于程序内部逻辑的判断。 *

* * @return List 返回所有办理人类型的代码列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java new file mode 100644 index 000000000..a38c83e27 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.config; + + +import org.springframework.context.annotation.Configuration; + +/** + * warmFlow配置 + * + * @author may + */ +@Configuration +public class WarmFlowConfig { + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 95af5891a..f9d5e24a6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -20,7 +20,7 @@ import org.dromara.common.core.service.RoleService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.workflow.enums.TaskAssigneeEnum; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 26b22ff75..741f94e4f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -10,7 +10,7 @@ import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.workflow.enums.TaskAssigneeEnum; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.HashSet; From 3bd801894de37bde28ac667a56d553e1aceb0855 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 15:32:08 +0800 Subject: [PATCH 058/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=BF=80?= =?UTF-8?q?=E6=B4=BB/=E6=8C=82=E8=B5=B7=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/FlwDefinitionController.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 4bb15ca2b..99c03a775 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -21,7 +21,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; - /** * 流程定义管理 控制层 * @@ -179,11 +178,7 @@ public class FlwDefinitionController extends BaseController { */ @PutMapping("/updateDefinitionState/{id}/{active}") public R active(@PathVariable Long id, @PathVariable boolean active) { - if (active) { - return R.ok(defService.unActive(id)); - } else { - return R.ok(defService.active(id)); - } + return R.ok(active ? defService.unActive(id) : defService.active(id)); } } From 5b337b4d2f2502d8a85741a570ad84ff346ffcad Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 15:47:27 +0800 Subject: [PATCH 059/227] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=B2=97=E4=BD=8DID=E6=9F=A5=E8=AF=A2=E7=94=A8?= =?UTF-8?q?=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/UserService.java | 8 +++++++ .../service/impl/SysUserServiceImpl.java | 22 +++++++++++++++++++ .../impl/WfTaskAssigneeServiceImpl.java | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 2c8b99bbb..1914b3fff 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -85,6 +85,14 @@ public interface UserService { */ List selectUsersByDeptIds(List deptIds); + /** + * 通过岗位ID查询用户 + * + * @param postIds 岗位ids + * @return 用户 + */ + List selectUsersByPostIds(List postIds); + /** * 查询用户并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 0a5e9d507..763ac582d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -696,6 +696,28 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return BeanUtil.copyToList(list, UserDTO.class); } + /** + * 通过岗位ID查询用户 + * + * @param postIds 岗位ids + * @return 用户 + */ + @Override + public List selectUsersByPostIds(List postIds) { + if (CollUtil.isEmpty(postIds)) { + return List.of(); + } + + // 通过岗位ID获取用户岗位信息 + List userPosts = userPostMapper.selectList( + new LambdaQueryWrapper().in(SysUserPost::getPostId, postIds)); + + // 获取用户ID列表 + Set userIds = StreamUtils.toSet(userPosts, SysUserPost::getUserId); + + return selectListByIds(new ArrayList<>(userIds)); + } + /** * 查询用户并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index f9d5e24a6..a87a9a829 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -152,7 +152,7 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle case USER -> userService.selectListByIds(ids); case ROLE -> userService.selectUsersByRoleIds(ids); case DEPT -> userService.selectUsersByDeptIds(ids); - // todo 岗位后续待添加 + case POST -> userService.selectUsersByPostIds(ids); default -> Collections.emptyList(); }; } From 9708d6e1bce2049e6396f152adbbbe517e5cfb1d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 16:21:09 +0800 Subject: [PATCH 060/227] =?UTF-8?q?update=20=E5=BD=93=E5=89=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=89=80=E6=9C=89=E6=9D=83=E9=99=90=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=B2=97=E4=BD=8DID=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/CacheNames.java | 5 +++ .../common/core/service/PostService.java | 10 ++++++ .../service/impl/SysPostServiceImpl.java | 17 ++++++++++ .../service/impl/SysUserServiceImpl.java | 6 +++- .../dromara/workflow/utils/WorkflowUtils.java | 33 ++++++++++++------- 5 files changed, 58 insertions(+), 13 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index bf8efc550..16cb32d5d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -55,6 +55,11 @@ public interface CacheNames { */ String SYS_DEPT = "sys_dept#30d"; + /** + * 岗位 ID 列表 + */ + String SYS_POST_ID = "sys_post_id#30d"; + /** * OSS内容 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java index 6e4ead244..abb72534b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -3,6 +3,8 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import java.util.List; + /** * 通用 岗位服务 * @@ -10,6 +12,14 @@ import org.dromara.common.core.domain.model.TaskAssigneeBody; */ public interface PostService { + /** + * 根据用户 ID 查询其所属的岗位 ID 列表 + * + * @param userId 用户 ID,用于确定用户所属的岗位 + * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 + */ + List selectPostIdByUserIdList(Long userId); + /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 2848347df..f0962e953 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -25,6 +26,7 @@ import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.service.ISysPostService; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -238,6 +240,21 @@ public class SysPostServiceImpl implements ISysPostService, PostService { return baseMapper.updateById(post); } + /** + * 根据用户 ID 查询其所属的岗位 ID 列表 + * + * @param userId 用户 ID,用于确定用户所属的岗位 + * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 + */ + @Cacheable(cacheNames = CacheNames.SYS_POST_ID, key = "#userId") + @Override + public List selectPostIdByUserIdList(Long userId) { + // 通过岗位ID获取用户岗位信息 + List userPosts = userPostMapper.selectList( + new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + return StreamUtils.toList(userPosts, SysUserPost::getPostId); + } + /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 763ac582d..58acbc9dc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -34,6 +34,7 @@ import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -329,8 +330,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService { * @param user 用户信息 * @return 结果 */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId"), + @CacheEvict(cacheNames = CacheNames.SYS_POST_ID, key = "#user.userId")} + ) @Override - @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") @Transactional(rollbackFor = Exception.class) public int updateUser(SysUserBo user) { // 新增用户与角色管理 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 741f94e4f..2ab7b641d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -3,20 +3,17 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; -import java.util.Collections; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -35,15 +32,27 @@ public class WorkflowUtils { */ public static List permissionList() { LoginUser loginUser = LoginHelper.getLoginUser(); + Long userId = loginUser.getUserId(); Long deptId = loginUser.getDeptId(); - //todo 岗位获取待考虑 - return Stream.concat( - loginUser.getRoles().stream().map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), - Stream.of( - TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), - TaskAssigneeEnum.DEPT.getCode() + deptId + List postIds = SpringUtils.getBean(PostService.class).selectPostIdByUserIdList(userId); + // 使用一个流来构建权限列表 + return Stream.of( + // 角色权限前缀 + loginUser.getRoles().stream() + .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + + // 岗位权限前缀 + postIds.stream() + .map(postId -> TaskAssigneeEnum.POST.getCode() + postId), + + // 用户和部门权限 + Stream.of( + TaskAssigneeEnum.USER.getCode() + userId, + TaskAssigneeEnum.DEPT.getCode() + deptId + ) ) - ).collect(Collectors.toList()); + .flatMap(stream -> stream) + .collect(Collectors.toList()); } /** From 6a7ec27a21df25ff27f313920182f6e1ce02de10 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 17:25:16 +0800 Subject: [PATCH 061/227] =?UTF-8?q?update=20=E5=BD=93=E5=89=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=89=80=E6=9C=89=E6=9D=83=E9=99=90=E5=B2=97=E4=BD=8D?= =?UTF-8?q?ID=E6=94=B9=E4=B8=BA=E4=BB=8Etoken=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/web/service/SysLoginService.java | 13 ++++-- .../common/core/constant/CacheNames.java | 5 -- .../common/core/domain/dto/PostDTO.java | 46 +++++++++++++++++++ .../common/core/domain/model/LoginUser.java | 8 +++- .../common/core/service/PostService.java | 10 ---- .../system/service/ISysPostService.java | 8 ++++ .../service/impl/SysPostServiceImpl.java | 28 +++++------ .../service/impl/SysUserServiceImpl.java | 6 +-- .../dromara/workflow/utils/WorkflowUtils.java | 6 +-- 9 files changed, 84 insertions(+), 46 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 0fdd521a0..fcd1cab6c 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -14,6 +14,7 @@ import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.enums.LoginType; @@ -60,6 +61,7 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final ISysRoleService roleService; private final ISysDeptService deptService; + private final ISysPostService postService; private final SysUserMapper userMapper; @@ -148,21 +150,24 @@ public class SysLoginService { */ public LoginUser buildLoginUser(SysUserVo user) { LoginUser loginUser = new LoginUser(); + Long userId = user.getUserId(); loginUser.setTenantId(user.getTenantId()); - loginUser.setUserId(user.getUserId()); + loginUser.setUserId(userId); loginUser.setDeptId(user.getDeptId()); loginUser.setUsername(user.getUserName()); loginUser.setNickname(user.getNickName()); loginUser.setUserType(user.getUserType()); - loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); - loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); + loginUser.setMenuPermission(permissionService.getMenuPermission(userId)); + loginUser.setRolePermission(permissionService.getRolePermission(userId)); if (ObjectUtil.isNotNull(user.getDeptId())) { Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); } - List roles = roleService.selectRolesByUserId(user.getUserId()); + List roles = roleService.selectRolesByUserId(userId); + List posts = postService.selectPostsByUserId(userId); loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); + loginUser.setPosts(BeanUtil.copyToList(posts, PostDTO.class)); return loginUser; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index 16cb32d5d..bf8efc550 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -55,11 +55,6 @@ public interface CacheNames { */ String SYS_DEPT = "sys_dept#30d"; - /** - * 岗位 ID 列表 - */ - String SYS_POST_ID = "sys_post_id#30d"; - /** * OSS内容 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java new file mode 100644 index 000000000..7536ee33d --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java @@ -0,0 +1,46 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 岗位 + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class PostDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + private Long postId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位类别编码 + */ + private String postCategory; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java index c723e7668..338d4d70a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -1,8 +1,9 @@ package org.dromara.common.core.domain.model; -import org.dromara.common.core.domain.dto.RoleDTO; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.dto.PostDTO; +import org.dromara.common.core.domain.dto.RoleDTO; import java.io.Serial; import java.io.Serializable; @@ -111,6 +112,11 @@ public class LoginUser implements Serializable { */ private List roles; + /** + * 岗位对象 + */ + private List posts; + /** * 数据权限 当前角色ID */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java index abb72534b..6e4ead244 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -3,8 +3,6 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; -import java.util.List; - /** * 通用 岗位服务 * @@ -12,14 +10,6 @@ import java.util.List; */ public interface PostService { - /** - * 根据用户 ID 查询其所属的岗位 ID 列表 - * - * @param userId 用户 ID,用于确定用户所属的岗位 - * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 - */ - List selectPostIdByUserIdList(Long userId); - /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java index 3751b23be..a760d497e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -25,6 +25,14 @@ public interface ISysPostService { */ List selectPostList(SysPostBo post); + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 岗位ID + */ + List selectPostsByUserId(Long userId); + /** * 查询所有岗位 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index f0962e953..120d79ddf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -26,7 +25,6 @@ import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.service.ISysPostService; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -63,6 +61,17 @@ public class SysPostServiceImpl implements ISysPostService, PostService { return baseMapper.selectVoList(buildQueryWrapper(post)); } + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 岗位ID + */ + @Override + public List selectPostsByUserId(Long userId) { + return baseMapper.selectPostsByUserId(userId); + } + /** * 根据查询条件构建查询包装器 * @@ -240,21 +249,6 @@ public class SysPostServiceImpl implements ISysPostService, PostService { return baseMapper.updateById(post); } - /** - * 根据用户 ID 查询其所属的岗位 ID 列表 - * - * @param userId 用户 ID,用于确定用户所属的岗位 - * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 - */ - @Cacheable(cacheNames = CacheNames.SYS_POST_ID, key = "#userId") - @Override - public List selectPostIdByUserIdList(Long userId) { - // 通过岗位ID获取用户岗位信息 - List userPosts = userPostMapper.selectList( - new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); - return StreamUtils.toList(userPosts, SysUserPost::getPostId); - } - /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 58acbc9dc..763ac582d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -34,7 +34,6 @@ import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; -import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -330,11 +329,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { * @param user 用户信息 * @return 结果 */ - @Caching(evict = { - @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId"), - @CacheEvict(cacheNames = CacheNames.SYS_POST_ID, key = "#user.userId")} - ) @Override + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") @Transactional(rollbackFor = Exception.class) public int updateUser(SysUserBo user) { // 新增用户与角色管理 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 2ab7b641d..6e78770d4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -7,7 +7,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; @@ -34,7 +33,6 @@ public class WorkflowUtils { LoginUser loginUser = LoginHelper.getLoginUser(); Long userId = loginUser.getUserId(); Long deptId = loginUser.getDeptId(); - List postIds = SpringUtils.getBean(PostService.class).selectPostIdByUserIdList(userId); // 使用一个流来构建权限列表 return Stream.of( // 角色权限前缀 @@ -42,8 +40,8 @@ public class WorkflowUtils { .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), // 岗位权限前缀 - postIds.stream() - .map(postId -> TaskAssigneeEnum.POST.getCode() + postId), + loginUser.getPosts().stream() + .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), // 用户和部门权限 Stream.of( From 967611ddb6e2788a9645343658040432dea3e708 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 12 Nov 2024 17:35:34 +0800 Subject: [PATCH 062/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B2=97=E4=BD=8D=E6=9D=83=E9=99=90=E5=88=A4?= =?UTF-8?q?=E7=A9=BA=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/utils/WorkflowUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 6e78770d4..11f3e7ae0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -40,7 +40,8 @@ public class WorkflowUtils { .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), // 岗位权限前缀 - loginUser.getPosts().stream() + Stream.ofNullable(loginUser.getPosts()) + .flatMap(Collection::stream) .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), // 用户和部门权限 From cfc969e45ef1d190202590a5e6d77dced0971354 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 13 Nov 2024 09:21:01 +0800 Subject: [PATCH 063/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96workflow?= =?UTF-8?q?=E8=A1=A8sql=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_workflow.sql | 332 ++++++++++++++++++++----------------- 1 file changed, 177 insertions(+), 155 deletions(-) diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 518d384cc..15dc3d727 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -1,176 +1,198 @@ -insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'model', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); - - --- 流程分类管理相关按钮 -insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); --- 请假单信息 -create table test_leave -( - id bigint not null comment '主键', - leave_type varchar(255) not null comment '请假类型', - start_date datetime not null comment '开始时间', - end_date datetime not null comment '结束时间', - leave_days int(10) not null comment '请假天数', - remark varchar(255) null comment '请假原因', - status varchar(255) null comment '状态', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - tenant_id varchar(20) null comment '租户编号', - PRIMARY KEY (id) USING BTREE -) ENGINE = InnoDB COMMENT = '请假申请表'; - --- 流程分类信息表 +-- ---------------------------- +-- 1、流程分类表 +-- ---------------------------- create table wf_category ( - id bigint not null comment '主键' - primary key, - category_name varchar(255) null comment '分类名称', - category_code varchar(255) null comment '分类编码', - parent_id bigint null comment '父级id', - sort_num int(19) null comment '排序', - tenant_id varchar(20) null comment '租户编号', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - constraint uni_category_code - unique (category_code) -) engine=innodb comment= '流程分类'; + id bigint(20) not null comment '流程分类ID', + tenant_id varchar(20) default '000000' comment '租户编号', + category_name varchar(255) null comment '分类名称', + category_code varchar(255) null comment '分类编码', + parent_id bigint null comment '父级id', + sort_num int(19) null comment '排序', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', + constraint uni_category_code unique (category_code), + primary key (id) +) engine = innodb comment = '流程分类'; INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, sysdate(), 1, sysdate()); +-- ---------------------------- +-- 2、节点审批记录表 +-- ---------------------------- create table wf_task_back_node ( - id bigint not null - primary key, - node_id varchar(255) not null comment '节点id', - node_name varchar(255) not null comment '节点名称', - order_no int not null comment '排序', - instance_id varchar(255) null comment '流程实例id', - task_type varchar(255) not null comment '节点类型', - assignee varchar(2000) not null comment '审批人', - tenant_id varchar(20) null comment '租户编号', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间' -) - comment '节点审批记录'; + id bigint(20) not null comment '节点审批ID', + tenant_id varchar(20) default '000000' comment '租户编号', + node_id varchar(255) not null comment '节点id', + node_name varchar(255) not null comment '节点名称', + order_no int not null comment '排序', + instance_id varchar(255) null comment '流程实例id', + task_type varchar(255) not null comment '节点类型', + assignee varchar(2000) not null comment '审批人', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', + primary key (id) +) engine = innodb comment '节点审批记录'; +-- ---------------------------- +-- 3、流程定义配置表 +-- ---------------------------- create table wf_definition_config ( - id bigint not null comment '主键' - primary key, - table_name varchar(255) not null comment '表名', - definition_id varchar(255) not null comment '流程定义ID', - process_key varchar(255) not null comment '流程KEY', - version varchar(255) not null comment '流程版本', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - remark varchar(500) default '' null comment '备注', - tenant_id varchar(20) null comment '租户编号', - constraint uni_definition_id - unique (definition_id) -) - comment '流程定义配置'; + id bigint(20) not null comment '流程定义ID', + tenant_id varchar(20) default '000000' comment '租户编号', + table_name varchar(255) not null comment '表名', + definition_id varchar(255) not null comment '流程定义ID', + process_key varchar(255) not null comment '流程KEY', + version varchar(255) not null comment '流程版本', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', + remark varchar(500) default '' null comment '备注', + primary key (id), + constraint uni_definition_id unique (definition_id) +) engine = innodb comment '流程定义配置'; +-- ---------------------------- +-- 4、表单管理 +-- ---------------------------- create table wf_form_manage ( - id bigint not null comment '主键' - primary key, + id bigint(20) not null comment '表单ID', + tenant_id varchar(20) default '000000' comment '租户编号', form_name varchar(255) not null comment '表单名称', form_type varchar(255) not null comment '表单类型', router varchar(255) not null comment '路由地址/表单ID', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', remark varchar(500) null comment '备注', - tenant_id varchar(20) null comment '租户编号', + primary key (id) +) engine = innodb comment '表单管理'; + +insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time,update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate()); + +-- ---------------------------- +-- 5、节点配置 +-- ---------------------------- +create table wf_node_config +( + id bigint(20) not null comment 'id', + tenant_id varchar(20) default '000000' comment '租户编号', + form_id bigint null comment '表单id', + form_type varchar(255) null comment '表单类型', + node_name varchar(255) not null comment '节点名称', + node_id varchar(255) not null comment '节点id', + definition_id varchar(255) not null comment '流程定义id', + apply_user_task char(1) default '0' comment '是否为申请人节点 (0是 1否)', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', + primary key (id) +) engine = innodb comment '节点配置'; + +insert into sys_menu +values ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(), + NULL, NULL, ''); +insert into sys_menu +values ('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', + 'workflow:model:list', 'model', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, + NULL, ''); +insert into sys_menu +values ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', + 'waiting', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', + 'finish', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', + '', 'my-copy', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', + '0', '0', '', 'process-definition', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', + '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', + 'workflow:category:list', 'category', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', + 'guide', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu +values ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), + NULL, NULL, ''); +insert into sys_menu +values ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', + '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); + +-- 流程分类管理相关按钮 +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103,1, sysdate(), null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103,1, sysdate(), null, null, ''); + +INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已撤销'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate(), NULL, NULL, '草稿'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'待审核'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'已完成'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已作废'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已退回'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL,NULL, '已终止'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'自定义表单'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'动态表单'); + +-- 表单管理 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0','workflow:formManage:list', 'tree-table', 103, 1, sysdate(), null, null, '表单管理菜单'); + +-- 表单管理按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1,sysdate(), null, null, ''); +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1,sysdate(), null, null, ''); +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1,sysdate(), null, null, ''); +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1,sysdate(), null, null, ''); +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table',103, 1, sysdate(), null, null, ''); + +-- ---------------------------- +-- 6、请假单信息 +-- ---------------------------- +create table test_leave +( + id bigint(20) not null comment 'id', + tenant_id varchar(20) default '000000' comment '租户编号', + leave_type varchar(255) not null comment '请假类型', + start_date datetime not null comment '开始时间', + end_date datetime not null comment '结束时间', + leave_days int(10) not null comment '请假天数', + remark varchar(255) null comment '请假原因', + status varchar(255) null comment '状态', create_dept bigint null comment '创建部门', create_by bigint null comment '创建者', create_time datetime null comment '创建时间', update_by bigint null comment '更新者', - update_time datetime null comment '更新时间' -) - comment '表单管理'; + update_time datetime null comment '更新时间', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB COMMENT = '请假申请表'; -insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate()); - -create table wf_node_config -( - id bigint not null comment '主键' - primary key, - form_id bigint null comment '表单id', - form_type varchar(255) null comment '表单类型', - node_name varchar(255) not null comment '节点名称', - node_id varchar(255) not null comment '节点id', - definition_id varchar(255) not null comment '流程定义id', - apply_user_task char(1) default '0' comment '是否为申请人节点 (0是 1否)', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - tenant_id varchar(20) null comment '租户编号' -) - comment '节点配置'; - - -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); - -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表'); - -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1,sysdate(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL, '已完成'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '已作废'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '已退回'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1,sysdate(), NULL, NULL, '已终止'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '动态表单'); - --- 表单管理 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0', 'workflow:formManage:list', 'tree-table', 103, 1, sysdate(), null, null, '表单管理菜单'); - --- 表单管理按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1, sysdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1, sysdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1, sysdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1, sysdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table', 103, 1, sysdate(), null, null, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103,1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate(),NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate(),NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(),NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate(),NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate(),NULL, NULL, ''); From 9e63062f8dc54f22781dc24c422defbce2b45df0 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 13 Nov 2024 10:17:55 +0800 Subject: [PATCH 064/227] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0warm-flow?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 +++--- ruoyi-modules/ruoyi-workflow/pom.xml | 6 ++-- .../controller/FlwDefinitionController.java | 6 ++-- .../controller/FlwInstanceController.java | 4 +-- .../controller/FlwTaskController.java | 19 +++++----- .../workflow/domain/vo/FlowDefinitionVo.java | 2 +- .../workflow/domain/vo/FlowHisTaskVo.java | 2 +- .../workflow/domain/vo/FlowTaskVo.java | 2 +- .../dromara/workflow/mapper/FlwDefMapper.java | 2 +- .../service/IFlwDefinitionService.java | 2 +- .../workflow/service/IFlwInstanceService.java | 4 +-- .../workflow/service/IFlwTaskService.java | 3 +- .../impl/FlwDefinitionServiceImpl.java | 8 ++--- .../service/impl/FlwInstanceServiceImpl.java | 24 ++++++------- .../service/impl/FlwTaskServiceImpl.java | 36 +++++++++---------- .../service/impl/TestLeaveServiceImpl.java | 2 +- .../impl/WfTaskAssigneeServiceImpl.java | 10 +++--- .../dromara/workflow/utils/WorkflowUtils.java | 4 +-- .../mapper/workflow/FlwDefMapper.xml | 2 +- 19 files changed, 72 insertions(+), 77 deletions(-) diff --git a/pom.xml b/pom.xml index c8e944060..aea86cb44 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20241022 - 1.3.0 + 1.3.3 3.2.2 @@ -118,24 +118,23 @@ import + - io.github.minliuhua + org.dromara warm-flow-mybatis-plus-sb-starter ${warm-flow.version} - - io.github.minliuhua + org.dromara warm-flow-plugin-spel ${warm-flow.version} - io.github.minliuhua + org.dromara warm-flow-plugin-ui-sb-web ${warm-flow.version} - me.zhyd.oauth diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 6e18f8680..980a2bfad 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -67,15 +67,15 @@ - io.github.minliuhua + org.dromara warm-flow-mybatis-plus-sb-starter - io.github.minliuhua + org.dromara warm-flow-plugin-spel - io.github.minliuhua + org.dromara warm-flow-plugin-ui-sb-web diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 99c03a775..37f9badb2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -1,8 +1,5 @@ package org.dromara.workflow.controller; -import com.warm.flow.core.entity.Definition; -import com.warm.flow.core.service.DefService; -import com.warm.flow.orm.entity.FlowDefinition; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -11,6 +8,9 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.transaction.annotation.Transactional; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index a22a5e471..c871ff691 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -1,12 +1,12 @@ package org.dromara.workflow.controller; -import com.warm.flow.core.entity.Instance; -import com.warm.flow.core.service.InsService; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.service.InsService; import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 85fb17ace..9d54d5629 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -2,15 +2,6 @@ package org.dromara.workflow.controller; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; -import com.warm.flow.core.dto.FlowParams; -import com.warm.flow.core.dto.ModifyHandler; -import com.warm.flow.core.entity.HisTask; -import com.warm.flow.core.entity.Instance; -import com.warm.flow.core.entity.Task; -import com.warm.flow.core.enums.CooperateType; -import com.warm.flow.core.enums.FlowStatus; -import com.warm.flow.core.service.InsService; -import com.warm.flow.core.service.TaskService; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; @@ -21,6 +12,14 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.dto.ModifyHandler; +import org.dromara.warm.flow.core.entity.HisTask; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.enums.CooperateType; +import org.dromara.warm.flow.core.enums.FlowStatus; +import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.core.service.TaskService; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -29,7 +28,6 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -49,7 +47,6 @@ public class FlwTaskController extends BaseController { private final TaskService taskService; private final InsService insService; - /** * 启动任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java index e4fc80e5f..bae92af87 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -1,6 +1,6 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowDefinition; public class FlowDefinitionVo extends FlowDefinition { } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index d44121f15..1d7b51d8f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,9 +1,9 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.core.enums.FlowStatus; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; +import org.dromara.warm.flow.core.enums.FlowStatus; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 7a7b6c54a..4b56e90db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -1,9 +1,9 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.core.entity.User; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; +import org.dromara.warm.flow.core.entity.User; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java index 4b316d98d..d3608bd41 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java @@ -3,8 +3,8 @@ package org.dromara.workflow.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.orm.entity.FlowDefinition; import org.apache.ibatis.annotations.Param; +import org.dromara.warm.flow.orm.entity.FlowDefinition; /** * 实例信息Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 0511c5eb8..a9326ea29 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -1,9 +1,9 @@ package org.dromara.workflow.service; -import com.warm.flow.orm.entity.FlowDefinition; import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.springframework.web.multipart.MultipartFile; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index b491f9f9a..4f2c744ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -1,9 +1,9 @@ package org.dromara.workflow.service; -import com.warm.flow.core.entity.Instance; -import com.warm.flow.orm.entity.FlowInstance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 2f1eee3dd..cb3ee5170 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,9 +1,8 @@ package org.dromara.workflow.service; -import com.warm.flow.core.entity.HisTask; -import com.warm.flow.core.entity.Instance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 0edade533..ce0b965d3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -5,10 +5,6 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.entity.Definition; -import com.warm.flow.core.service.DefService; -import com.warm.flow.orm.entity.FlowDefinition; -import com.warm.flow.orm.mapper.FlowDefinitionMapper; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,6 +14,10 @@ import org.dom4j.io.XMLWriter; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 48bb04089..09fcdb731 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -7,18 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.entity.Instance; -import com.warm.flow.core.enums.CooperateType; -import com.warm.flow.core.enums.FlowStatus; -import com.warm.flow.core.enums.NodeType; -import com.warm.flow.core.service.DefService; -import com.warm.flow.core.service.InsService; -import com.warm.flow.orm.entity.FlowDefinition; -import com.warm.flow.orm.entity.FlowHisTask; -import com.warm.flow.orm.entity.FlowInstance; -import com.warm.flow.orm.mapper.FlowDefinitionMapper; -import com.warm.flow.orm.mapper.FlowHisTaskMapper; -import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.SystemConstants; @@ -27,6 +15,18 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.enums.CooperateType; +import org.dromara.warm.flow.core.enums.FlowStatus; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c16567aba..31849f131 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -5,22 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.dto.FlowParams; -import com.warm.flow.core.entity.*; -import com.warm.flow.core.enums.FlowStatus; -import com.warm.flow.core.enums.NodeType; -import com.warm.flow.core.enums.SkipType; -import com.warm.flow.core.service.DefService; -import com.warm.flow.core.service.InsService; -import com.warm.flow.core.service.TaskService; -import com.warm.flow.core.service.UserService; -import com.warm.flow.orm.entity.FlowHisTask; -import com.warm.flow.orm.entity.FlowInstance; -import com.warm.flow.orm.entity.FlowSkip; -import com.warm.flow.orm.entity.FlowTask; -import com.warm.flow.orm.mapper.FlowHisTaskMapper; -import com.warm.flow.orm.mapper.FlowSkipMapper; -import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; @@ -32,6 +16,22 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.*; +import org.dromara.warm.flow.core.enums.FlowStatus; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.SkipType; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.core.service.UserService; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowSkip; +import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -109,7 +109,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - flowParams.setHandler(userId); + flowParams.handler(userId); flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { @@ -332,7 +332,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.message(bo.getMessage()); flowParams.handler(userId); flowParams.nodeCode(bo.getNodeCode()); - flowParams.setPermissionFlag(WorkflowUtils.permissionList()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance); flowProcessEventHandler.processHandler(definition.getFlowCode(), diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 76f7d2595..1b186c295 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -3,7 +3,6 @@ package org.dromara.workflow.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.warm.flow.core.enums.FlowStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; @@ -16,6 +15,7 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index a87a9a829..52581c198 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -2,11 +2,6 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; -import com.warm.flow.ui.dto.HandlerFunDto; -import com.warm.flow.ui.dto.HandlerQuery; -import com.warm.flow.ui.dto.TreeFunDto; -import com.warm.flow.ui.service.HandlerSelectService; -import com.warm.flow.ui.vo.HandlerSelectVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.DeptDTO; @@ -20,6 +15,11 @@ import org.dromara.common.core.service.RoleService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.ui.dto.HandlerFunDto; +import org.dromara.warm.flow.ui.dto.HandlerQuery; +import org.dromara.warm.flow.ui.dto.TreeFunDto; +import org.dromara.warm.flow.ui.service.HandlerSelectService; +import org.dromara.warm.flow.ui.vo.HandlerSelectVo; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 11f3e7ae0..a451cb599 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,14 +1,14 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; -import com.warm.flow.core.entity.User; -import com.warm.flow.orm.entity.FlowUser; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index ce3912789..1b6dc1a09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - select * from (select a.* from flow_definition a inner join (select flow_code,max(version) version from flow_definition group by flow_code) b From 2e83439e5e951921b1391a30fd9eae739d22683f Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 13 Nov 2024 14:27:02 +0800 Subject: [PATCH 065/227] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/WorkflowStartListener.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java new file mode 100644 index 000000000..456d81e88 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -0,0 +1,85 @@ +package org.dromara.workflow.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.listener.Listener; +import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 流程启动监听器,用于处理流程开始时的用户信息和权限设置 + *

+ * 该监听器在流程启动阶段执行,主要任务是获取当前登录用户的信息,并为流程设置办理人ID及其相关权限 + * 它通过监听器变量从流程中获取参数,并设置当前用户的权限信息,如角色、岗位、用户ID和部门ID等 + * 该监听器可以避免重复编写相同的权限设置逻辑,简化流程的启动配置 + *

+ * + * @author AprilWind + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowStartListener implements Listener { + + /** + * 全局开始监听器,用于在流程开始时,设置当前办理人的信息和权限 + *

+ * 此方法通过监听器变量获取流程参数,获取当前登录用户,并设置当前办理人的ID和其权限信息 + * 该监听器可以用于流程的开始阶段,避免重复设置办理人信息和权限 + *

+ * + * @param listenerVariable 监听器变量,包含流程参数等信息 + */ + @Override + public void notify(ListenerVariable listenerVariable) { + log.info("流程启动监听器"); + FlowParams flowParams = listenerVariable.getFlowParams(); + LoginUser loginUser = LoginHelper.getLoginUser(); + // 设置当前办理人id + flowParams.handler(loginUser.getUserId().toString()); + // 设置办理人所拥有的权限,比如角色、部门、用户等 + flowParams.permissionFlag(buildUserPermissions(loginUser)); + log.info("流程启动监听器结束;{}", "开启流程完成"); + } + + /** + * 构建当前用户的所有权限列表,包括角色、岗位、用户和部门权限 + *

+ * 通过合并用户的角色、岗位、用户ID和部门ID来构建用户的权限列表,格式化为字符串列表 + *

+ * + * @param loginUser 当前登录的用户对象,包含用户的角色、岗位、ID等信息 + * @return 权限列表,包含角色、岗位、用户和部门的权限,格式化为字符串列表 + */ + private List buildUserPermissions(LoginUser loginUser) { + // 使用一个流来构建权限列表 + return Stream.of( + // 角色权限前缀 + loginUser.getRoles().stream() + .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + + // 岗位权限前缀 + Stream.ofNullable(loginUser.getPosts()) + .flatMap(Collection::stream) + .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), + + // 用户和部门权限 + Stream.of( + TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), + TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() + ) + ) + .flatMap(stream -> stream) + .collect(Collectors.toList()); + } + +} From e1a9fe0e44fbe6e97796621266e83111bd5c3721 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 13 Nov 2024 15:27:27 +0800 Subject: [PATCH 066/227] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=8C=E6=88=90=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/WorkflowStatus.java | 131 ++++++++++++++++++ .../listener/WorkflowFinishListener.java | 65 +++++++++ 2 files changed, 196 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java new file mode 100644 index 000000000..9552e9ba8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java @@ -0,0 +1,131 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.warm.flow.core.utils.ObjectUtil; + +/** + * 工作流状态 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum WorkflowStatus { + + /** + * 待提交状态 + * 流程还未提交,处于待提交状态 + */ + TOBESUBMIT("0", "待提交", "submitted"), + + /** + * 审批中状态 + * 流程正在审批过程中,处于审批中状态 + */ + APPROVAL("1", "审批中", "approving"), + + /** + * 审批通过状态 + * 流程已通过审批,处于审批通过状态 + */ + PASS("2", "审批通过", "passed"), + + /** + * 自动完成状态 + * 流程已自动完成,通常不需要人工干预 + */ + AUTO_PASS("3", "自动完成", "auto"), + + /** + * 终止状态 + * 流程已终止,不能继续执行 + */ + TERMINATE("4", "终止", "terminated"), + + /** + * 作废状态 + * 流程被作废,已不再有效 + */ + NULLIFY("5", "作废", "nullified"), + + /** + * 撤销状态 + * 流程已被撤销,撤销后流程无法继续 + */ + CANCEL("6", "撤销", "cancelled"), + + /** + * 取回状态 + * 流程被取回,通常是审批被暂停,重新操作后可继续 + */ + RETRIEVE("7", "取回", "retrieved"), + + /** + * 已完成状态 + * 流程已全部完成,且所有操作已结束 + */ + FINISHED("8", "已完成", "done"), + + /** + * 已退回状态 + * 流程被退回,通常是审批不通过或者需要重新处理 + */ + REJECT("9", "已退回", "rejected"), + + /** + * 失效状态 + * 流程已失效,不再有效,不能继续执行 + */ + INVALID("10", "失效", "invalid"); + + /** + * 唯一标识符 + */ + private final String key; + + /** + * 中文描述 + */ + private final String value; + + /** + * 状态 + */ + private final String status; + + public static WorkflowStatus getByKey(String key) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getKey().equals(key)) { + return workflowStatus; + } + } + return null; + } + + public static WorkflowStatus getByValue(String value) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getValue().equals(value)) { + return workflowStatus; + } + } + return null; + } + + public static WorkflowStatus getByStatus(String status) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getStatus().equals(status)) { + return workflowStatus; + } + } + return null; + } + + public static Boolean isFinished(String key) { + return ObjectUtil.isNotNull(key) && (WorkflowStatus.FINISHED.getKey().equals(key)); + } + + public static Boolean isFinished(WorkflowStatus workflowStatus) { + return ObjectUtil.isNotNull(workflowStatus) && (WorkflowStatus.FINISHED == workflowStatus); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java new file mode 100644 index 000000000..6a13c1cd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java @@ -0,0 +1,65 @@ +package org.dromara.workflow.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.listener.Listener; +import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.workflow.common.enums.WorkflowStatus; +import org.dromara.workflow.service.IFlwInstanceService; +import org.springframework.stereotype.Component; + +/** + * 流程完成监听器,用于处理流程结束时的业务逻辑 + *

+ * 该监听器通常用于处理流程完成后的相关操作,如更新业务表、记录日志、通知等 + * 可以将业务逻辑放在此监听器中,也可以在业务代码中处理,或者使用局部监听器进行监听 + *

+ *

+ * 例如,当一个流程结束时,可能需要根据流程的状态更新业务表,执行后续的处理操作 + * 或者发送通知等。此监听器可以提供统一的处理入口 + *

+ * + * @author AprilWind + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowFinishListener implements Listener { + + private final IFlwInstanceService iFlwInstanceService; + + /** + * 流程结束监听器,用于在流程结束后执行相关的业务逻辑 + *

+ * 该方法会在流程完成后被触发,通常用于执行业务表的新增或更新操作 + * 或者其他与业务相关的操作(如通知发送、记录日志等) + *

+ * + * @param listenerVariable 监听器变量,包含与当前流程相关的信息 + */ + @Override + public void notify(ListenerVariable listenerVariable) { + log.info("流程结束监听器"); + Instance instance = listenerVariable.getInstance(); + WorkflowStatus status = WorkflowStatus.getByKey(instance.getFlowStatus()); + Definition definition = listenerVariable.getDefinition(); + ProcessEvent processEvent = new ProcessEvent(); + //检查流程是否已结束 + if (WorkflowStatus.isFinished(status)) { + // 若流程已结束,更新状态为已完成 + iFlwInstanceService.updateStatus(instance.getId(), status.getStatus()); + // 流程结束监听,处理结束后的业务逻辑 + processEvent.setStatus(status.getStatus()); + processEvent.setSubmit(false); + processEvent.setFlowCode(definition.getFlowCode()); + processEvent.setBusinessKey(instance.getBusinessId()); + SpringUtils.context().publishEvent(processEvent); + } + log.info("流程结束监听器结束;{}", "流程完成处理"); + } + +} From 3957753717dd65f09ffc143029506ecd9cf5f7ce Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 14 Nov 2024 16:02:54 +0800 Subject: [PATCH 067/227] =?UTF-8?q?update=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A2=9E=E5=8A=A0=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 9855c26f3..019e2c3e3 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -120,7 +120,6 @@ security: - /*/api-docs/** # warm-flow-ui - /warm-flow-ui/** - - /warm-flow/** # 多租户配置 tenant: @@ -274,3 +273,4 @@ websocket: warm-flow: # 是否开启工作流,默认true enabled: true + token-name: ${sa-token.token-name} From 37b1c4fc7980fa0b717ec2f18e21fed9950c7a81 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 14 Nov 2024 16:18:52 +0800 Subject: [PATCH 068/227] =?UTF-8?q?update=20=E8=A1=A5=E5=85=85=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=AF=B7=E6=B1=82=E5=A2=9E=E5=8A=A0=E9=89=B4?= =?UTF-8?q?=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 019e2c3e3..393658eff 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -118,8 +118,6 @@ security: - /error - /*/api-docs - /*/api-docs/** - # warm-flow-ui - - /warm-flow-ui/** # 多租户配置 tenant: @@ -273,4 +271,4 @@ websocket: warm-flow: # 是否开启工作流,默认true enabled: true - token-name: ${sa-token.token-name} + token-name: ${sa-token.token-name},clientid From 07b9f91e7edabc55e0a7623d446fd73e99588c53 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 16 Nov 2024 01:23:15 +0800 Subject: [PATCH 069/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=8A=B6=E6=80=81=EF=BC=8C=E7=A7=BB=E9=99=A4=E8=BF=87?= =?UTF-8?q?=E6=97=B6=E6=96=B9=E6=B3=95=EF=BC=8C=E8=B0=83=E6=95=B4=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8A=9E=E7=90=86=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/AssigneeService.java | 4 +- .../impl/TaskAssigneeTranslationImpl.java | 4 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../workflow/common/enums/WorkflowStatus.java | 131 ------------------ .../controller/FlwTaskController.java | 64 +++++---- .../listener/WorkflowFinishListener.java | 10 +- .../service/impl/FlwInstanceServiceImpl.java | 5 +- .../service/impl/FlwTaskServiceImpl.java | 23 +-- .../mapper/workflow/FlwTaskMapper.xml | 5 +- 9 files changed, 53 insertions(+), 194 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java index 73311cee5..62450d8c1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java @@ -22,9 +22,9 @@ public interface AssigneeService { /** * 通过taskId查询对应的任务办理人列表 * - * @param taskIds taskId串逗号分隔 + * @param taskIdList 任务id * @return 列表 */ - List selectByIds(String taskIds); + List selectByIds(List taskIdList); } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java index 7a2502b1c..bb55f2028 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java @@ -19,7 +19,9 @@ public class TaskAssigneeTranslationImpl implements TranslationInterface @Override public String translation(Object key, String other) { - if (key instanceof String id) { + if (key instanceof Long id) { + return assigneeService.selectAssigneeByIds(id.toString()); + } else if (key instanceof String id) { return assigneeService.selectAssigneeByIds(id); } return null; diff --git a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index ad40205ed..d578b7370 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl +org.dromara.common.translation.core.impl.TaskAssigneeTranslationImpl diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java deleted file mode 100644 index 9552e9ba8..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.dromara.workflow.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.warm.flow.core.utils.ObjectUtil; - -/** - * 工作流状态 - * - * @author AprilWind - */ -@Getter -@AllArgsConstructor -public enum WorkflowStatus { - - /** - * 待提交状态 - * 流程还未提交,处于待提交状态 - */ - TOBESUBMIT("0", "待提交", "submitted"), - - /** - * 审批中状态 - * 流程正在审批过程中,处于审批中状态 - */ - APPROVAL("1", "审批中", "approving"), - - /** - * 审批通过状态 - * 流程已通过审批,处于审批通过状态 - */ - PASS("2", "审批通过", "passed"), - - /** - * 自动完成状态 - * 流程已自动完成,通常不需要人工干预 - */ - AUTO_PASS("3", "自动完成", "auto"), - - /** - * 终止状态 - * 流程已终止,不能继续执行 - */ - TERMINATE("4", "终止", "terminated"), - - /** - * 作废状态 - * 流程被作废,已不再有效 - */ - NULLIFY("5", "作废", "nullified"), - - /** - * 撤销状态 - * 流程已被撤销,撤销后流程无法继续 - */ - CANCEL("6", "撤销", "cancelled"), - - /** - * 取回状态 - * 流程被取回,通常是审批被暂停,重新操作后可继续 - */ - RETRIEVE("7", "取回", "retrieved"), - - /** - * 已完成状态 - * 流程已全部完成,且所有操作已结束 - */ - FINISHED("8", "已完成", "done"), - - /** - * 已退回状态 - * 流程被退回,通常是审批不通过或者需要重新处理 - */ - REJECT("9", "已退回", "rejected"), - - /** - * 失效状态 - * 流程已失效,不再有效,不能继续执行 - */ - INVALID("10", "失效", "invalid"); - - /** - * 唯一标识符 - */ - private final String key; - - /** - * 中文描述 - */ - private final String value; - - /** - * 状态 - */ - private final String status; - - public static WorkflowStatus getByKey(String key) { - for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { - if (workflowStatus.getKey().equals(key)) { - return workflowStatus; - } - } - return null; - } - - public static WorkflowStatus getByValue(String value) { - for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { - if (workflowStatus.getValue().equals(value)) { - return workflowStatus; - } - } - return null; - } - - public static WorkflowStatus getByStatus(String status) { - for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { - if (workflowStatus.getStatus().equals(status)) { - return workflowStatus; - } - } - return null; - } - - public static Boolean isFinished(String key) { - return ObjectUtil.isNotNull(key) && (WorkflowStatus.FINISHED.getKey().equals(key)); - } - - public static Boolean isFinished(WorkflowStatus workflowStatus) { - return ObjectUtil.isNotNull(workflowStatus) && (WorkflowStatus.FINISHED == workflowStatus); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 9d54d5629..e4a06d0a7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -12,6 +12,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.dto.ModifyHandler; import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.core.entity.Instance; @@ -168,12 +169,12 @@ public class FlwTaskController extends BaseController { @RepeatSubmit() @PostMapping("/delegateTask") public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { - return toAjax(taskService.depute( - bo.getTaskId(), - LoginHelper.getUserIdStr(), - WorkflowUtils.permissionList(), - Collections.singletonList(bo.getUserId()), - bo.getMessage())); + FlowParams flowParams = new FlowParams(); + flowParams.addHandlers(Collections.singletonList(bo.getUserId())); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.message(bo.getMessage()); + return toAjax(taskService.depute(bo.getTaskId(), flowParams)); } /** @@ -185,12 +186,12 @@ public class FlwTaskController extends BaseController { @RepeatSubmit() @PostMapping("/transferTask") public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { - return toAjax(taskService.transfer( - bo.getTaskId(), - LoginHelper.getUserIdStr(), - WorkflowUtils.permissionList(), - Collections.singletonList(bo.getUserId()), - bo.getMessage())); + FlowParams flowParams = new FlowParams(); + flowParams.addHandlers(Collections.singletonList(bo.getUserId())); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.message(bo.getMessage()); + return toAjax(taskService.transfer(bo.getTaskId(), flowParams)); } /** @@ -202,12 +203,12 @@ public class FlwTaskController extends BaseController { @RepeatSubmit() @PostMapping("/addSignature") public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { - return toAjax(taskService.addSignature( - bo.getTaskId(), - LoginHelper.getUserIdStr(), - WorkflowUtils.permissionList(), - bo.getUserIds(), - bo.getMessage())); + FlowParams flowParams = new FlowParams(); + flowParams.addHandlers(bo.getUserIds()); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.message(bo.getMessage()); + return toAjax(taskService.addSignature(bo.getTaskId(), flowParams)); } /** @@ -219,12 +220,12 @@ public class FlwTaskController extends BaseController { @RepeatSubmit() @PostMapping("/reductionSignature") public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { - return toAjax(taskService.reductionSignature( - bo.getTaskId(), - LoginHelper.getUserIdStr(), - WorkflowUtils.permissionList(), - bo.getUserIds(), - bo.getMessage())); + FlowParams flowParams = new FlowParams(); + flowParams.reductionHandlers(bo.getUserIds()); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.message(bo.getMessage()); + return toAjax(taskService.reductionSignature(bo.getTaskId(), flowParams)); } /** @@ -237,15 +238,12 @@ public class FlwTaskController extends BaseController { @RepeatSubmit() @PutMapping("/updateAssignee/{taskId}/{userId}") public R updateAssignee(@PathVariable Long taskId, @PathVariable String userId) { - ModifyHandler modifyHandler = new ModifyHandler() - .setTaskId(taskId) - .setAddHandlers(Collections.singletonList(userId)) - .setPermissionFlag(WorkflowUtils.permissionList()) - .setCooperateType(CooperateType.APPROVAL.getKey()) - .setMessage("修改任务办理人") - .setCurUser(LoginHelper.getUserIdStr()) - .setIgnore(false); - return toAjax(taskService.updateHandler(modifyHandler)); + FlowParams flowParams = new FlowParams(); + flowParams.addHandlers(Collections.singletonList(userId)); + flowParams.cooperateType(CooperateType.APPROVAL.getKey()); + flowParams.ignore(false); + flowParams.message("修改任务办理人"); + return toAjax(taskService.updateHandler(taskId, flowParams)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java index 6a13c1cd3..1617713f6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java @@ -3,12 +3,13 @@ package org.dromara.workflow.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.SpringUtils; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.listener.Listener; import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.dromara.workflow.common.enums.WorkflowStatus; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Component; @@ -45,15 +46,14 @@ public class WorkflowFinishListener implements Listener { public void notify(ListenerVariable listenerVariable) { log.info("流程结束监听器"); Instance instance = listenerVariable.getInstance(); - WorkflowStatus status = WorkflowStatus.getByKey(instance.getFlowStatus()); Definition definition = listenerVariable.getDefinition(); ProcessEvent processEvent = new ProcessEvent(); //检查流程是否已结束 - if (WorkflowStatus.isFinished(status)) { + if (FlowStatus.isFinished(instance.getFlowStatus())) { // 若流程已结束,更新状态为已完成 - iFlwInstanceService.updateStatus(instance.getId(), status.getStatus()); + iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); // 流程结束监听,处理结束后的业务逻辑 - processEvent.setStatus(status.getStatus()); + processEvent.setStatus(BusinessStatusEnum.FINISH.getStatus()); processEvent.setSubmit(false); processEvent.setFlowCode(definition.getFlowCode()); processEvent.setBusinessKey(instance.getBusinessId()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 09fcdb731..91af9c18c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -68,7 +69,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("t.flow_status", FlowStatus.APPROVAL.getKey()); + queryWrapper.eq("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); queryWrapper.eq("t.del_flag", SystemConstants.NORMAL); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); @@ -86,7 +87,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("t.flow_status", Arrays.asList(FlowStatus.FINISHED.getKey(), FlowStatus.AUTO_PASS.getKey())); + queryWrapper.eq("t.flow_status", BusinessStatusEnum.FINISH.getStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 31849f131..12420f23f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -18,7 +18,6 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; -import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.DefService; @@ -167,16 +166,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 更新实例状态为待审核状态 iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); - //判断是否流程结束 - Instance instance = insService.getById(ins.getId()); - // 重新获取实例信息,检查流程是否已结束 - if (FlowStatus.isFinished(instance.getFlowStatus())) { - // 若流程已结束,更新状态为已完成 - iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - // 流程结束监听,处理结束后的业务逻辑 - flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), - BusinessStatusEnum.FINISH.getStatus(), false); - } return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -257,7 +246,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -321,11 +309,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowParams flowParams = new FlowParams(); flowParams.variable(bo.getVariables()); + flowParams.skipType(SkipType.PASS.getKey()); if (nextNodeCode.equals(bo.getNodeCode())) { - flowParams.skipType(SkipType.REJECT.getKey()); flowParams.flowStatus(BusinessStatusEnum.BACK.getStatus()); } else { - flowParams.skipType(SkipType.PASS.getKey()); flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()); } flowParams.hisStatus(TaskStatusEnum.BACK.getStatus()); @@ -413,15 +400,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { /** * 通过taskId查询对应的任务办理人列表 * - * @param taskIds taskId串逗号分隔 + * @param taskIdList 任务id * @return 列表 */ @Override - public List selectByIds(String taskIds) { - if (StringUtils.isBlank(taskIds)) { + public List selectByIds(List taskIdList) { + if (CollUtil.isEmpty(taskIdList)) { return Collections.emptyList(); } - List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + List userList = userService.getByAssociateds(taskIdList); return WorkflowUtils.getHandlerUser(userList); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 52061053f..18bf11ec6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -99,7 +99,8 @@ c.flow_code from flow_his_task a LEFT JOIN flow_instance b on a.instance_id = b.id - LEFT JOIN flow_definition c on a.definition_id = c.id + LEFT JOIN flow_definition c on a.definition_id = c.id where + a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' and a.node_type not in ('0') ) t ${ew.getCustomSqlSegment} @@ -119,7 +120,7 @@ LEFT JOIN flow_instance b ON a.associated = b.id LEFT JOIN flow_definition d on b.definition_id=d.id WHERE - a.type = 4 and a.del_flag = '0' + a.type = 4 and a.del_flag = '0' and b.del_flag = '0' ) t ${ew.getCustomSqlSegment}
From 2716768dd927c252f3389a496ff50b51ccdec58f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 16 Nov 2024 13:07:50 +0800 Subject: [PATCH 070/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=AE=BE=E8=AE=A1=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 393658eff..3cc22a097 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -118,6 +118,7 @@ security: - /error - /*/api-docs - /*/api-docs/** + - /warm-flow-ui/** # 多租户配置 tenant: @@ -222,7 +223,7 @@ xss: # 排除链接(多个用逗号分隔) excludeUrls: - /system/notice - - /warm-flow-ui/save-xml + - /warm-flow/save-xml # 全局线程池相关配置 # 如使用JDK21请直接使用虚拟线程 不要开启此配置 From 535be209c2ea2cd5aeb497de5fd96811bb95da25 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 16 Nov 2024 14:44:28 +0800 Subject: [PATCH 071/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=8A=9E=E7=90=86=E8=AE=BE=E7=BD=AE=E5=8A=9E=E7=90=86?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 107 ------------------ .../service/impl/FlwTaskServiceImpl.java | 8 +- .../dromara/workflow/utils/WorkflowUtils.java | 6 +- 3 files changed, 8 insertions(+), 113 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index c3fcafa87..63435ef66 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -8,83 +8,6 @@ package org.dromara.workflow.common.constant; */ public interface FlowConstant { - String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!"; - - String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!"; - - /** - * 连线 - */ - String SEQUENCE_FLOW = "sequenceFlow"; - - /** - * 并行网关 - */ - String PARALLEL_GATEWAY = "parallelGateway"; - - /** - * 排它网关 - */ - String EXCLUSIVE_GATEWAY = "exclusiveGateway"; - - /** - * 包含网关 - */ - String INCLUSIVE_GATEWAY = "inclusiveGateway"; - - /** - * 结束节点 - */ - String END_EVENT = "endEvent"; - - - /** - * 流程委派标识 - */ - String PENDING = "PENDING"; - - /** - * 候选人标识 - */ - String CANDIDATE = "candidate"; - - /** - * 会签任务总数 - */ - String NUMBER_OF_INSTANCES = "nrOfInstances"; - - /** - * 正在执行的会签总数 - */ - String NUMBER_OF_ACTIVE_INSTANCES = "nrOfActiveInstances"; - - /** - * 已完成的会签任务总数 - */ - String NUMBER_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances"; - - /** - * 循环的索引值,可以使用elementIndexVariable属性修改loopCounter的变量名 - */ - String LOOP_COUNTER = "loopCounter"; - - String ZIP = "ZIP"; - - /** - * 业务与流程实例关联对象 - */ - String BUSINESS_INSTANCE_DTO = "businessInstanceDTO"; - - /** - * 流程定义配置 - */ - String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo"; - - /** - * 节点配置 - */ - String WF_NODE_CONFIG_VO = "wfNodeConfigVo"; - /** * 流程发起人 */ @@ -100,38 +23,8 @@ public interface FlowConstant { */ String BUSINESS_KEY = "businessKey"; - /** - * 流程定义id - */ - String PROCESS_DEFINITION_ID = "processDefinitionId"; - - /** - * 开启跳过表达式变量 - */ - String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; - /** * 模型标识key命名规范正则表达式 */ String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; - - /** - * 用户任务 - */ - String USER_TASK = "userTask"; - - /** - * 会签 - */ - String MULTI_INSTANCE = "multiInstance"; - - /** - * 是 - */ - String TRUE = "0"; - - /** - * 否 - */ - String FALSE = "1"; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 12420f23f..0a41f3227 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -51,8 +51,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY; -import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; +import static org.dromara.workflow.common.constant.FlowConstant.*; +import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; /** * 任务 服务层实现 @@ -92,7 +92,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 流程发起人 - variables.put(INITIATOR, userId); + variables.put(INITIATOR, USER.getCode()+userId); // 业务id variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); @@ -103,7 +103,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - return Map.of("processInstanceId", taskList.get(0).getInstanceId(), "taskId", taskList.get(0).getId()); + return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), "taskId", taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index a451cb599..46d853216 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -16,6 +16,8 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; + /** * 工作流工具 * @@ -46,7 +48,7 @@ public class WorkflowUtils { // 用户和部门权限 Stream.of( - TaskAssigneeEnum.USER.getCode() + userId, + USER.getCode() + userId, TaskAssigneeEnum.DEPT.getCode() + deptId ) ) @@ -94,7 +96,7 @@ public class WorkflowUtils { users.forEach(dto -> { FlowUser flowUser = new FlowUser(); flowUser.setType(user.getType()); - flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + flowUser.setProcessedBy(USER.getCode()+dto.getUserId()); flowUser.setAssociated(taskId); list.add(flowUser); }); From 1b05bdf817bbcb06c8d43afed01a0ec979d49910 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 16 Nov 2024 19:26:12 +0800 Subject: [PATCH 072/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=BD=AC?= =?UTF-8?q?=E5=8A=9E=EF=BC=8C=E5=8A=A0=E7=AD=BE=E7=AD=89=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index e4a06d0a7..ba6652866 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -4,6 +4,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; @@ -13,14 +15,13 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.dto.ModifyHandler; import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.CooperateType; -import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -33,6 +34,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; + /** * 任务管理 控制层 * @@ -142,7 +145,7 @@ public class FlwTaskController extends BaseController { FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); Instance instance = insService.getById(task.getInstanceId()); flowTaskVo.setFlowStatus(instance.getFlowStatus()); - flowTaskVo.setFlowStatusName(FlowStatus.getValueByKey(instance.getFlowStatus())); + flowTaskVo.setFlowStatusName(BusinessStatusEnum.findByStatus(instance.getFlowStatus())); return R.ok(flowTaskVo); } return R.fail(); @@ -170,10 +173,11 @@ public class FlwTaskController extends BaseController { @PostMapping("/delegateTask") public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(bo.getUserId())); + flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); flowParams.handler(LoginHelper.getUserIdStr()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.message(bo.getMessage()); + flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); return toAjax(taskService.depute(bo.getTaskId(), flowParams)); } @@ -187,10 +191,11 @@ public class FlwTaskController extends BaseController { @PostMapping("/transferTask") public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(bo.getUserId())); + flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); flowParams.handler(LoginHelper.getUserIdStr()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.message(bo.getMessage()); + flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); return toAjax(taskService.transfer(bo.getTaskId(), flowParams)); } @@ -204,10 +209,11 @@ public class FlwTaskController extends BaseController { @PostMapping("/addSignature") public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(bo.getUserIds()); + flowParams.addHandlers(StreamUtils.toList(bo.getUserIds(),u->USER.getCode()+u)); flowParams.handler(LoginHelper.getUserIdStr()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.message(bo.getMessage()); + flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); return toAjax(taskService.addSignature(bo.getTaskId(), flowParams)); } @@ -221,10 +227,11 @@ public class FlwTaskController extends BaseController { @PostMapping("/reductionSignature") public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.reductionHandlers(bo.getUserIds()); + flowParams.reductionHandlers(StreamUtils.toList(bo.getUserIds(),u->USER.getCode()+u)); flowParams.handler(LoginHelper.getUserIdStr()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.message(bo.getMessage()); + flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); return toAjax(taskService.reductionSignature(bo.getTaskId(), flowParams)); } @@ -239,7 +246,7 @@ public class FlwTaskController extends BaseController { @PutMapping("/updateAssignee/{taskId}/{userId}") public R updateAssignee(@PathVariable Long taskId, @PathVariable String userId) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(userId)); + flowParams.addHandlers(Collections.singletonList(USER.getCode()+userId)); flowParams.cooperateType(CooperateType.APPROVAL.getKey()); flowParams.ignore(false); flowParams.message("修改任务办理人"); From 22db22db489bb27a390ae0514bfcb529be9462c3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 16 Nov 2024 20:02:57 +0800 Subject: [PATCH 073/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E4=BA=BA=E5=91=98=E7=BF=BB=E8=AF=91=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core}/enums/TaskAssigneeEnum.java | 2 +- .../org/dromara/common/satoken/utils/LoginHelper.java | 6 ++++-- .../core/impl/NicknameTranslationImpl.java | 11 +++++++++++ .../dromara/workflow/common/enums/TaskStatusEnum.java | 2 +- .../workflow/controller/FlwTaskController.java | 2 +- .../workflow/listener/WorkflowStartListener.java | 2 +- .../workflow/service/impl/FlwTaskServiceImpl.java | 2 +- .../service/impl/WfTaskAssigneeServiceImpl.java | 2 +- .../org/dromara/workflow/utils/WorkflowUtils.java | 4 ++-- 9 files changed, 23 insertions(+), 10 deletions(-) rename {ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common => ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core}/enums/TaskAssigneeEnum.java (98%) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java similarity index 98% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java index 42971c624..734e04914 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.workflow.common.enums; +package org.dromara.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 19557e131..01c68c676 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -15,6 +15,8 @@ import org.dromara.common.core.enums.UserType; import java.util.Set; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; + /** * 登录鉴权助手 *

@@ -89,10 +91,10 @@ public class LoginHelper { } /** - * 获取用户id + * 获取用户id(工作流使用) */ public static String getUserIdStr() { - return Convert.toStr(getExtra(USER_KEY)); + return USER.getCode()+Convert.toStr(getExtra(USER_KEY)); } /** diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java index b92c7f0f5..04a8d5196 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java @@ -2,10 +2,16 @@ package org.dromara.common.translation.core.impl; import lombok.AllArgsConstructor; import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.core.TranslationInterface; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; + /** * 用户名称翻译实现 * @@ -22,6 +28,11 @@ public class NicknameTranslationImpl implements TranslationInterface { if (key instanceof Long id) { return userService.selectNicknameByIds(id.toString()); } else if (key instanceof String ids) { + if (StringUtils.isNotBlank(ids)) { + ids = Stream.of(ids.split(StringUtils.SEPARATOR)) + .map(userId -> userId.contains(USER.getCode()) ? userId.replaceAll(USER.getCode(), StringUtils.EMPTY) : userId) + .collect(Collectors.joining(StringUtils.SEPARATOR)); + } return userService.selectNicknameByIds(ids); } return null; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java index f6eca80cd..d18ebb01d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -55,7 +55,7 @@ public enum TaskStatusEnum { /** * 委托 */ - PENDING("pending", "委托"), + DEPUTE("depute", "委托"), /** * 抄送 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index ba6652866..8855864c6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -34,7 +34,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 任务管理 控制层 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java index 456d81e88..7f09297cb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -7,7 +7,7 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.listener.Listener; import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.core.enums.TaskAssigneeEnum; import org.springframework.stereotype.Component; import java.util.Collection; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 0a41f3227..1048feffb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -52,7 +52,7 @@ import java.util.Map; import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; -import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 任务 服务层实现 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 52581c198..daae27dcc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -20,7 +20,7 @@ import org.dromara.warm.flow.ui.dto.HandlerQuery; import org.dromara.warm.flow.ui.dto.TreeFunDto; import org.dromara.warm.flow.ui.service.HandlerSelectService; import org.dromara.warm.flow.ui.vo.HandlerSelectVo; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 46d853216..97dc6f953 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -9,14 +9,14 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.orm.entity.FlowUser; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.dromara.workflow.common.enums.TaskAssigneeEnum.USER; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 工作流工具 From 8b0871f718c6dd0960b9fe500b389cf3b792980f Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 19 Nov 2024 13:42:02 +0800 Subject: [PATCH 074/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E4=BB=BB=E5=8A=A1=EF=BC=8C=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E7=AD=89=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 3 -- .../mapper/workflow/FlwDefMapper.xml | 11 +++++-- .../mapper/workflow/FlwInstanceMapper.xml | 7 ++--- .../mapper/workflow/FlwTaskMapper.xml | 31 ++++++++++--------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 91af9c18c..9405f793c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -38,7 +37,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -70,7 +68,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - queryWrapper.eq("t.del_flag", SystemConstants.NORMAL); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index 1b6dc1a09..565aee3d8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -6,8 +6,15 @@ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 0836f981e..1609fa826 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -23,8 +23,7 @@ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 18bf11ec6..791ea873c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -45,10 +45,11 @@ + @@ -94,19 +95,19 @@ a.update_time, a.tenant_id, b.business_id, - c.form_path fromPath, + c.form_path, c.flow_name, c.flow_code from flow_his_task a - LEFT JOIN flow_instance b on a.instance_id = b.id - LEFT JOIN flow_definition c on a.definition_id = c.id where - a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' and a.node_type not in ('0') + left join flow_instance b on a.instance_id = b.id + left join flow_definition c on a.definition_id = c.id where + a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' and a.node_type in ('1','3','4') ) t ${ew.getCustomSqlSegment} From 31de9009b010eecd43e272729f0209616d3aa3d5 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 19 Nov 2024 20:49:25 +0800 Subject: [PATCH 075/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwDefinitionServiceImpl.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index ce0b965d3..bee12da75 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -1,7 +1,6 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -11,10 +10,8 @@ import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; -import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; @@ -78,13 +75,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { @Override public boolean importXml(MultipartFile file) { try { - Definition definition = defService.importXml(file.getInputStream()); - List list = flowDefinitionMapper.selectList( - new LambdaQueryWrapper().eq(FlowDefinition::getFlowCode, definition.getFlowCode())); - List definitionList = StreamUtils.filter(list, item -> !item.getId().equals(definition.getId())); - if (CollUtil.isEmpty(definitionList)) { - defService.publish(definition.getId()); - } + defService.importXml(file.getInputStream()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); From cef3fe992984e8c5e33df69dc725f41744e081c0 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 22 Nov 2024 22:54:55 +0800 Subject: [PATCH 076/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=88=A0=E9=99=A4=20add=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=8E=B7=E5=8F=96=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 4 +-- .../controller/FlwInstanceController.java | 12 +++++++ .../service/IFlwDefinitionService.java | 8 +++++ .../workflow/service/IFlwInstanceService.java | 8 +++++ .../impl/FlwDefinitionServiceImpl.java | 34 +++++++++++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 26 ++++++++++++++ 6 files changed, 90 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 37f9badb2..74c4547d6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -119,8 +119,8 @@ public class FlwDefinitionController extends BaseController { @Log(title = "流程定义", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") @Transactional(rollbackFor = Exception.class) - public R remove(@PathVariable List ids) { - return R.ok(defService.removeDef(ids)); + public R remove(@PathVariable List ids) { + return toAjax(iFlwDefinitionService.removeDef(ids)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index c871ff691..c7d1b7ad0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -119,4 +119,16 @@ public class FlwInstanceController extends BaseController { public R> getFlowImage(@PathVariable String businessId) { return R.ok(flwInstanceService.getFlowImage(businessId)); } + + /** + * 获取流程变量 + * + * @param instanceId 流程实例id + */ + @GetMapping("/getInstanceVariable/{instanceId}") + public R> getInstanceVariable(@PathVariable String instanceId) { + return R.ok(flwInstanceService.getInstanceVariable(instanceId)); + } + + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index a9326ea29..fb4c1d27e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -49,4 +49,12 @@ public interface IFlwDefinitionService { * @return 结果 */ boolean importXml(MultipartFile file); + + /** + * 删除流程定义 + * + * @param ids 流程定义id + * @return 结果 + */ + boolean removeDef(List ids); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 4f2c744ee..3acc1e1e0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -91,4 +91,12 @@ public interface IFlwInstanceService { * @param status 状态 */ void updateStatus(Long instanceId, String status); + + /** + * 获取流程变量 + * + * @param instanceId 实例id + * @return 结果 + */ + Map getInstanceVariable(String instanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index bee12da75..bcf5f0e88 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -1,8 +1,10 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -10,11 +12,15 @@ import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; @@ -36,6 +42,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final DefService defService; private final FlowDefinitionMapper flowDefinitionMapper; private final FlwDefMapper flwDefMapper; + private final FlowHisTaskMapper flowHisTaskMapper; /** * 分页查询 @@ -111,4 +118,31 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { writer.write(document); writer.close(); } + + /** + * 删除流程定义 + * + * @param ids 流程定义id + */ + @Override + public boolean removeDef(List ids) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.in(FlowHisTask::getDefinitionId, ids); + List flowHisTasks = flowHisTaskMapper.selectList(wrapper); + if (CollUtil.isNotEmpty(flowHisTasks)) { + List flowDefinitions = flowDefinitionMapper.selectByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getDefinitionId)); + if (CollUtil.isNotEmpty(flowDefinitions)) { + String join = StreamUtils.join(flowDefinitions, FlowDefinition::getFlowCode); + log.error("流程定义【{}】已被使用不可被删除!", join); + throw new ServiceException("流程定义【" + join + "】已被使用不可被删除!"); + } + } + try { + defService.removeDef(ids); + } catch (Exception e) { + log.error("Error removing flow definitions: {}", e.getMessage(), e); + throw new RuntimeException("Failed to remove flow definitions", e); + } + return true; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 9405f793c..59ee1f654 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -31,12 +31,14 @@ import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; +import org.dromara.workflow.domain.vo.VariableVo; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -250,4 +252,28 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { wrapper.eq(FlowInstance::getId, instanceId); flowInstanceMapper.update(wrapper); } + + /** + * 获取流程变量 + * + * @param instanceId 实例id + */ + @Override + public Map getInstanceVariable(String instanceId) { + Map map = new HashMap<>(); + FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); + Map variableMap = flowInstance.getVariableMap(); + List list = new ArrayList<>(); + if (CollUtil.isNotEmpty(variableMap)) { + for (Map.Entry entry : variableMap.entrySet()) { + VariableVo variableVo = new VariableVo(); + variableVo.setKey(entry.getKey()); + variableVo.setValue(entry.getValue().toString()); + list.add(variableVo); + } + } + map.put("variableList", list); + map.put("variable", flowInstance.getVariable()); + return map; + } } From ee3db1c806a64d7472fe8eb9a10226e01ca3c27f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 22 Nov 2024 22:56:16 +0800 Subject: [PATCH 077/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=E8=AE=BE=E7=BD=AE=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E4=BA=BA=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 1048feffb..c6123c998 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -52,7 +52,6 @@ import java.util.Map; import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 任务 服务层实现 @@ -92,7 +91,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 流程发起人 - variables.put(INITIATOR, USER.getCode()+userId); + variables.put(INITIATOR, userId); // 业务id variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); From 1f9fc547070e7ccb1bf82e9a8ce12e6f74435f59 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 24 Nov 2024 12:54:53 +0800 Subject: [PATCH 078/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/controller/FlwDefinitionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 74c4547d6..0d802d3c5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -129,7 +129,7 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id */ @Log(title = "流程定义", businessType = BusinessType.INSERT) - @GetMapping("/copyDef/{id}") + @PostMapping("/copyDef/{id}") @Transactional(rollbackFor = Exception.class) public R copyDef(@PathVariable Long id) { return R.ok(defService.copyDef(id)); From 8986f9a9b386fb16956da85f3655c0eef695f90b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 29 Nov 2024 13:42:31 +0800 Subject: [PATCH 079/227] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow1.3?= =?UTF-8?q?.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++++--------- ruoyi-modules/ruoyi-workflow/pom.xml | 11 +++-------- .../service/impl/FlwDefinitionServiceImpl.java | 2 +- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 2634050e8..5ddeef77e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20241022 - 1.3.3 + 1.3.4 3.2.2 @@ -120,17 +120,12 @@ - org.dromara - warm-flow-mybatis-plus-sb-starter + org.dromara.warm + warm-flow-mybatis-plus-sb3-starter ${warm-flow.version} - org.dromara - warm-flow-plugin-spel - ${warm-flow.version} - - - org.dromara + org.dromara.warm warm-flow-plugin-ui-sb-web ${warm-flow.version} diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 980a2bfad..c64ee5a80 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -65,17 +65,12 @@ org.dromara ruoyi-common-security - - org.dromara - warm-flow-mybatis-plus-sb-starter + org.dromara.warm + warm-flow-mybatis-plus-sb3-starter - org.dromara - warm-flow-plugin-spel - - - org.dromara + org.dromara.warm warm-flow-plugin-ui-sb-web diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index bcf5f0e88..64bbf6df2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -84,7 +84,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { try { defService.importXml(file.getInputStream()); } catch (Exception e) { - e.printStackTrace(); + log.error("导入流程定义错误: {}", e.getMessage(), e); throw new RuntimeException(e); } return true; From a454ab452d4c2b38f29dfb3d12e7db1345b96f03 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 29 Nov 2024 17:45:15 +0800 Subject: [PATCH 080/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E5=8A=9E?= =?UTF-8?q?=E7=90=86=E4=BA=BA=E6=9D=83=E9=99=90=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/WorkflowPermissionHandler.java | 67 +++++++++++++++++++ .../listener/WorkflowStartListener.java | 43 ------------ 2 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java new file mode 100644 index 000000000..3ce655a4b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -0,0 +1,67 @@ +package org.dromara.workflow.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.TaskAssigneeEnum; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.handler.PermissionHandler; +import org.dromara.warm.flow.core.service.impl.TaskServiceImpl; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 办理人权限处理器 + * + * @author AprilWind + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowPermissionHandler implements PermissionHandler { + + /** + * 审批前获取当前办理人,办理时会校验的该权限集合 + * 后续在{@link TaskServiceImpl#checkAuth(Task, FlowParams)} 中调用 + * 返回当前用户权限集合 + */ + @Override + public List permissions() { + LoginUser loginUser = LoginHelper.getLoginUser(); + // 使用一个流来构建权限列表 + return Stream.of( + // 角色权限前缀 + loginUser.getRoles().stream() + .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + + // 岗位权限前缀 + Stream.ofNullable(loginUser.getPosts()) + .flatMap(Collection::stream) + .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), + + // 用户和部门权限 + Stream.of( + TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), + TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() + ) + ) + .flatMap(stream -> stream) + .collect(Collectors.toList()); + } + + /** + * 获取当前办理人 + * + * @return 当前办理人 + */ + @Override + public String getHandler() { + return LoginHelper.getUserIdStr(); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java index 7f09297cb..77506b7d5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -2,19 +2,11 @@ package org.dromara.workflow.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.listener.Listener; import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.dromara.common.core.enums.TaskAssigneeEnum; import org.springframework.stereotype.Component; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * 流程启动监听器,用于处理流程开始时的用户信息和权限设置 *

@@ -43,43 +35,8 @@ public class WorkflowStartListener implements Listener { public void notify(ListenerVariable listenerVariable) { log.info("流程启动监听器"); FlowParams flowParams = listenerVariable.getFlowParams(); - LoginUser loginUser = LoginHelper.getLoginUser(); - // 设置当前办理人id - flowParams.handler(loginUser.getUserId().toString()); // 设置办理人所拥有的权限,比如角色、部门、用户等 - flowParams.permissionFlag(buildUserPermissions(loginUser)); log.info("流程启动监听器结束;{}", "开启流程完成"); } - /** - * 构建当前用户的所有权限列表,包括角色、岗位、用户和部门权限 - *

- * 通过合并用户的角色、岗位、用户ID和部门ID来构建用户的权限列表,格式化为字符串列表 - *

- * - * @param loginUser 当前登录的用户对象,包含用户的角色、岗位、ID等信息 - * @return 权限列表,包含角色、岗位、用户和部门的权限,格式化为字符串列表 - */ - private List buildUserPermissions(LoginUser loginUser) { - // 使用一个流来构建权限列表 - return Stream.of( - // 角色权限前缀 - loginUser.getRoles().stream() - .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), - - // 岗位权限前缀 - Stream.ofNullable(loginUser.getPosts()) - .flatMap(Collection::stream) - .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), - - // 用户和部门权限 - Stream.of( - TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), - TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() - ) - ) - .flatMap(stream -> stream) - .collect(Collectors.toList()); - } - } From 75b17b5a58eaf44968ce703ed6ddef2e7b09628f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 30 Nov 2024 19:17:00 +0800 Subject: [PATCH 081/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8A=84=E9=80=81=20update=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/WfDefinitionConfig.java | 2 +- .../domain/bo/WfDefinitionConfigBo.java | 4 +- .../workflow/domain/vo/FlowHisTaskVo.java | 12 +-- .../workflow/domain/vo/FlowTaskVo.java | 5 + .../domain/vo/WfDefinitionConfigVo.java | 2 +- .../service/IWfDefinitionConfigService.java | 2 +- .../impl/FlwDefinitionServiceImpl.java | 5 + .../service/impl/FlwInstanceServiceImpl.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 96 ++++++++++++++----- .../impl/WfDefinitionConfigServiceImpl.java | 2 +- .../mapper/workflow/FlwTaskMapper.xml | 25 +++-- 11 files changed, 110 insertions(+), 47 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java index 817a7a307..a18d8cf9c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java @@ -35,7 +35,7 @@ public class WfDefinitionConfig extends BaseEntity { /** * 流程定义ID */ - private String definitionId; + private Long definitionId; /** * 流程KEY diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java index 543638239..4b1fc7cba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java @@ -35,8 +35,8 @@ public class WfDefinitionConfigBo extends BaseEntity { /** * 流程定义ID */ - @NotBlank(message = "流程定义ID不能为空", groups = {AddGroup.class}) - private String definitionId; + @NotNull(message = "流程定义ID不能为空", groups = {AddGroup.class}) + private Long definitionId; /** * 流程KEY diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1d7b51d8f..9b9d09a76 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -3,7 +3,6 @@ package org.dromara.workflow.domain.vo; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; -import org.dromara.warm.flow.core.enums.FlowStatus; import java.io.Serial; import java.io.Serializable; @@ -170,14 +169,13 @@ public class FlowHisTaskVo implements Serializable { */ private String flowCode; + /** + * 流程版本号 + */ + private String version; + /** * 运行时长 */ private String runDuration; - - public void setFlowStatus(String flowStatus) { - this.flowStatus = flowStatus; - // TODO 建议前端使用字典 - this.flowStatusName = FlowStatus.getValueByKey(flowStatus); - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 4b56e90db..806d8c271 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -124,6 +124,11 @@ public class FlowTaskVo implements Serializable { @Translation(type = TransConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") private String transactorNames; + /** + * 抄送人id + */ + private String processedBy; + /** * 办理人类型 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java index d3cee928a..89ed36df9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java @@ -40,7 +40,7 @@ public class WfDefinitionConfigVo implements Serializable { * 流程定义ID */ @ExcelProperty(value = "流程定义ID") - private String definitionId; + private Long definitionId; /** * 流程KEY diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java index fe5cf7ad3..0ca50355c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java @@ -79,5 +79,5 @@ public interface IWfDefinitionConfigService { * @param ids 流程定义id * @return 结果 */ - Boolean deleteByDefIds(Collection ids); + Boolean deleteByDefIds(Collection ids); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 64bbf6df2..d40059aae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -24,7 +24,9 @@ import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; +import org.dromara.workflow.service.IWfDefinitionConfigService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -43,6 +45,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowDefinitionMapper flowDefinitionMapper; private final FlwDefMapper flwDefMapper; private final FlowHisTaskMapper flowHisTaskMapper; + private final IWfDefinitionConfigService wfDefinitionConfigService; /** * 分页查询 @@ -125,6 +128,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { * @param ids 流程定义id */ @Override + @Transactional(rollbackFor = Exception.class) public boolean removeDef(List ids) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.in(FlowHisTask::getDefinitionId, ids); @@ -139,6 +143,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { } try { defService.removeDef(ids); + wfDefinitionConfigService.deleteByDefIds(ids); } catch (Exception e) { log.error("Error removing flow definitions: {}", e.getMessage(), e); throw new RuntimeException("Failed to remove flow definitions", e); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 59ee1f654..84c820155 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -158,7 +158,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { wrapper.in(FlowInstance::getDefinitionId, defIdList); } } - wrapper.eq(FlowInstance::getCreateBy, LoginHelper.getUserId()); + wrapper.eq(FlowInstance::getCreateBy, LoginHelper.getUserIdStr()); Page page = flowInstanceMapper.selectPage(pageQuery.build(), wrapper); TableDataInfo build = TableDataInfo.build(); List flowInstanceVos = BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c6123c998..c102a7dc6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -20,14 +21,9 @@ import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; -import org.dromara.warm.flow.core.service.DefService; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.core.service.UserService; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.entity.FlowSkip; -import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.core.enums.UserType; +import org.dromara.warm.flow.core.service.*; +import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; @@ -35,6 +31,7 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.domain.vo.WfCopy; import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwTaskMapper; @@ -45,12 +42,10 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; import static org.dromara.workflow.common.constant.FlowConstant.*; /** @@ -74,6 +69,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final FlowSkipMapper flowSkipMapper; private final FlowProcessEventHandler flowProcessEventHandler; private final DefService defService; + private final HisTaskService hisTaskService; + private final IdentifierGenerator identifierGenerator; /** * 启动任务 @@ -95,10 +92,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 业务id variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); - if (wfDefinitionConfigVo == null) { + if (wfDefinitionConfigVo == null || wfDefinitionConfigVo.getDefinitionId() == null) { throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); } - + Long definitionId = wfDefinitionConfigVo.getDefinitionId(); + Definition definition = defService.getById(definitionId); + if (definition == null) { + log.error("流程定义ID【{}】不存在!", definitionId); + throw new ServiceException("请到流程定义ID【" + definitionId + "】不存在!"); + } FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); @@ -137,6 +139,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); + // 获取抄送人 + List wfCopyList = completeTaskBo.getWfCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); @@ -159,9 +163,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); - // 执行任务跳转,并根据返回的处理人设置下一步处理人 - setHandler(taskService.skip(taskId, flowParams)); + setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); // 更新实例状态为待审核状态 iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); @@ -175,17 +178,20 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { /** * 设置办理人 * - * @param instance 实例 + * @param instance 实例 + * @param task (当前任务)未办理的任务 + * @param wfCopyList 抄送人 */ - private void setHandler(Instance instance) { + private void setHandler(Instance instance, FlowTask task, List wfCopyList) { if (instance == null) { return; } + //添加抄送人 + setCopy(task, wfCopyList); // 根据流程实例ID查询所有关联的任务 List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) .eq(FlowTask::getInstanceId, instance.getId())); List userList = new ArrayList<>(); - // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { // 获取与当前任务关联的用户列表 @@ -194,16 +200,53 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { userList.addAll(WorkflowUtils.getUser(associatedUsers, flowTask.getId())); } } - // 批量删除现有任务的办理人记录 userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); - // 确保要保存的 userList 不为空 if (CollUtil.isNotEmpty(userList)) { userService.saveBatch(userList); } } + /** + * 添加抄送人 + * + * @param task 任务信息 + * @param wfCopyList 抄送人 + */ + private void setCopy(FlowTask task, List wfCopyList) { + // 添加抄送人记录 + if (CollUtil.isNotEmpty(wfCopyList)) { + FlowHisTask flowHisTask = flowHisTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowHisTask.class).eq(FlowHisTask::getTaskId, task.getId())); + FlowNode flowNode = new FlowNode(); + flowNode.setNodeCode(flowHisTask.getTargetNodeCode()); + flowNode.setNodeName(flowHisTask.getTargetNodeName()); + //生成新的任务id + long taskId = identifierGenerator.nextId(null).longValue(); + task.setId(taskId); + task.setNodeName("【抄送】" + task.getNodeName()); + FlowParams flowParams = FlowParams.build(); + flowParams.skipType(SkipType.NONE.getKey()); + flowParams.hisStatus(TaskStatusEnum.PASS.getStatus()); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); + HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); + hisTaskService.save(hisTask); + //保存抄送人员 + List userList = new ArrayList<>(); + for (WfCopy wfCopy : wfCopyList) { + FlowUser flowUser = new FlowUser(); + flowUser.setType(String.valueOf(4)); + flowUser.setProcessedBy(USER.getCode() + wfCopy.getUserId()); + flowUser.setAssociated(taskId); + userList.add(flowUser); + } + if (CollUtil.isNotEmpty(userList)) { + userService.saveBatch(userList); + } + } + } + /** * 查询当前用户的待办任务 * @@ -230,7 +273,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.approver", LoginHelper.getUserId()); + queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -271,6 +314,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Override public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -320,7 +364,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.nodeCode(bo.getNodeCode()); flowParams.permissionFlag(WorkflowUtils.permissionList()); Instance instance = taskService.skip(taskId, flowParams); - setHandler(instance); + setHandler(instance, flowTasks.get(0), null); flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), BusinessStatusEnum.BACK.getStatus(), false); return true; @@ -389,7 +433,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { if (StringUtils.isBlank(taskIds)) { return null; } - List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds)) + , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); // 获取处理用户的昵称并将其合并为一个字符串 return WorkflowUtils.getHandlerUser(userList).stream() .map(UserDTO::getNickName) @@ -407,7 +452,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { if (CollUtil.isEmpty(taskIdList)) { return Collections.emptyList(); } - List userList = userService.getByAssociateds(taskIdList); + List userList = userService.getByAssociateds(taskIdList + , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); return WorkflowUtils.getHandlerUser(userList); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java index b2ffb9ef9..ccf7127d7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java @@ -111,7 +111,7 @@ public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService } @Override - public Boolean deleteByDefIds(Collection ids) { + public Boolean deleteByDefIds(Collection ids) { return baseMapper.delete(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, ids)) > 0; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 791ea873c..b280fb89e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -65,12 +65,17 @@ d.flow_code, d.form_custom, d.form_path, + d.version, uu.processed_by, uu.type from flow_task as t left join flow_user uu on uu.associated = t.id left join flow_definition d on t.definition_id = d.id - left join flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0' and uu.del_flag = '0') t + left join flow_instance i on t.instance_id = i.id where + t.node_type = 1 and + t.del_flag = '0' and + uu.del_flag = '0' and + uu.type in ('1','2','3')) t ${ew.getCustomSqlSegment} @@ -97,7 +102,8 @@ b.business_id, c.form_path, c.flow_name, - c.flow_code + c.flow_code, + c.version from flow_his_task a left join flow_instance b on a.instance_id = b.id left join flow_definition c on a.definition_id = c.id where @@ -109,19 +115,22 @@ select * from ( select b.id , - b.flow_status, - b.business_id, + a.processed_by, + c.flow_status, + c.business_id, a.create_time, b.node_name, b.node_code, d.flow_name, - d.flow_code + d.flow_code, + d.version from flow_user a - left join flow_instance b on a.associated = b.id - left join flow_definition d on b.definition_id=d.id + left join flow_his_task b on a.associated = b.task_id + left join flow_instance c on b.instance_id = c.id + left join flow_definition d on c.definition_id=d.id where - a.type = 4 and a.del_flag = '0' and b.del_flag = '0' + a.type = '4' and a.del_flag = '0' and b.del_flag = '0' and d.del_flag = '0' ) t ${ew.getCustomSqlSegment} From 4a43f481209d99bdf42f96496e78be5e9b5988ae Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 1 Dec 2024 15:54:35 +0800 Subject: [PATCH 082/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=92=A4=E9=94=80=20remove=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwInstanceController.java | 19 +++--- .../controller/FlwTaskController.java | 6 +- .../workflow/domain/bo/AddMultiBo.java | 40 ----------- .../workflow/domain/bo/DeleteMultiBo.java | 52 --------------- ...rocessInvalidBo.java => FlowCancelBo.java} | 14 ++-- .../{DelegateBo.java => FlowDelegateBo.java} | 2 +- .../workflow/domain/bo/FlowInstanceBo.java | 25 ++++--- ...minationBo.java => FlowTerminationBo.java} | 2 +- .../{TransferBo.java => FlowTransferBo.java} | 3 +- .../workflow/domain/bo/InstanceBo.java | 43 ------------ .../dromara/workflow/domain/bo/ModelBo.java | 66 ------------------- .../domain/bo/ProcessDefinitionBo.java | 34 ---------- .../workflow/domain/bo/SysUserMultiBo.java | 39 ----------- .../dromara/workflow/domain/bo/TaskBo.java | 33 ---------- .../workflow/domain/bo/TaskUrgingBo.java | 34 ---------- .../workflow/domain/vo/FlowHisTaskVo.java | 7 +- .../workflow/service/IFlwInstanceService.java | 9 +-- .../workflow/service/IFlwTaskService.java | 2 +- .../service/impl/FlwInstanceServiceImpl.java | 60 +++++++++++++++-- .../service/impl/FlwTaskServiceImpl.java | 7 +- .../mapper/workflow/FlwTaskMapper.xml | 3 +- 21 files changed, 107 insertions(+), 393 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{ProcessInvalidBo.java => FlowCancelBo.java} (56%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{DelegateBo.java => FlowDelegateBo.java} (92%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{TerminationBo.java => FlowTerminationBo.java} (90%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{TransferBo.java => FlowTransferBo.java} (90%) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index c7d1b7ad0..06cfab3d0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -7,7 +7,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.service.InsService; -import org.dromara.workflow.domain.bo.InstanceBo; +import org.dromara.workflow.domain.bo.FlowCancelBo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.validation.annotation.Validated; @@ -75,11 +76,11 @@ public class FlwInstanceController extends BaseController { /** * 撤销流程 * - * @param businessId 业务id + * @param bo 参数 */ - @PutMapping("/cancelProcessApply/{businessId}") - public R cancelProcessApply(@PathVariable String businessId) { - return toAjax(flwInstanceService.cancelProcessApply(businessId)); + @PutMapping("/cancelProcessApply") + public R cancelProcessApply(@RequestBody FlowCancelBo bo) { + return toAjax(flwInstanceService.cancelProcessApply(bo)); } /** @@ -101,12 +102,12 @@ public class FlwInstanceController extends BaseController { /** * 获取当前登陆人发起的流程实例 * - * @param instanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 参数 + * @param pageQuery 分页 */ @GetMapping("/getPageByCurrent") - public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { - return flwInstanceService.getPageByCurrent(instanceBo, pageQuery); + public TableDataInfo getPageByCurrent(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.getPageByCurrent(flowInstanceBo, pageQuery); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 8855864c6..75fef0e28 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -159,7 +159,7 @@ public class FlwTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/terminationTask") - public R terminationTask(@RequestBody TerminationBo bo) { + public R terminationTask(@RequestBody FlowTerminationBo bo) { return R.ok(flwTaskService.terminationTask(bo)); } @@ -171,7 +171,7 @@ public class FlwTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/delegateTask") - public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { + public R delegateTask(@Validated({AddGroup.class}) @RequestBody FlowDelegateBo bo) { FlowParams flowParams = new FlowParams(); flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); flowParams.handler(LoginHelper.getUserIdStr()); @@ -189,7 +189,7 @@ public class FlwTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.UPDATE) @RepeatSubmit() @PostMapping("/transferTask") - public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { + public R transferTask(@Validated({AddGroup.class}) @RequestBody FlowTransferBo bo) { FlowParams flowParams = new FlowParams(); flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); flowParams.handler(LoginHelper.getUserIdStr()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java deleted file mode 100644 index 320ec64ca..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 加签参数请求 - * - * @author may - */ -@Data -public class AddMultiBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务ID - */ - @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) - private String taskId; - - /** - * 加签人员id - */ - @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class) - private List assignees; - - /** - * 加签人员名称 - */ - @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class) - private List assigneeNames; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java deleted file mode 100644 index e533167d9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 减签参数请求 - * - * @author may - */ -@Data -public class DeleteMultiBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务ID - */ - @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) - private String taskId; - - /** - * 减签人员 - */ - @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class) - private List taskIds; - - /** - * 执行id - */ - @NotEmpty(message = "执行id不能为空", groups = AddGroup.class) - private List executionIds; - - /** - * 人员id - */ - @NotEmpty(message = "减签人员id不能为空", groups = AddGroup.class) - private List assigneeIds; - - /** - * 人员名称 - */ - @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class) - private List assigneeNames; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java similarity index 56% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java index 41e51c2a6..31742ea79 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java @@ -8,24 +8,24 @@ import java.io.Serial; import java.io.Serializable; /** - * 流程实例作废请求对象 + * 撤销任务请求对象 * * @author may */ @Data -public class ProcessInvalidBo implements Serializable { +public class FlowCancelBo implements Serializable { @Serial private static final long serialVersionUID = 1L; /** - * 业务id + * 任务ID */ - @NotBlank(message = "业务id不能为空", groups = {AddGroup.class}) - private String businessKey; + @NotBlank(message = "业务ID不能为空", groups = AddGroup.class) + private String businessId; /** - * 作废原因 + * 办理意见 */ - private String deleteReason; + private String message; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java similarity index 92% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java index 5738cd367..20dad1253 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java @@ -13,7 +13,7 @@ import java.io.Serializable; * @author may */ @Data -public class DelegateBo implements Serializable { +public class FlowDelegateBo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index 18305ebbe..6d59292f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -4,10 +4,9 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.util.List; /** - * 任务请求对象 + * 流程实例请求对象 * * @author may */ @@ -18,27 +17,27 @@ public class FlowInstanceBo implements Serializable { private static final long serialVersionUID = 1L; /** - * 任务名称 - */ - private String nodeName; - - /** - * 流程定义名称 + * 流程名称 */ private String flowName; /** - * 流程定义编码 + * 流程编码 */ private String flowCode; /** - * 流程实例id + * 任务发起人 */ - private Long instanceId; + private String startUserId; /** - * 权限列表 + * 业务id */ - private List permissionList; + private String businessKey; + + /** + * 模型分类 + */ + private String categoryCode; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java similarity index 90% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java index 429c86e59..897fc21ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java @@ -13,7 +13,7 @@ import java.io.Serializable; * @author may */ @Data -public class TerminationBo implements Serializable { +public class FlowTerminationBo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java similarity index 90% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java index 8d0d5d235..65792da19 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransferBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java @@ -6,7 +6,6 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; -import java.util.List; /** * 终转办务请求对象 @@ -14,7 +13,7 @@ import java.util.List; * @author may */ @Data -public class TransferBo implements Serializable { +public class FlowTransferBo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java deleted file mode 100644 index 750e2304b..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/InstanceBo.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程实例请求对象 - * - * @author may - */ -@Data -public class InstanceBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程名称 - */ - private String flowName; - - /** - * 流程编码 - */ - private String flowCode; - - /** - * 任务发起人 - */ - private String startUserId; - - /** - * 业务id - */ - private String businessKey; - - /** - * 模型分类 - */ - private String categoryCode; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java deleted file mode 100644 index efe9acddb..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.workflow.common.constant.FlowConstant; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 模型请求对象 - * - * @author may - */ -@Data -public class ModelBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 模型id - */ - @NotBlank(message = "模型ID不能为空", groups = {EditGroup.class}) - private String id; - - /** - * 模型名称 - */ - @NotBlank(message = "模型名称不能为空", groups = {AddGroup.class}) - private String name; - - /** - * 模型标识key - */ - @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) - @Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) - private String key; - - /** - * 模型分类 - */ - @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class}) - private String categoryCode; - - /** - * 模型XML - */ - @NotBlank(message = "模型XML不能为空", groups = {AddGroup.class}) - private String xml; - - /** - * 模型SVG图片 - */ - @NotBlank(message = "模型SVG不能为空", groups = {EditGroup.class}) - private String svg; - - /** - * 备注 - */ - private String description; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java deleted file mode 100644 index 2025932ba..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程定义请求对象 - * - * @author may - */ -@Data -public class ProcessDefinitionBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程定义名称key - */ - private String key; - - /** - * 流程定义名称 - */ - private String name; - - /** - * 模型分类 - */ - private String categoryCode; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java deleted file mode 100644 index e4d99e47a..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 用户加签查询 - * - * @author may - */ -@Data -public class SysUserMultiBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 人员名称 - */ - private String userName; - - /** - * 人员名称 - */ - private String nickName; - - /** - * 部门id - */ - private String deptId; - - /** - * 任务id - */ - private String taskId; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java deleted file mode 100644 index 303747939..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 任务请求对象 - * - * @author may - */ -@Data -public class TaskBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务名称 - */ - private String name; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义key - */ - private String processDefinitionKey; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java deleted file mode 100644 index 20856efa9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 任务催办 - * - * @author may - */ -@Data -public class TaskUrgingBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程实例id - */ - private String processInstanceId; - - /** - * 消息类型 - */ - private List messageType; - - /** - * 催办内容(为空默认系统内置信息) - */ - private String message; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 9b9d09a76..4b3351daf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -129,10 +129,15 @@ public class FlowHisTaskVo implements Serializable { private String skipType; /** - * 流程状态(1审批中 2 审批通过 9已退回 10失效) + * 流程状态 */ private String flowStatus; + /** + * 任务状态 + */ + private String flowTaskStatus; + /** * 流程状态 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 3acc1e1e0..7c6b3098d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -4,7 +4,8 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.workflow.domain.bo.InstanceBo; +import org.dromara.workflow.domain.bo.FlowCancelBo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; @@ -62,10 +63,10 @@ public interface IFlwInstanceService { /** * 撤销流程 * - * @param businessId 业务id + * @param bo 参数 * @return 结果 */ - boolean cancelProcessApply(String businessId); + boolean cancelProcessApply(FlowCancelBo bo); /** * 获取当前登陆人发起的流程实例 @@ -74,7 +75,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery); + TableDataInfo getPageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery); /** * 获取流程图,流程记录 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index cb3ee5170..758fd469e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -101,5 +101,5 @@ public interface IFlwTaskService { * @param bo 参数 * @return 结果 */ - boolean terminationTask(TerminationBo bo); + boolean terminationTask(FlowTerminationBo bo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 84c820155..7c26fc727 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -10,28 +10,41 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.constant.ExceptionCons; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.core.service.NodeService; +import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.core.utils.AssertUtil; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; -import org.dromara.workflow.domain.bo.InstanceBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.domain.vo.VariableVo; +import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; @@ -59,6 +72,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final FlowInstanceMapper flowInstanceMapper; private final FlwInstanceMapper flwInstanceMapper; private final FlowDefinitionMapper flowDefinitionMapper; + private final TaskService taskService; + private final FlowNodeMapper flowNodeMapper; + private final NodeService nodeService; + private final FlowProcessEventHandler flowProcessEventHandler; /** * 分页查询正在运行的流程实例 @@ -69,7 +86,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -133,12 +149,42 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 撤销流程 * - * @param businessId 业务id + * @param bo 参数 */ @Override @Transactional(rollbackFor = Exception.class) - public boolean cancelProcessApply(String businessId) { - throw new RuntimeException("暂未开发"); + public boolean cancelProcessApply(FlowCancelBo bo) { + try { + Instance instance = instanceByBusinessId(bo.getBusinessId()); + if (instance == null) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } + Definition definition = defService.getById(instance.getDefinitionId()); + if (definition == null) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); + } + //获取已发布的流程节点 + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definition.getId())); + AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); + Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); + AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); + Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); + FlowParams flowParams = FlowParams.build(); + flowParams.handler(LoginHelper.getUserIdStr()); + flowParams.nodeCode(nextNode.getNodeCode()); + flowParams.message(bo.getMessage()); + flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); + taskService.retrieve(instance.getId(), flowParams); + // 更新状态 + updateStatus(instance.getId(), BusinessStatusEnum.CANCEL.getStatus()); + //流程撤销监听 + flowProcessEventHandler.processHandler(definition.getFlowCode(), + bo.getBusinessId(), BusinessStatusEnum.CANCEL.getStatus(), false); + } catch (Exception e) { + log.error("撤销失败: {}", e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; } /** @@ -148,7 +194,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByCurrent(InstanceBo instanceBo, PageQuery pageQuery) { + public TableDataInfo getPageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); if (StringUtils.isNotBlank(instanceBo.getFlowCode())) { List flowDefinitions = flowDefinitionMapper.selectList( @@ -192,7 +238,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); - wrapper.orderByDesc(FlowHisTask::getCreateTime); + wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); List list = BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class); for (FlowHisTaskVo vo : list) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c102a7dc6..a85de469b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -225,12 +225,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { long taskId = identifierGenerator.nextId(null).longValue(); task.setId(taskId); task.setNodeName("【抄送】" + task.getNodeName()); + Date updateTime = new Date(flowHisTask.getUpdateTime().getTime()-1000); FlowParams flowParams = FlowParams.build(); flowParams.skipType(SkipType.NONE.getKey()); - flowParams.hisStatus(TaskStatusEnum.PASS.getStatus()); + flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); flowParams.handler(LoginHelper.getUserIdStr()); flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); + hisTask.setCreateTime(updateTime); + hisTask.setUpdateTime(updateTime); hisTaskService.save(hisTask); //保存抄送人员 List userList = new ArrayList<>(); @@ -399,7 +402,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { */ @Override @Transactional(rollbackFor = Exception.class) - public boolean terminationTask(TerminationBo bo) { + public boolean terminationTask(FlowTerminationBo bo) { try { FlowTask flowTask = flowTaskMapper.selectById(bo.getTaskId()); Instance ins = insService.getById(flowTask.getInstanceId()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index b280fb89e..b91a1e7e2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -93,7 +93,8 @@ a.target_node_name, a.definition_id, a.instance_id, - a.flow_status, + a.flow_status flow_task_status, + b.flow_status, a.message, a.ext, a.create_time, From 2bdc297c6c8b5b8354abfc4d439f4a054747f600 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 1 Dec 2024 16:11:04 +0800 Subject: [PATCH 083/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/BusinessStatusEnum.java | 30 +++++++++++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 8 ++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 580d8b136..adb82e5c0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -6,7 +6,10 @@ import lombok.Getter; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; +import java.sql.Array; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * 业务状态枚举 @@ -87,6 +90,33 @@ public enum BusinessStatusEnum { return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); } + /** + * 运行中的实例状态 + * + * @return 运行中的实例状态 + */ + public static List runningStatus() { + List list = new ArrayList<>(); + list.add(BusinessStatusEnum.DRAFT.getStatus()); + list.add(BusinessStatusEnum.WAITING.getStatus()); + list.add(BusinessStatusEnum.BACK.getStatus()); + list.add(BusinessStatusEnum.CANCEL.getStatus()); + return list; + } + + /** + * 结束实例状态 + * + * @return 结束实例状态 + */ + public static List finishStatus() { + List list = new ArrayList<>(); + list.add(BusinessStatusEnum.FINISH.getStatus()); + list.add(BusinessStatusEnum.INVALID.getStatus()); + list.add(BusinessStatusEnum.TERMINATION.getStatus()); + return list; + } + /** * 启动流程校验 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 7c26fc727..fe454d94c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -51,10 +51,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 流程实例 服务层实现 @@ -86,6 +83,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("t.flow_status", BusinessStatusEnum.runningStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -102,7 +100,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("t.flow_status", BusinessStatusEnum.FINISH.getStatus()); + queryWrapper.in("t.flow_status", BusinessStatusEnum.finishStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); From 096422617332c21da34a46f101dc3a1defbcec50 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 2 Dec 2024 11:02:34 +0800 Subject: [PATCH 084/227] =?UTF-8?q?update=20=E7=94=A8=E6=88=B7=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E5=8E=BB=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/core/enums/TaskAssigneeEnum.java | 2 +- .../workflow/service/impl/WfTaskAssigneeServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java index 734e04914..88ee56679 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java @@ -20,7 +20,7 @@ public enum TaskAssigneeEnum { /** * 用户 */ - USER("用户", "user:"), + USER("用户", ""), /** * 角色 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index daae27dcc..3aebd3328 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -8,6 +8,7 @@ import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.PostService; @@ -20,7 +21,6 @@ import org.dromara.warm.flow.ui.dto.HandlerQuery; import org.dromara.warm.flow.ui.dto.TreeFunDto; import org.dromara.warm.flow.ui.service.HandlerSelectService; import org.dromara.warm.flow.ui.vo.HandlerSelectVo; -import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; @@ -132,7 +132,7 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle public List fetchUsersByStorageId(String storageId) { String[] parts = storageId.split(StrUtil.COLON, 2); if (parts.length < 2) { - return Collections.emptyList(); + return getUsersByType(TaskAssigneeEnum.USER, List.of(Long.valueOf(parts[0]))); } return getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))); } From aee13fa6fca375c3c5316b639ba8d26cf19c8353 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 2 Dec 2024 11:14:24 +0800 Subject: [PATCH 085/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=88=96?= =?UTF-8?q?=E8=80=85=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=94=A8=E6=88=B7ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/satoken/utils/LoginHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 01c68c676..145fc7aa7 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -91,10 +91,10 @@ public class LoginHelper { } /** - * 获取用户id(工作流使用) + * 获取用户id */ public static String getUserIdStr() { - return USER.getCode()+Convert.toStr(getExtra(USER_KEY)); + return Convert.toStr(getExtra(USER_KEY)); } /** From c58892a6bb9728e6ba0a59bdfd33c116c4475074 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 2 Dec 2024 19:19:58 +0800 Subject: [PATCH 086/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E5=88=86?= =?UTF-8?q?=E6=B4=BE=E5=8A=9E=E7=90=86=E4=BA=BA=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/WorkflowAssignmentListener.java | 66 +++++++++++++++++++ .../listener/WorkflowStartListener.java | 2 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java new file mode 100644 index 000000000..967267c83 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java @@ -0,0 +1,66 @@ +package org.dromara.workflow.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.core.constant.FlowCons; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.listener.Listener; +import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.workflow.service.impl.WfTaskAssigneeServiceImpl; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 分派办理人监听器,动态修改代办任务信息 + * + * @author AprilWind + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowAssignmentListener implements Listener { + + private final WfTaskAssigneeServiceImpl assigneeService; + + @Override + public void notify(ListenerVariable listenerVariable) { + log.info("分派办理人监听器开始执行......"); + List tasks = listenerVariable.getNextTasks(); + Instance instance = listenerVariable.getInstance(); + for (Task task : tasks) { + List permissionList = task.getPermissionList(); + // 记录待添加的权限项 + List toAddPermissions = new ArrayList<>(); + // 使用迭代器来避免直接删除元素 + Iterator iterator = permissionList.iterator(); + while (iterator.hasNext()) { + String permission = iterator.next(); + // 替换发起人审批权限 + if (StringUtils.isNotEmpty(permission) && permission.contains(FlowCons.WARMFLOWINITIATOR)) { + iterator.remove(); + permissionList.add(permission.replace(FlowCons.WARMFLOWINITIATOR, instance.getCreateBy())); + } else { + // 获取办理人 + List users = assigneeService.fetchUsersByStorageId(permission); + if (!users.isEmpty()) { + // 移除当前权限并替换成多个用户的权限 + iterator.remove(); + for (UserDTO user : users) { + toAddPermissions.add(String.valueOf(user.getUserId())); + } + } + } + } + // 添加新权限项 + permissionList.addAll(toAddPermissions); + } + log.info("分派办理人监听器执行结束......"); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java index 77506b7d5..ed52472ba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -34,8 +34,8 @@ public class WorkflowStartListener implements Listener { @Override public void notify(ListenerVariable listenerVariable) { log.info("流程启动监听器"); + // 工作流内置参数 FlowParams flowParams = listenerVariable.getFlowParams(); - // 设置办理人所拥有的权限,比如角色、部门、用户等 log.info("流程启动监听器结束;{}", "开启流程完成"); } From 557165b8637458a7878938e09007026dfb4c140b Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 2 Dec 2024 19:47:50 +0800 Subject: [PATCH 087/227] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=83=A8=E9=97=A8=E8=B4=9F=E8=B4=A3=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/service/DeptService.java | 8 ++++++++ .../system/service/impl/SysDeptServiceImpl.java | 14 +++++++++++++- .../workflow/listener/WorkflowStartListener.java | 13 ++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java index 739847154..c79c2e831 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -21,6 +21,14 @@ public interface DeptService { */ String selectDeptNameByIds(String deptIds); + /** + * 根据部门ID查询部门负责人 + * + * @param deptId 部门ID,用于指定需要查询的部门 + * @return 返回该部门的负责人ID + */ + Long selectDeptLeaderById(Long deptId); + /** * 查询部门 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 213d7d58d..7cc85b1df 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -11,10 +11,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; -import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.utils.*; @@ -181,6 +181,18 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return String.join(StringUtils.SEPARATOR, list); } + /** + * 根据部门ID查询部门负责人 + * + * @param deptId 部门ID,用于指定需要查询的部门 + * @return 返回该部门的负责人ID + */ + @Override + public Long selectDeptLeaderById(Long deptId) { + SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(deptId); + return vo.getLeader(); + } + /** * 查询部门 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java index ed52472ba..f2b303193 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -2,11 +2,16 @@ package org.dromara.workflow.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.listener.Listener; import org.dromara.warm.flow.core.listener.ListenerVariable; import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; + /** * 流程启动监听器,用于处理流程开始时的用户信息和权限设置 *

@@ -22,6 +27,8 @@ import org.springframework.stereotype.Component; @Slf4j public class WorkflowStartListener implements Listener { + private final DeptService deptService; + /** * 全局开始监听器,用于在流程开始时,设置当前办理人的信息和权限 *

@@ -34,8 +41,12 @@ public class WorkflowStartListener implements Listener { @Override public void notify(ListenerVariable listenerVariable) { log.info("流程启动监听器"); - // 工作流内置参数 FlowParams flowParams = listenerVariable.getFlowParams(); + // 获取当前部门的负责人 + Map variable = new HashMap<>(); + Long leader = deptService.selectDeptLeaderById(LoginHelper.getDeptId()); + variable.put("deptLeader", leader); + flowParams.variable(variable); log.info("流程启动监听器结束;{}", "开启流程完成"); } From 09235ed9bdf9afe142f2083c083f39a71a2c6809 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 3 Dec 2024 09:42:03 +0800 Subject: [PATCH 088/227] =?UTF-8?q?update=20=E6=8F=90=E4=BA=A4=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E6=96=B0=E7=89=88=E6=9C=AC=E5=BE=85=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=BC=80=E5=A7=8B=E7=9B=91=E5=90=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/listener/WorkflowStartListener.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java index f2b303193..8171c1f59 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java @@ -2,14 +2,16 @@ package org.dromara.workflow.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.listener.Listener; import org.dromara.warm.flow.core.listener.ListenerVariable; import org.springframework.stereotype.Component; -import java.util.HashMap; import java.util.Map; /** @@ -43,10 +45,16 @@ public class WorkflowStartListener implements Listener { log.info("流程启动监听器"); FlowParams flowParams = listenerVariable.getFlowParams(); // 获取当前部门的负责人 - Map variable = new HashMap<>(); Long leader = deptService.selectDeptLeaderById(LoginHelper.getDeptId()); - variable.put("deptLeader", leader); - flowParams.variable(variable); + flowParams.variable(Map.of("deptLeader", leader)); + Task task = listenerVariable.getTask(); + // 办理任务监听,记录任务执行信息 + ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); + processTaskEvent.setFlowCode(listenerVariable.getDefinition().getFlowCode()); + processTaskEvent.setNodeCode(task.getNodeCode()); + processTaskEvent.setTaskId(task.getId().toString()); + processTaskEvent.setBusinessKey(listenerVariable.getInstance().getBusinessId()); + SpringUtils.context().publishEvent(processTaskEvent); log.info("流程启动监听器结束;{}", "开启流程完成"); } From 4eba739bbd6f794ec4a2f1fb604d3eeec648cef4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 11:32:18 +0800 Subject: [PATCH 089/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=8A=9E=E7=90=86=E4=BA=BA=E8=8E=B7=E5=8F=96=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 3 +++ .../dromara/workflow/handler/WorkflowPermissionHandler.java | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index cab196471..e045cefd0 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -273,4 +273,7 @@ websocket: warm-flow: # 是否开启工作流,默认true enabled: true + # 是否开启设计器ui + ui: true + # 默认Authorization,如果有多个token,用逗号分隔 token-name: ${sa-token.token-name},clientid diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index 3ce655a4b..4c8ccd334 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -1,5 +1,6 @@ package org.dromara.workflow.handler; +import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.model.LoginUser; @@ -10,6 +11,7 @@ import org.dromara.warm.flow.core.handler.PermissionHandler; import org.dromara.warm.flow.core.service.impl.TaskServiceImpl; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -33,6 +35,9 @@ public class WorkflowPermissionHandler implements PermissionHandler { @Override public List permissions() { LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return new ArrayList<>(); + } // 使用一个流来构建权限列表 return Stream.of( // 角色权限前缀 From da0d28445c95d49100b177f50c4a1baef2d01d4a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 11:49:47 +0800 Subject: [PATCH 090/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=8A=9E=E7=90=86=E4=BA=BA=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 17 ++-------- .../workflow/domain/bo/AddSignatureBo.java | 16 +++++++++ .../workflow/domain/bo/FlowDelegateBo.java | 17 ++++++++++ .../workflow/domain/bo/FlowTransferBo.java | 17 ++++++++++ .../service/impl/FlwTaskServiceImpl.java | 11 ++---- .../dromara/workflow/utils/WorkflowUtils.java | 34 ------------------- 6 files changed, 56 insertions(+), 56 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 75fef0e28..cb84d77fa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -12,7 +12,6 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.HisTask; @@ -26,7 +25,6 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.service.IFlwTaskService; -import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -173,9 +171,7 @@ public class FlwTaskController extends BaseController { @PostMapping("/delegateTask") public R delegateTask(@Validated({AddGroup.class}) @RequestBody FlowDelegateBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); - flowParams.handler(LoginHelper.getUserIdStr()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.addHandlers(bo.getUserIdentifierList()); flowParams.message(bo.getMessage()); flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); return toAjax(taskService.depute(bo.getTaskId(), flowParams)); @@ -191,9 +187,7 @@ public class FlwTaskController extends BaseController { @PostMapping("/transferTask") public R transferTask(@Validated({AddGroup.class}) @RequestBody FlowTransferBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(USER.getCode()+bo.getUserId())); - flowParams.handler(LoginHelper.getUserIdStr()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.addHandlers(bo.getUserIdentifierList()); flowParams.message(bo.getMessage()); flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); return toAjax(taskService.transfer(bo.getTaskId(), flowParams)); @@ -209,9 +203,7 @@ public class FlwTaskController extends BaseController { @PostMapping("/addSignature") public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(StreamUtils.toList(bo.getUserIds(),u->USER.getCode()+u)); - flowParams.handler(LoginHelper.getUserIdStr()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); + flowParams.addHandlers(bo.getUserIdentifierList()); flowParams.message(bo.getMessage()); flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); return toAjax(taskService.addSignature(bo.getTaskId(), flowParams)); @@ -228,8 +220,6 @@ public class FlwTaskController extends BaseController { public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { FlowParams flowParams = new FlowParams(); flowParams.reductionHandlers(StreamUtils.toList(bo.getUserIds(),u->USER.getCode()+u)); - flowParams.handler(LoginHelper.getUserIdStr()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.message(bo.getMessage()); flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); return toAjax(taskService.reductionSignature(bo.getTaskId(), flowParams)); @@ -275,5 +265,4 @@ public class FlwTaskController extends BaseController { return R.ok(flwTaskService.getBackTaskNode(instanceId)); } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java index e546249bc..7f7e43aa2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java @@ -2,12 +2,15 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; import java.util.List; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; + /** * 加签请求对象 * @@ -35,4 +38,17 @@ public class AddSignatureBo implements Serializable { * 意见 */ private String message; + + /** + * 获取包含用户标识符的列表 + *

+ * 该方法将用户代码(由 `USER.getCode()` 获取)与 `userIds` 列表中的每个用户ID拼接, + * 然后返回一个新的列表,其中每个元素都是用户代码与用户ID的拼接结果 + * + * @return 返回一个列表,其中每个元素是由用户代码和用户ID拼接而成的字符串 + */ + public List getUserIdentifierList() { + return StreamUtils.toList(userIds, userId -> USER.getCode() + userId); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java index 20dad1253..f58f9aaab 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java @@ -6,6 +6,10 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 委派任务请求对象 @@ -34,4 +38,17 @@ public class FlowDelegateBo implements Serializable { * 意见 */ private String message; + + /** + * 获取包含用户标识符的列表 + *

+ * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接, + * 然后返回一个包含该拼接结果的单一元素列表 + * + * @return 返回一个列表,列表中包含一个字符串元素,该元素是由用户代码和用户ID拼接而成 + */ + public List getUserIdentifierList() { + return Collections.singletonList(USER.getCode() + userId); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java index 65792da19..3a1be475a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java @@ -6,6 +6,10 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 终转办务请求对象 @@ -34,4 +38,17 @@ public class FlowTransferBo implements Serializable { * 意见 */ private String message; + + /** + * 获取包含用户标识符的列表 + *

+ * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接, + * 然后返回一个包含该拼接结果的单一元素列表 + * + * @return 返回一个列表,列表中包含一个字符串元素,该元素是由用户代码和用户ID拼接而成 + */ + public List getUserIdentifierList() { + return Collections.singletonList(USER.getCode() + userId); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index a85de469b..474ab00e4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.AssigneeService; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -34,6 +35,7 @@ import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.domain.vo.WfCopy; import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; +import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; @@ -109,7 +111,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - flowParams.handler(userId); flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { @@ -160,8 +161,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.variable(completeTaskBo.getVariables()); flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); - flowParams.handler(userId); - flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); @@ -260,7 +259,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); + queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); @@ -363,9 +362,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } flowParams.hisStatus(TaskStatusEnum.BACK.getStatus()); flowParams.message(bo.getMessage()); - flowParams.handler(userId); flowParams.nodeCode(bo.getNodeCode()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance, flowTasks.get(0), null); flowProcessEventHandler.processHandler(definition.getFlowCode(), @@ -409,9 +406,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { //流程定义 Definition definition = defService.getById(flowTask.getDefinitionId()); FlowParams flowParams = new FlowParams(); - flowParams.handler(LoginHelper.getUserIdStr()); flowParams.message(bo.getComment()); - flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); taskService.termination(bo.getTaskId(), flowParams); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 97dc6f953..8b3d39a89 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -4,17 +4,13 @@ import cn.hutool.core.collection.CollUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.orm.entity.FlowUser; -import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; @@ -26,36 +22,6 @@ import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { - /** - * 当前用户所有权限 - * - * @return 权限列表 - */ - public static List permissionList() { - LoginUser loginUser = LoginHelper.getLoginUser(); - Long userId = loginUser.getUserId(); - Long deptId = loginUser.getDeptId(); - // 使用一个流来构建权限列表 - return Stream.of( - // 角色权限前缀 - loginUser.getRoles().stream() - .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), - - // 岗位权限前缀 - Stream.ofNullable(loginUser.getPosts()) - .flatMap(Collection::stream) - .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), - - // 用户和部门权限 - Stream.of( - USER.getCode() + userId, - TaskAssigneeEnum.DEPT.getCode() + deptId - ) - ) - .flatMap(stream -> stream) - .collect(Collectors.toList()); - } - /** * 获取办理人 * From e312c37dda0a32900fbf4fb035e2828967ce568c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 11:56:22 +0800 Subject: [PATCH 091/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=B1=BB=E5=9E=8B=E5=B8=B8=E9=87=8F=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 474ab00e4..079a13f89 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -383,7 +383,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public List getBackTaskNode(String instanceId) { LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) .eq(FlowHisTask::getInstanceId, instanceId) - .eq(FlowHisTask::getNodeType, 1) + .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) .orderByDesc(FlowHisTask::getCreateTime); List flowHisTasks = flowHisTaskMapper.selectList(lw); if (CollUtil.isNotEmpty(flowHisTasks)) { From 4b1455008b59d3f620aa2ae4510b293dd270bf9a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 14:15:55 +0800 Subject: [PATCH 092/227] =?UTF-8?q?del=20=E5=88=A0=E9=99=A4=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/domain/WfNodeConfig.java | 61 --------------- .../workflow/domain/bo/WfNodeConfigBo.java | 63 ---------------- .../workflow/domain/vo/ProcessInstanceVo.java | 4 - .../dromara/workflow/domain/vo/TaskVo.java | 4 - .../workflow/domain/vo/WfNodeConfigVo.java | 75 ------------------- .../workflow/mapper/WfNodeConfigMapper.java | 15 ---- .../service/IWfNodeConfigService.java | 56 -------------- .../service/impl/WfNodeConfigServiceImpl.java | 75 ------------------- .../mapper/workflow/WfTaskBackNodeMapper.xml | 7 -- 9 files changed, 360 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java deleted file mode 100644 index 999425f53..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.workflow.domain; - -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 节点配置对象 wf_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_node_config") -public class WfNodeConfig extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表单id - */ - private Long formId; - - /** - * 表单类型 - */ - private String formType; - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 节点id - */ - private String nodeId; - - /** - * 流程定义id - */ - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - private String applyUserTask; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java deleted file mode 100644 index de518d3dd..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; - -/** - * 节点配置业务对象 wf_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfNodeConfig.class, reverseConvertGenerate = false) -public class WfNodeConfigBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 表单id - */ - private Long formId; - - /** - * 表单类型 - */ - private String formType; - - /** - * 节点名称 - */ - @NotBlank(message = "节点名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String nodeName; - - /** - * 节点id - */ - @NotBlank(message = "节点id不能为空", groups = {AddGroup.class, EditGroup.class}) - private String nodeId; - - /** - * 流程定义id - */ - @NotBlank(message = "流程定义id不能为空", groups = {AddGroup.class, EditGroup.class}) - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - @NotBlank(message = "是否为申请人节点不能为空", groups = {AddGroup.class, EditGroup.class}) - private String applyUserTask; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java index ab3e7a130..ec8fa73d0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -93,8 +93,4 @@ public class ProcessInstanceVo implements Serializable { */ private List taskVoList; - /** - * 节点配置 - */ - private WfNodeConfigVo wfNodeConfigVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 466e77690..9066ddea6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -166,8 +166,4 @@ public class TaskVo implements Serializable { */ private WfDefinitionConfigVo wfDefinitionConfigVo; - /** - * 节点配置 - */ - private WfNodeConfigVo wfNodeConfigVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java deleted file mode 100644 index 89e9d9b3f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import org.dromara.workflow.domain.WfNodeConfig; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 节点配置视图对象 wf_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfNodeConfig.class) -public class WfNodeConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表单id - */ - @ExcelProperty(value = "表单id") - private Long formId; - - /** - * 表单类型 - */ - @ExcelProperty(value = "表单类型") - private String formType; - - /** - * 节点名称 - */ - @ExcelProperty(value = "节点名称") - private String nodeName; - - /** - * 节点id - */ - @ExcelProperty(value = "节点id") - private String nodeId; - - /** - * 流程定义id - */ - @ExcelProperty(value = "流程定义id") - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - @ExcelProperty(value = "是否为申请人节点 (0是 1否)") - private String applyUserTask; - - /** - * 表单管理 - */ - private WfFormManageVo wfFormManageVo; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java deleted file mode 100644 index d2aecacb9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 节点配置Mapper接口 - * - * @author may - * @date 2024-03-30 - */ -public interface WfNodeConfigMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java deleted file mode 100644 index 5e64d64a5..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; - -import java.util.Collection; -import java.util.List; - -/** - * 节点配置Service接口 - * - * @author may - * @date 2024-03-30 - */ -public interface IWfNodeConfigService { - - /** - * 查询节点配置 - * - * @param id 主键 - * @return 结果 - */ - WfNodeConfigVo queryById(Long id); - - /** - * 保存节点配置 - * - * @param list 参数 - * @return 结果 - */ - Boolean saveOrUpdate(List list); - - /** - * 批量删除节点配置信息 - * - * @param ids 主键 - * @return 结果 - */ - Boolean deleteByIds(Collection ids); - - /** - * 按照流程定义id删除 - * - * @param ids 流程定义id - * @return 结果 - */ - Boolean deleteByDefIds(Collection ids); - - /** - * 按照流程定义id查询 - * - * @param ids 流程定义id - * @return 结果 - */ - List selectByDefIds(Collection ids); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java deleted file mode 100644 index 2f71482fa..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.service.IWfFormManageService; -import org.springframework.stereotype.Service; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.mapper.WfNodeConfigMapper; -import org.dromara.workflow.service.IWfNodeConfigService; - -import java.util.Collection; -import java.util.List; - -/** - * 节点配置Service业务层处理 - * - * @author may - * @date 2024-03-30 - */ -@RequiredArgsConstructor -@Service -public class WfNodeConfigServiceImpl implements IWfNodeConfigService { - - private final WfNodeConfigMapper baseMapper; - private final IWfFormManageService wfFormManageService; - - /** - * 查询节点配置 - */ - @Override - public WfNodeConfigVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - /** - * 保存节点配置 - */ - @Override - public Boolean saveOrUpdate(List list) { - return baseMapper.insertOrUpdateBatch(list); - } - - /** - * 批量删除节点配置 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 0; - } - - - - @Override - public Boolean deleteByDefIds(Collection ids) { - return baseMapper.delete(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)) > 0; - } - - @Override - public List selectByDefIds(Collection ids) { - List wfNodeConfigVos = baseMapper.selectVoList(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)); - if (CollUtil.isNotEmpty(wfNodeConfigVos)) { - List formIds = StreamUtils.toList(wfNodeConfigVos, WfNodeConfigVo::getFormId); - List wfFormManageVos = wfFormManageService.queryByIds(formIds); - for (WfNodeConfigVo wfNodeConfigVo : wfNodeConfigVos) { - wfFormManageVos.stream().filter(e -> ObjectUtil.equals(e.getId(), wfNodeConfigVo.getFormId())).findFirst().ifPresent(wfNodeConfigVo::setWfFormManageVo); - } - } - return wfNodeConfigVos; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml deleted file mode 100644 index 4a9179b62..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From f292439ff00d411e17173bf3c91189506946a440 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 14:30:03 +0800 Subject: [PATCH 093/227] =?UTF-8?q?del=20=E5=88=A0=E9=99=A4=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WfFormManageController.java | 114 ------------------ .../dromara/workflow/domain/WfFormManage.java | 51 -------- .../workflow/domain/bo/WfFormManageBo.java | 53 -------- .../domain/vo/WfDefinitionConfigVo.java | 8 +- .../workflow/domain/vo/WfFormManageVo.java | 63 ---------- .../workflow/mapper/WfFormManageMapper.java | 15 --- .../service/IWfFormManageService.java | 81 ------------- .../service/impl/WfFormManageServiceImpl.java | 111 ----------------- .../mapper/workflow/WfFormManageMapper.xml | 7 -- 9 files changed, 1 insertion(+), 502 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java deleted file mode 100644 index 198e233b4..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.dromara.workflow.controller; - -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; -import cn.dev33.satoken.annotation.SaCheckPermission; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.domain.bo.WfFormManageBo; -import org.dromara.workflow.service.IWfFormManageService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 表单管理 - * - * @author may - * @date 2024-03-29 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/formManage") -public class WfFormManageController extends BaseController { - - private final IWfFormManageService wfFormManageService; - - /** - * 查询表单管理列表 - */ - @SaCheckPermission("workflow:formManage:list") - @GetMapping("/list") - public TableDataInfo list(WfFormManageBo bo, PageQuery pageQuery) { - return wfFormManageService.queryPageList(bo, pageQuery); - } - - /** - * 查询表单管理列表 - */ - @SaCheckPermission("workflow:formManage:list") - @GetMapping("/list/selectList") - public R> selectList() { - return R.ok(wfFormManageService.selectList()); - } - - /** - * 导出表单管理列表 - */ - @SaCheckPermission("workflow:formManage:export") - @Log(title = "表单管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(WfFormManageBo bo, HttpServletResponse response) { - List list = wfFormManageService.queryList(bo); - ExcelUtil.exportExcel(list, "表单管理", WfFormManageVo.class, response); - } - - /** - * 获取表单管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("workflow:formManage:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(wfFormManageService.queryById(id)); - } - - /** - * 新增表单管理 - */ - @SaCheckPermission("workflow:formManage:add") - @Log(title = "表单管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) { - return toAjax(wfFormManageService.insertByBo(bo)); - } - - /** - * 修改表单管理 - */ - @SaCheckPermission("workflow:formManage:edit") - @Log(title = "表单管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) { - return toAjax(wfFormManageService.updateByBo(bo)); - } - - /** - * 删除表单管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("workflow:formManage:remove") - @Log(title = "表单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(wfFormManageService.deleteByIds(List.of(ids))); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java deleted file mode 100644 index 47f0d7a58..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dromara.workflow.domain; - -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 表单管理对象 wf_form_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_form_manage") -public class WfFormManage extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表单名称 - */ - private String formName; - - /** - * 表单类型 - */ - private String formType; - - /** - * 路由地址/表单ID - */ - private String router; - - /** - * 备注 - */ - private String remark; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java deleted file mode 100644 index 8afc286db..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import org.dromara.workflow.domain.WfFormManage; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; - -/** - * 表单管理业务对象 wf_form_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfFormManage.class, reverseConvertGenerate = false) -public class WfFormManageBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 表单名称 - */ - @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String formName; - - /** - * 表单类型 - */ - @NotBlank(message = "表单类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String formType; - /** - * 路由地址/表单ID - */ - @NotBlank(message = "路由地址/表单ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private String router; - - - /** - * 备注 - */ - private String remark; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java index 89ed36df9..369ddaa5d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java @@ -1,10 +1,10 @@ package org.dromara.workflow.domain.vo; -import org.dromara.workflow.domain.WfDefinitionConfig; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.workflow.domain.WfDefinitionConfig; import java.io.Serial; import java.io.Serializable; @@ -61,10 +61,4 @@ public class WfDefinitionConfigVo implements Serializable { @ExcelProperty(value = "备注") private String remark; - /** - * 表单管理 - */ - private WfFormManageVo wfFormManageVo; - - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java deleted file mode 100644 index 302df2396..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import org.dromara.workflow.domain.WfFormManage; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 表单管理视图对象 wf_form_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfFormManage.class) -public class WfFormManageVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表单名称 - */ - @ExcelProperty(value = "表单名称") - private String formName; - - /** - * 表单类型 - */ - @ExcelProperty(value = "表单类型") - private String formType; - - /** - * 表单类型名称 - */ - private String formTypeName; - - /** - * 路由地址/表单ID - */ - @ExcelProperty(value = "路由地址/表单ID") - private String router; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java deleted file mode 100644 index acf8111ad..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.workflow.domain.WfFormManage; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 表单管理Mapper接口 - * - * @author may - * @date 2024-03-29 - */ -public interface WfFormManageMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java deleted file mode 100644 index 2ca2264b0..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.domain.bo.WfFormManageBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; - -import java.util.Collection; -import java.util.List; - -/** - * 表单管理Service接口 - * - * @author may - * @date 2024-03-29 - */ -public interface IWfFormManageService { - - /** - * 查询表单管理 - * - * @param id 主键 - * @return 结果 - */ - WfFormManageVo queryById(Long id); - - /** - * 查询表单管理 - * - * @param ids 主键 - * @return 结果 - */ - List queryByIds(List ids); - - /** - * 查询表单管理列表 - * - * @param bo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery); - - /** - * 查询表单管理列表 - * - * @return 结果 - */ - List selectList(); - /** - * 查询表单管理列表 - * - * @param bo 参数 - * @return 结果 - */ - List queryList(WfFormManageBo bo); - - /** - * 新增表单管理 - * - * @param bo 参数 - * @return 结果 - */ - Boolean insertByBo(WfFormManageBo bo); - - /** - * 修改表单管理 - * - * @param bo 参数 - * @return 结果 - */ - Boolean updateByBo(WfFormManageBo bo); - - /** - * 批量删除表单管理信息 - * - * @param ids 主键 - * @return 结果 - */ - Boolean deleteByIds(Collection ids); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java deleted file mode 100644 index 55e491178..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.dromara.workflow.service.impl; - -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.dromara.workflow.common.enums.FormTypeEnum; -import org.springframework.stereotype.Service; -import org.dromara.workflow.domain.bo.WfFormManageBo; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.domain.WfFormManage; -import org.dromara.workflow.mapper.WfFormManageMapper; -import org.dromara.workflow.service.IWfFormManageService; - -import java.util.List; -import java.util.Collection; - -/** - * 表单管理Service业务层处理 - * - * @author may - * @date 2024-03-29 - */ -@RequiredArgsConstructor -@Service -public class WfFormManageServiceImpl implements IWfFormManageService { - - private final WfFormManageMapper baseMapper; - - /** - * 查询表单管理 - */ - @Override - public WfFormManageVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - @Override - public List queryByIds(List ids) { - return baseMapper.selectVoByIds(ids); - } - - /** - * 查询表单管理列表 - */ - @Override - public TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List selectList() { - List wfFormManageVos = baseMapper.selectVoList(new LambdaQueryWrapper().orderByDesc(WfFormManage::getUpdateTime)); - for (WfFormManageVo wfFormManageVo : wfFormManageVos) { - wfFormManageVo.setFormTypeName(FormTypeEnum.findByType(wfFormManageVo.getFormType())); - } - return wfFormManageVos; - } - - /** - * 查询表单管理列表 - */ - @Override - public List queryList(WfFormManageBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(WfFormManageBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfFormManage::getFormName, bo.getFormName()); - lqw.eq(StringUtils.isNotBlank(bo.getFormType()), WfFormManage::getFormType, bo.getFormType()); - return lqw; - } - - /** - * 新增表单管理 - */ - @Override - public Boolean insertByBo(WfFormManageBo bo) { - WfFormManage add = MapstructUtils.convert(bo, WfFormManage.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改表单管理 - */ - @Override - public Boolean updateByBo(WfFormManageBo bo) { - WfFormManage update = MapstructUtils.convert(bo, WfFormManage.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 批量删除表单管理 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 0; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml deleted file mode 100644 index 59221f82d..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From 58875653691cc12fcfbe88407683051c4a40dcb7 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 14:58:54 +0800 Subject: [PATCH 094/227] =?UTF-8?q?del=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8vo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/ActHistoryInfoVo.java | 87 --------- .../workflow/domain/vo/GraphicInfoVo.java | 47 ----- .../dromara/workflow/domain/vo/ModelVo.java | 48 ----- .../workflow/domain/vo/MultiInstanceVo.java | 33 ---- .../workflow/domain/vo/ParticipantVo.java | 43 ----- .../domain/vo/ProcessDefinitionVo.java | 70 -------- .../workflow/domain/vo/ProcessInstanceVo.java | 96 ---------- .../dromara/workflow/domain/vo/TaskVo.java | 169 ------------------ .../service/impl/FlwTaskServiceImpl.java | 1 - 9 files changed, 594 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java deleted file mode 100644 index 7a3c5b64e..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; -import java.util.List; - -/** - * 流程审批记录视图 - * - * @author may - */ -@Data -public class ActHistoryInfoVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - /** - * 任务id - */ - private String id; - /** - * 节点id - */ - private String taskDefinitionKey; - /** - * 任务名称 - */ - private String name; - /** - * 流程实例id - */ - private String processInstanceId; - /** - * 版本 - */ - private Integer version; - /** - * 开始时间 - */ - private Date startTime; - /** - * 结束时间 - */ - private Date endTime; - /** - * 运行时长 - */ - private String runDuration; - /** - * 状态 - */ - private String status; - /** - * 状态 - */ - private String statusName; - /** - * 办理人id - */ - private String assignee; - - /** - * 办理人名称 - */ - @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") - private String nickName; - - /** - * 办理人id - */ - private String owner; - - /** - * 审批信息id - */ - private String commentId; - - /** - * 审批信息 - */ - private String comment; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java deleted file mode 100644 index 763613165..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 节点图形信息 - * - * @author may - */ -@Data -public class GraphicInfoVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - /** - * x坐标 - */ - private double x; - - /** - * y坐标 - */ - private double y; - - /** - * 节点高度 - */ - private double height; - - /** - * 节点宽度 - */ - private double width; - - /** - * 节点id - */ - private String nodeId; - - /** - * 节点名称 - */ - private String nodeName; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java deleted file mode 100644 index b2ce81108..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 模型视图对象 - * - * @author may - */ -@Data -public class ModelVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 模型id - */ - private String id; - - /** - * 模型名称 - */ - private String name; - - /** - * 模型标识key - */ - private String key; - - /** - * 模型分类 - */ - private String categoryCode; - - /** - * 模型XML - */ - private String xml; - - /** - * 备注 - */ - private String description; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java deleted file mode 100644 index b99839603..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 多实例信息 - * - * @author may - */ -@Data -public class MultiInstanceVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 会签类型(串行,并行) - */ - private Object type; - - /** - * 会签人员KEY - */ - private String assignee; - - /** - * 会签人员集合KEY - */ - private String assigneeList; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java deleted file mode 100644 index c5876f689..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 参与者 - * - * @author may - */ -@Data -public class ParticipantVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 组id(角色id) - */ - private List groupIds; - - /** - * 候选人id(用户id) 当组id不为空时,将组内人员查出放入candidate - */ - private List candidate; - - /** - * 候选人名称(用户名称) 当组id不为空时,将组内人员查出放入candidateName - */ - private List candidateName; - - /** - * 是否认领标识 - * 当为空时默认当前任务不需要认领 - * 当为true时当前任务说明为候选模式并且有人已经认领了任务可以归还, - * 当为false时当前任务说明为候选模式该任务未认领, - */ - private Boolean claim; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java deleted file mode 100644 index 034adbb26..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 流程定义视图 - * - * @author may - */ -@Data -public class ProcessDefinitionVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程定义id - */ - private String id; - - /** - * 流程定义名称 - */ - private String name; - - /** - * 流程定义标识key - */ - private String key; - - /** - * 流程定义版本 - */ - private int version; - - /** - * 流程定义挂起或激活 1激活 2挂起 - */ - private int suspensionState; - - /** - * 流程xml名称 - */ - private String resourceName; - - /** - * 流程图片名称 - */ - private String diagramResourceName; - - /** - * 流程部署id - */ - private String deploymentId; - - /** - * 流程部署时间 - */ - private Date deploymentTime; - - /** - * 流程定义配置 - */ - private WfDefinitionConfigVo wfDefinitionConfigVo; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java deleted file mode 100644 index ec8fa73d0..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; -import java.util.List; - -/** - * 流程实例视图 - * - * @author may - */ -@Data -public class ProcessInstanceVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程实例id - */ - private String id; - - /** - * 流程定义id - */ - private String processDefinitionId; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义key - */ - private String processDefinitionKey; - - /** - * 流程定义版本 - */ - private Integer processDefinitionVersion; - - /** - * 部署id - */ - private String deploymentId; - - /** - * 业务id - */ - private String businessKey; - - /** - * 是否挂起 - */ - private Boolean isSuspended; - - /** - * 租户id - */ - private String tenantId; - - /** - * 启动时间 - */ - private Date startTime; - - /** - * 结束时间 - */ - private Date endTime; - - /** - * 启动人id - */ - private String startUserId; - - /** - * 流程状态 - */ - private String businessStatus; - - /** - * 流程状态 - */ - private String businessStatusName; - - /** - * 待办任务集合 - */ - private List taskVoList; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java deleted file mode 100644 index 9066ddea6..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 任务视图 - * - * @author may - */ -@Data -public class TaskVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务id - */ - private String id; - - /** - * 任务名称 - */ - private String name; - - /** - * 描述 - */ - private String description; - - /** - * 优先级 - */ - private Integer priority; - - /** - * 负责此任务的人员的用户id - */ - private String owner; - - /** - * 办理人id - */ - private Long assignee; - - /** - * 办理人 - */ - @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") - private String assigneeName; - - - /** - * 流程实例id - */ - private String processInstanceId; - - /** - * 执行id - */ - private String executionId; - - /** - * 无用 - */ - private String taskDefinitionId; - - /** - * 流程定义id - */ - private String processDefinitionId; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 已办任务-创建时间 - */ - private Date startTime; - - /** - * 结束时间 - */ - private Date endTime; - - /** - * 节点id - */ - private String taskDefinitionKey; - - /** - * 任务截止日期 - */ - private Date dueDate; - - /** - * 流程类别 - */ - private String category; - - /** - * 父级任务id - */ - private String parentTaskId; - - /** - * 租户id - */ - private String tenantId; - - /** - * 认领时间 - */ - private Date claimTime; - - /** - * 流程状态 - */ - private String businessStatus; - - /** - * 流程状态 - */ - private String businessStatusName; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义key - */ - private String processDefinitionKey; - - /** - * 流程定义版本 - */ - private Integer processDefinitionVersion; - - /** - * 参与者 - */ - private ParticipantVo participantVo; - - /** - * 是否会签 - */ - private Boolean multiInstance; - - /** - * 业务id - */ - private String businessKey; - - /** - * 流程定义配置 - */ - private WfDefinitionConfigVo wfDefinitionConfigVo; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 079a13f89..6b50481fa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -338,7 +338,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Override public boolean backProcess(BackProcessBo bo) { try { - String userId = LoginHelper.getUserIdStr(); Long taskId = bo.getTaskId(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { From 293008508dbf4ceebd0d023d34c754ac91283baf Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 15:11:24 +0800 Subject: [PATCH 095/227] =?UTF-8?q?del=20=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_workflow.sql | 85 ++------------------------------------ 1 file changed, 3 insertions(+), 82 deletions(-) diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 15dc3d727..d97cbb0bc 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -20,28 +20,7 @@ create table wf_category INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, sysdate(), 1, sysdate()); -- ---------------------------- --- 2、节点审批记录表 --- ---------------------------- -create table wf_task_back_node -( - id bigint(20) not null comment '节点审批ID', - tenant_id varchar(20) default '000000' comment '租户编号', - node_id varchar(255) not null comment '节点id', - node_name varchar(255) not null comment '节点名称', - order_no int not null comment '排序', - instance_id varchar(255) null comment '流程实例id', - task_type varchar(255) not null comment '节点类型', - assignee varchar(2000) not null comment '审批人', - create_dept bigint(20) null comment '创建部门', - create_by bigint(20) null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint(20) null comment '更新者', - update_time datetime null comment '更新时间', - primary key (id) -) engine = innodb comment '节点审批记录'; - --- ---------------------------- --- 3、流程定义配置表 +-- 2、流程定义配置表 -- ---------------------------- create table wf_definition_config ( @@ -61,56 +40,8 @@ create table wf_definition_config constraint uni_definition_id unique (definition_id) ) engine = innodb comment '流程定义配置'; --- ---------------------------- --- 4、表单管理 --- ---------------------------- -create table wf_form_manage -( - id bigint(20) not null comment '表单ID', - tenant_id varchar(20) default '000000' comment '租户编号', - form_name varchar(255) not null comment '表单名称', - form_type varchar(255) not null comment '表单类型', - router varchar(255) not null comment '路由地址/表单ID', - create_dept bigint(20) null comment '创建部门', - create_by bigint(20) null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint(20) null comment '更新者', - update_time datetime null comment '更新时间', - remark varchar(500) null comment '备注', - primary key (id) -) engine = innodb comment '表单管理'; - -insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time,update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate()); - --- ---------------------------- --- 5、节点配置 --- ---------------------------- -create table wf_node_config -( - id bigint(20) not null comment 'id', - tenant_id varchar(20) default '000000' comment '租户编号', - form_id bigint null comment '表单id', - form_type varchar(255) null comment '表单类型', - node_name varchar(255) not null comment '节点名称', - node_id varchar(255) not null comment '节点id', - definition_id varchar(255) not null comment '流程定义id', - apply_user_task char(1) default '0' comment '是否为申请人节点 (0是 1否)', - create_dept bigint(20) null comment '创建部门', - create_by bigint(20) null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint(20) null comment '更新者', - update_time datetime null comment '更新时间', - primary key (id) -) engine = innodb comment '节点配置'; - -insert into sys_menu -values ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(), - NULL, NULL, ''); -insert into sys_menu -values ('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', - 'workflow:model:list', 'model', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, +insert into sys_menu values ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(),NULL, NULL, ''); +insert into sys_menu values ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', @@ -159,16 +90,6 @@ INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_valu INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'自定义表单'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'动态表单'); --- 表单管理 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0','workflow:formManage:list', 'tree-table', 103, 1, sysdate(), null, null, '表单管理菜单'); - --- 表单管理按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1,sysdate(), null, null, ''); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1,sysdate(), null, null, ''); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1,sysdate(), null, null, ''); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1,sysdate(), null, null, ''); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table',103, 1, sysdate(), null, null, ''); - -- ---------------------------- -- 6、请假单信息 -- ---------------------------- From da4ae654325a5030da48a9709c1f4c783a7ec893 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 15:17:14 +0800 Subject: [PATCH 096/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9Ewarm-flow-all.s?= =?UTF-8?q?ql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_workflow.sql | 148 +++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index d97cbb0bc..b03e9a727 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -1,3 +1,151 @@ +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/mysql/warm-flow-all.sql +-- ---------------------------- +CREATE TABLE `flow_definition` +( + `id` bigint unsigned NOT NULL COMMENT '主键id', + `flow_code` varchar(40) NOT NULL COMMENT '流程编码', + `flow_name` varchar(100) NOT NULL COMMENT '流程名称', + `category` varchar(100) DEFAULT NULL COMMENT '流程类别', + `version` varchar(20) NOT NULL COMMENT '流程版本', + `is_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)', + `listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型', + `listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径', + `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='流程定义表'; + +CREATE TABLE `flow_node` +( + `id` bigint unsigned NOT NULL COMMENT '主键id', + `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束结点 3互斥网关 4并行网关)', + `definition_id` bigint NOT NULL COMMENT '流程定义id', + `node_code` varchar(100) NOT NULL COMMENT '流程节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', + `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)', + `node_ratio` DECIMAL(6,3) DEFAULT NULL COMMENT '流程签署比例值', + `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', + `skip_any_node` varchar(100) DEFAULT 'N' COMMENT '是否可以退回任意节点(Y是 N否)', + `listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型', + `listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径', + `handler_type` varchar(100) DEFAULT NULL COMMENT '处理器类型', + `handler_path` varchar(400) DEFAULT NULL COMMENT '处理器路径', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `version` varchar(20) NOT NULL COMMENT '版本', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='流程结点表'; + +CREATE TABLE `flow_skip` +( + `id` bigint unsigned NOT NULL COMMENT '主键id', + `definition_id` bigint NOT NULL COMMENT '流程定义id', + `now_node_code` varchar(100) NOT NULL COMMENT '当前流程节点的编码', + `now_node_type` tinyint(1) DEFAULT NULL COMMENT '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `next_node_code` varchar(100) NOT NULL COMMENT '下一个流程节点的编码', + `next_node_type` tinyint(1) DEFAULT NULL COMMENT '下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `skip_name` varchar(100) DEFAULT NULL COMMENT '跳转名称', + `skip_type` varchar(40) DEFAULT NULL COMMENT '跳转类型(PASS审批通过 REJECT退回)', + `skip_condition` varchar(200) DEFAULT NULL COMMENT '跳转条件', + `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='结点跳转关联表'; + +CREATE TABLE `flow_instance` +( + `id` bigint NOT NULL COMMENT '主键id', + `definition_id` bigint NOT NULL COMMENT '对应flow_definition表的id', + `business_id` varchar(40) NOT NULL COMMENT '业务id', + `node_type` tinyint(1) NOT NULL COMMENT '结点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `node_code` varchar(40) NOT NULL COMMENT '流程节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', + `variable` text COMMENT '任务变量', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)', + `activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `ext` varchar(500) DEFAULT NULL COMMENT '扩展字段,预留给业务系统使用', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='流程实例表'; + +CREATE TABLE `flow_task` +( + `id` bigint NOT NULL COMMENT '主键id', + `definition_id` bigint NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint NOT NULL COMMENT '对应flow_instance表的id', + `node_code` varchar(100) NOT NULL COMMENT '节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称', + `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='待办任务表'; + +CREATE TABLE `flow_his_task` +( + `id` bigint(20) unsigned NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', + `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', + `node_code` varchar(100) DEFAULT NULL COMMENT '开始节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '开始节点名称', + `node_type` tinyint(1) DEFAULT NULL COMMENT '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `target_node_code` varchar(100) DEFAULT NULL COMMENT '目标节点编码', + `target_node_name` varchar(100) DEFAULT NULL COMMENT '结束节点名称', + `approver` varchar(40) DEFAULT NULL COMMENT '审批者', + `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', + `collaborator` varchar(40) DEFAULT NULL COMMENT '协作人', + `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(1审批中 2 审批通过 9已退回 10失效)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `message` varchar(500) DEFAULT NULL COMMENT '审批意见', + `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `create_time` datetime DEFAULT NULL COMMENT '任务开始时间', + `update_time` datetime DEFAULT NULL COMMENT '审批完成时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB COMMENT ='历史任务记录表'; + + +CREATE TABLE `flow_user` +( + `id` bigint unsigned NOT NULL COMMENT '主键id', + `type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)', + `processed_by` varchar(80) DEFAULT NULL COMMENT '权限人', + `associated` bigint NOT NULL COMMENT '任务表id', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(80) DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `user_processed_type` (`processed_by`,`type`) +) ENGINE=InnoDB COMMENT='流程用户表'; + -- ---------------------------- -- 1、流程分类表 -- ---------------------------- From f3091e87423b1956f432a440098470ae59cc29fa Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 16:20:58 +0800 Subject: [PATCH 097/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=93=8D=E4=BD=9C=EF=BC=8C=E5=A7=94=E6=B4=BE=E3=80=81?= =?UTF-8?q?=E8=BD=AC=E5=8A=9E=E3=80=81=E5=8A=A0=E7=AD=BE=E3=80=81=E5=87=8F?= =?UTF-8?q?=E7=AD=BE=E3=80=81=E4=BF=AE=E6=94=B9=E5=8A=9E=E7=90=86=E4=BA=BA?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 121 +++++++++--------- .../workflow/domain/bo/AddSignatureBo.java | 54 -------- .../workflow/domain/bo/FlowDelegateBo.java | 54 -------- .../workflow/domain/bo/FlowTransferBo.java | 54 -------- .../domain/bo/ReductionSignatureBo.java | 38 ------ .../workflow/domain/bo/TaskOperationBo.java | 80 ++++++++++++ .../workflow/domain/bo/WfCategoryBo.java | 1 - 7 files changed, 143 insertions(+), 259 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index cb84d77fa..b7f52c17c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -5,8 +5,9 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; @@ -162,71 +163,75 @@ public class FlwTaskController extends BaseController { } /** - * 委派任务 + * 任务操作 * - * @param bo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/delegateTask") - public R delegateTask(@Validated({AddGroup.class}) @RequestBody FlowDelegateBo bo) { - FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(bo.getUserIdentifierList()); - flowParams.message(bo.getMessage()); - flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); - return toAjax(taskService.depute(bo.getTaskId(), flowParams)); - } - - /** - * 转办任务 - * - * @param bo 参数 + * @param bo 参数 + * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 */ @Log(title = "任务管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PostMapping("/transferTask") - public R transferTask(@Validated({AddGroup.class}) @RequestBody FlowTransferBo bo) { + @RepeatSubmit + @PostMapping("/{taskOperation}") + public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(bo.getUserIdentifierList()); flowParams.message(bo.getMessage()); - flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); - return toAjax(taskService.transfer(bo.getTaskId(), flowParams)); + + // 根据操作类型构建 FlowParams + switch (taskOperation) { + case "delegateTask", "transferTask", "addSignature" -> { + ValidatorUtils.validate(bo, AddGroup.class); + flowParams.addHandlers(bo.getUserIdentifiers()); + } + case "reductionSignature" -> { + ValidatorUtils.validate(bo, EditGroup.class); + flowParams.reductionHandlers(bo.getAllUserIdentifiers()); + } + case "updateAssignee" -> { + ValidatorUtils.validate(bo, AddGroup.class); + flowParams.addHandlers(bo.getUserIdentifiers()); + flowParams.cooperateType(CooperateType.APPROVAL.getKey()); + flowParams.ignore(false); + flowParams.message("修改任务办理人"); + } + default -> { + return R.fail("Invalid operation type: " + taskOperation); + } + } + + Long taskId = bo.getTaskId(); + // 设置任务状态并执行对应的任务操作 + switch (taskOperation) { + //委派任务 + case "delegateTask" -> { + flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); + return toAjax(taskService.depute(taskId, flowParams)); + } + //转办任务 + case "transferTask" -> { + flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); + return toAjax(taskService.transfer(taskId, flowParams)); + } + //加签,增加办理人 + case "addSignature" -> { + flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); + return toAjax(taskService.addSignature(taskId, flowParams)); + } + //减签,减少办理人 + case "reductionSignature" -> { + flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); + return toAjax(taskService.reductionSignature(taskId, flowParams)); + } + //修改办理人 + case "updateAssignee" -> { + return toAjax(taskService.updateHandler(taskId, flowParams)); + } + default -> { + return R.fail("Invalid operation type: " + taskOperation); + } + } } /** - * 加签 - * - * @param bo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/addSignature") - public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { - FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(bo.getUserIdentifierList()); - flowParams.message(bo.getMessage()); - flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); - return toAjax(taskService.addSignature(bo.getTaskId(), flowParams)); - } - - /** - * 减签 - * - * @param bo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/reductionSignature") - public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { - FlowParams flowParams = new FlowParams(); - flowParams.reductionHandlers(StreamUtils.toList(bo.getUserIds(),u->USER.getCode()+u)); - flowParams.message(bo.getMessage()); - flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); - return toAjax(taskService.reductionSignature(bo.getTaskId(), flowParams)); - } - - /** - * 修改任务办理人 + * TODO 待删除的方法(用上面那个),修改任务办理人 * * @param taskId 任务id * @param userId 办理人id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java deleted file mode 100644 index 7f7e43aa2..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddSignatureBo.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; - -/** - * 加签请求对象 - * - * @author may - */ -@Data -public class AddSignatureBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 加签人id - */ - @NotNull(message = "加签id不能为空", groups = {AddGroup.class}) - private List userIds; - - /** - * 任务id - */ - @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) - private Long taskId; - - /** - * 意见 - */ - private String message; - - /** - * 获取包含用户标识符的列表 - *

- * 该方法将用户代码(由 `USER.getCode()` 获取)与 `userIds` 列表中的每个用户ID拼接, - * 然后返回一个新的列表,其中每个元素都是用户代码与用户ID的拼接结果 - * - * @return 返回一个列表,其中每个元素是由用户代码和用户ID拼接而成的字符串 - */ - public List getUserIdentifierList() { - return StreamUtils.toList(userIds, userId -> USER.getCode() + userId); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java deleted file mode 100644 index f58f9aaab..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowDelegateBo.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Collections; -import java.util.List; - -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; - -/** - * 委派任务请求对象 - * - * @author may - */ -@Data -public class FlowDelegateBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 委派人id - */ - @NotNull(message = "委派人id不能为空", groups = {AddGroup.class}) - private String userId; - - /** - * 任务id - */ - @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) - private Long taskId; - - /** - * 意见 - */ - private String message; - - /** - * 获取包含用户标识符的列表 - *

- * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接, - * 然后返回一个包含该拼接结果的单一元素列表 - * - * @return 返回一个列表,列表中包含一个字符串元素,该元素是由用户代码和用户ID拼接而成 - */ - public List getUserIdentifierList() { - return Collections.singletonList(USER.getCode() + userId); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java deleted file mode 100644 index 3a1be475a..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTransferBo.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Collections; -import java.util.List; - -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; - -/** - * 终转办务请求对象 - * - * @author may - */ -@Data -public class FlowTransferBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 转办人id - */ - @NotNull(message = "转办人id不能为空", groups = {AddGroup.class}) - private String userId; - - /** - * 任务id - */ - @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) - private Long taskId; - - /** - * 意见 - */ - private String message; - - /** - * 获取包含用户标识符的列表 - *

- * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接, - * 然后返回一个包含该拼接结果的单一元素列表 - * - * @return 返回一个列表,列表中包含一个字符串元素,该元素是由用户代码和用户ID拼接而成 - */ - public List getUserIdentifierList() { - return Collections.singletonList(USER.getCode() + userId); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java deleted file mode 100644 index 08b0b89d0..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ReductionSignatureBo.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 减签请求对象 - * - * @author may - */ -@Data -public class ReductionSignatureBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 减签人id - */ - @NotNull(message = "减签id不能为空", groups = {AddGroup.class}) - private List userIds; - - /** - * 任务id - */ - @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) - private Long taskId; - - /** - * 意见 - */ - private String message; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java new file mode 100644 index 000000000..1788fdcce --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java @@ -0,0 +1,80 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; + +/** + * 任务操作业务对象,用于描述任务委派、转办、加签等操作的必要参数 + * 包含了用户ID、任务ID、任务相关的消息、以及加签/减签的用户ID + * + * @author AprilWind + */ +@Data +public class TaskOperationBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 委派/转办人的用户ID(必填,准对委派/转办人/修改办理人操作) + */ + @NotNull(message = "委派/转办人id不能为空", groups = {AddGroup.class}) + private String userId; + + /** + * 加签/减签人的用户ID列表(必填,针对加签/减签操作) + */ + @NotNull(message = "加签/减签id不能为空", groups = {EditGroup.class}) + private List userIds; + + /** + * 任务ID(必填) + */ + @NotNull(message = "任务id不能为空") + private Long taskId; + + /** + * 意见或备注信息(可选) + */ + private String message; + + /** + * 获取委派或转办的用户标识符列表 + *

+ * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接,返回一个包含拼接结果的单一元素列表 + * + * @return 返回一个包含用户标识符的单一元素列表 + */ + public List getUserIdentifiers() { + return Optional.ofNullable(userId) + .map(id -> Collections.singletonList(USER.getCode() + id)) + .orElse(Collections.emptyList()); + } + + /** + * 获取加签或减签的用户标识符列表 + *

+ * 该方法将用户代码(由 `USER.getCode()` 获取)与 `userIds` 列表中的每个用户ID拼接 + * 返回一个新的列表,每个元素都是用户代码与用户ID的拼接结果 + * + * @return 返回一个包含所有用户标识符的列表 + */ + public List getAllUserIdentifiers() { + return Optional.ofNullable(userIds) + .filter(ids -> !ids.isEmpty()) + .map(ids -> StreamUtils.toList(ids, id -> USER.getCode() + id)) + .orElse(Collections.emptyList()); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java index 69608fda3..972302c57 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java @@ -50,5 +50,4 @@ public class WfCategoryBo extends BaseEntity { */ private Long sortNum; - } From 4fabd4f39953b8f58f7ba59adb1c44e971a9f65f Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 16:43:34 +0800 Subject: [PATCH 098/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/domain/vo/WfCopy.java | 6 ++++++ .../workflow/service/impl/FlwInstanceServiceImpl.java | 1 - .../workflow/service/impl/FlwTaskServiceImpl.java | 9 ++------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java index 88a5a2184..a3f5966f6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java @@ -5,6 +5,8 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; + /** * 抄送 * @@ -26,4 +28,8 @@ public class WfCopy implements Serializable { */ private String userName; + public String getUserId() { + return USER.getCode() + userId; + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index fe454d94c..b86a8a485 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -168,7 +168,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); FlowParams flowParams = FlowParams.build(); - flowParams.handler(LoginHelper.getUserIdStr()); flowParams.nodeCode(nextNode.getNodeCode()); flowParams.message(bo.getMessage()); flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 6b50481fa..da866bf8f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -83,14 +83,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Transactional(rollbackFor = Exception.class) public Map startWorkFlow(StartProcessBo startProcessBo) { String businessKey = startProcessBo.getBusinessKey(); - String userId = LoginHelper.getUserIdStr(); if (StringUtils.isBlank(businessKey)) { throw new ServiceException("启动工作流时必须包含业务ID"); } // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 流程发起人 - variables.put(INITIATOR, userId); + variables.put(INITIATOR, LoginHelper.getUserIdStr()); // 业务id variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); @@ -135,9 +134,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Transactional(rollbackFor = Exception.class) public boolean completeTask(CompleteTaskBo completeTaskBo) { try { - // 获取当前用户ID作为任务处理人 - String userId = LoginHelper.getUserIdStr(); - // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); // 获取抄送人 @@ -228,7 +224,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowParams flowParams = FlowParams.build(); flowParams.skipType(SkipType.NONE.getKey()); flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.handler(LoginHelper.getUserIdStr()); flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); @@ -239,7 +234,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { for (WfCopy wfCopy : wfCopyList) { FlowUser flowUser = new FlowUser(); flowUser.setType(String.valueOf(4)); - flowUser.setProcessedBy(USER.getCode() + wfCopy.getUserId()); + flowUser.setProcessedBy(wfCopy.getUserId()); flowUser.setAssociated(taskId); userList.add(flowUser); } From e2c828901edf0dfbdf8f4b53cb0b67e330df8fb2 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 17:02:26 +0800 Subject: [PATCH 099/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=AE=8C=E6=88=90=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/FormatsType.java | 146 ++++++++++++ .../dromara/common/core/utils/DateUtils.java | 220 ++++++++++++------ .../service/impl/FlwInstanceServiceImpl.java | 36 +-- 3 files changed, 306 insertions(+), 96 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java new file mode 100644 index 000000000..8d4b6d911 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java @@ -0,0 +1,146 @@ +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; + +/* + * 日期格式 + * "yyyy":4位数的年份,例如:2023年表示为"2023"。 + * "yy":2位数的年份,例如:2023年表示为"23"。 + * "MM":2位数的月份,取值范围为01到12,例如:7月表示为"07"。 + * "M":不带前导零的月份,取值范围为1到12,例如:7月表示为"7"。 + * "dd":2位数的日期,取值范围为01到31,例如:22日表示为"22"。 + * "d":不带前导零的日期,取值范围为1到31,例如:22日表示为"22"。 + * "EEEE":星期的全名,例如:星期三表示为"Wednesday"。 + * "E":星期的缩写,例如:星期三表示为"Wed"。 + * "DDD" 或 "D":一年中的第几天,取值范围为001到366,例如:第200天表示为"200"。 + * 时间格式 + * "HH":24小时制的小时数,取值范围为00到23,例如:下午5点表示为"17"。 + * "hh":12小时制的小时数,取值范围为01到12,例如:下午5点表示为"05"。 + * "mm":分钟数,取值范围为00到59,例如:30分钟表示为"30"。 + * "ss":秒数,取值范围为00到59,例如:45秒表示为"45"。 + * "SSS":毫秒数,取值范围为000到999,例如:123毫秒表示为"123"。 + */ + +/** + * 日期格式与时间格式枚举 + */ +@Getter +@AllArgsConstructor +public enum FormatsType { + + /** + * 例如:2023年表示为"23" + */ + YY("yy"), + + /** + * 例如:2023年表示为"2023" + */ + YYYY("yyyy"), + + /** + * 例例如,2023年7月可以表示为 "2023-07" + */ + YYYY_MM("yyyy-MM"), + + /** + * 例如,日期 "2023年7月22日" 可以表示为 "2023-07-22" + */ + YYYY_MM_DD("yyyy-MM-dd"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023-07-22 15:30" + */ + YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023-07-22 15:30:45" + */ + YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"), + + /** + * 例如:下午3点30分45秒,表示为 "15:30:45" + */ + HH_MM_SS("HH:mm:ss"), + + /** + * 例例如,2023年7月可以表示为 "2023/07" + */ + YYYY_MM_SLASH("yyyy/MM"), + + /** + * 例如,日期 "2023年7月22日" 可以表示为 "2023/07/22" + */ + YYYY_MM_DD_SLASH("yyyy/MM/dd"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45" + */ + YYYY_MM_DD_HH_MM_SLASH("yyyy/MM/dd HH:mm"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45" + */ + YYYY_MM_DD_HH_MM_SS_SLASH("yyyy/MM/dd HH:mm:ss"), + + /** + * 例例如,2023年7月可以表示为 "2023.07" + */ + YYYY_MM_DOT("yyyy.MM"), + + /** + * 例如,日期 "2023年7月22日" 可以表示为 "2023.07.22" + */ + YYYY_MM_DD_DOT("yyyy.MM.dd"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023.07.22 15:30" + */ + YYYY_MM_DD_HH_MM_DOT("yyyy.MM.dd HH:mm"), + + /** + * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023.07.22 15:30:45" + */ + YYYY_MM_DD_HH_MM_SS_DOT("yyyy.MM.dd HH:mm:ss"), + + /** + * 例如,2023年7月可以表示为 "202307" + */ + YYYYMM("yyyyMM"), + + /** + * 例如,2023年7月22日可以表示为 "20230722" + */ + YYYYMMDD("yyyyMMdd"), + + /** + * 例如,2023年7月22日下午3点可以表示为 "2023072215" + */ + YYYYMMDDHH("yyyyMMddHH"), + + /** + * 例如,2023年7月22日下午3点30分可以表示为 "202307221530" + */ + YYYYMMDDHHMM("yyyyMMddHHmm"), + + /** + * 例如,2023年7月22日下午3点30分45秒可以表示为 "20230722153045" + */ + YYYYMMDDHHMMSS("yyyyMMddHHmmss"); + + /** + * 时间格式 + */ + private final String timeFormat; + + public static FormatsType getFormatsType(String str) { + for (FormatsType value : values()) { + if (StringUtils.contains(str, value.getTimeFormat())) { + return value; + } + } + throw new RuntimeException("'FormatsType' not found By " + str); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index 72178a7b6..20d8dbab1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -3,16 +3,15 @@ package org.dromara.common.core.utils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.time.DateFormatUtils; +import org.dromara.common.core.enums.FormatsType; +import org.dromara.common.core.exception.ServiceException; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; import java.util.Date; +import java.util.concurrent.TimeUnit; /** * 时间工具类 @@ -21,86 +20,137 @@ import java.util.Date; */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils extends org.apache.commons.lang3.time.DateUtils { - - public static final String YYYY = "yyyy"; - - public static final String YYYY_MM = "yyyy-MM"; - - public static final String YYYY_MM_DD = "yyyy-MM-dd"; - - public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; - - public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; - private static final String[] PARSE_PATTERNS = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** - * 获取当前Date型日期 + * 获取当前日期和时间 * - * @return Date() 当前日期 + * @return 当前日期和时间的 Date 对象表示 */ public static Date getNowDate() { return new Date(); } /** - * 获取当前日期, 默认格式为yyyy-MM-dd + * 获取当前日期的字符串表示,格式为YYYY-MM-DD * - * @return String + * @return 当前日期的字符串表示 */ public static String getDate() { - return dateTimeNow(YYYY_MM_DD); + return dateTimeNow(FormatsType.YYYY_MM_DD); } + /** + * 获取当前日期的字符串表示,格式为yyyyMMdd + * + * @return 当前日期的字符串表示 + */ + public static String getCurrentDate() { + return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat()); + } + + /** + * 获取当前日期的路径格式字符串,格式为"yyyy/MM/dd" + * + * @return 当前日期的路径格式字符串 + */ + public static String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat()); + } + + /** + * 获取当前时间的字符串表示,格式为YYYY-MM-DD HH:MM:SS + * + * @return 当前时间的字符串表示 + */ public static String getTime() { - return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS); } + /** + * 获取当前时间的字符串表示,格式为 "HH:MM:SS" + * + * @return 当前时间的字符串表示,格式为 "HH:MM:SS" + */ + public static String getTimeWithHourMinuteSecond() { + return dateTimeNow(FormatsType.HH_MM_SS); + } + + /** + * 获取当前日期和时间的字符串表示,格式为YYYYMMDDHHMMSS + * + * @return 当前日期和时间的字符串表示 + */ public static String dateTimeNow() { - return dateTimeNow(YYYYMMDDHHMMSS); + return dateTimeNow(FormatsType.YYYYMMDDHHMMSS); } - public static String dateTimeNow(final String format) { + /** + * 获取当前日期和时间的指定格式的字符串表示 + * + * @param format 日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @return 当前日期和时间的字符串表示 + */ + public static String dateTimeNow(final FormatsType format) { return parseDateToStr(format, new Date()); } - public static String dateTime(final Date date) { - return parseDateToStr(YYYY_MM_DD, date); + /** + * 将指定日期格式化为 YYYY-MM-DD 格式的字符串 + * + * @param date 要格式化的日期对象 + * @return 格式化后的日期字符串 + */ + public static String formatDate(final Date date) { + return parseDateToStr(FormatsType.YYYY_MM_DD, date); } - public static String parseDateToStr(final String format, final Date date) { - return new SimpleDateFormat(format).format(date); + /** + * 将指定日期格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串 + * + * @param date 要格式化的日期对象 + * @return 格式化后的日期时间字符串 + */ + public static String formatDateTime(final Date date) { + return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date); } - public static Date dateTime(final String format, final String ts) { + /** + * 将指定日期按照指定格式进行格式化 + * + * @param format 要使用的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @param date 要格式化的日期对象 + * @return 格式化后的日期时间字符串 + */ + public static String parseDateToStr(final FormatsType format, final Date date) { + return new SimpleDateFormat(format.getTimeFormat()).format(date); + } + + /** + * 将指定格式的日期时间字符串转换为 Date 对象 + * + * @param format 要解析的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @param ts 要解析的日期时间字符串 + * @return 解析后的 Date 对象 + * @throws RuntimeException 如果解析过程中发生异常 + */ + public static Date parseDateTime(final FormatsType format, final String ts) { try { - return new SimpleDateFormat(format).parse(ts); + return new SimpleDateFormat(format.getTimeFormat()).parse(ts); } catch (ParseException e) { throw new RuntimeException(e); } } /** - * 日期路径 即年/月/日 如2018/08/08 - */ - public static String datePath() { - Date now = new Date(); - return DateFormatUtils.format(now, "yyyy/MM/dd"); - } - - /** - * 日期路径 即年/月/日 如20180808 - */ - public static String dateTime() { - Date now = new Date(); - return DateFormatUtils.format(now, "yyyyMMdd"); - } - - /** - * 日期型字符串转化为日期 格式 + * 将对象转换为日期对象 + * + * @param str 要转换的对象,通常是字符串 + * @return 转换后的日期对象,如果转换失败或输入为null,则返回null */ public static Date parseDate(Object str) { if (str == null) { @@ -115,6 +165,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { /** * 获取服务器启动时间 + * + * @return 服务器启动时间的 Date 对象表示 */ public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); @@ -122,35 +174,36 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } /** - * 计算相差天数 + * 计算两个日期之间的天数差(以毫秒为单位) + * + * @param date1 第一个日期 + * @param date2 第二个日期 + * @return 两个日期之间的天数差的绝对值 */ public static int differentDaysByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } /** - * 计算两个时间差 + * 计算两个日期之间的时间差,并以天、小时和分钟的格式返回 + * + * @param endDate 结束日期 + * @param nowDate 当前日期 + * @return 表示时间差的字符串,格式为"天 小时 分钟" */ public static String getDatePoor(Date endDate, Date nowDate) { - long nd = 1000 * 24 * 60 * 60; - long nh = 1000 * 60 * 60; - long nm = 1000 * 60; - // long ns = 1000; - // 获得两个时间的毫秒时间差异 - long diff = endDate.getTime() - nowDate.getTime(); - // 计算差多少天 - long day = diff / nd; - // 计算差多少小时 - long hour = diff % nd / nh; - // 计算差多少分钟 - long min = diff % nd % nh / nm; - // 计算差多少秒//输出结果 - // long sec = diff % nd % nh % nm / ns; - return day + "天" + hour + "小时" + min + "分钟"; + long diffInMillis = endDate.getTime() - nowDate.getTime(); + long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); + long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; + long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; + return String.format("%d天 %d小时 %d分钟", day, hour, min); } /** - * 增加 LocalDateTime ==> Date + * 将 LocalDateTime 对象转换为 Date 对象 + * + * @param temporalAccessor 要转换的 LocalDateTime 对象 + * @return 转换后的 Date 对象 */ public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); @@ -158,11 +211,46 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } /** - * 增加 LocalDate ==> Date + * 将 LocalDate 对象转换为 Date 对象 + * + * @param temporalAccessor 要转换的 LocalDate 对象 + * @return 转换后的 Date 对象 */ public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + /** + * 校验日期范围 + * + * @param startDate 开始日期 + * @param endDate 结束日期 + * @param maxValue 最大时间跨度的限制值 + * @param unit 时间跨度的单位,可选择 "DAYS"、"HOURS" 或 "MINUTES" + */ + public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) { + // 校验结束日期不能早于开始日期 + if (endDate.before(startDate)) { + throw new ServiceException("结束日期不能早于开始日期"); + } + + // 计算时间跨度 + long diffInMillis = endDate.getTime() - startDate.getTime(); + + // 根据单位转换时间跨度 + long diff = switch (unit) { + case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis); + case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis); + case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis); + default -> throw new IllegalArgumentException("不支持的时间单位"); + }; + + // 校验时间跨度不超过最大限制 + if (diff > maxValue) { + throw new ServiceException("最大时间跨度为 " + maxValue + " " + unit.toString().toLowerCase()); + } + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b86a8a485..40b38de44 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -51,7 +52,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 流程实例 服务层实现 @@ -241,7 +245,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { for (FlowHisTaskVo vo : list) { vo.setCooperateTypeName(CooperateType.getValueByKey(vo.getCooperateType())); if (vo.getUpdateTime() != null && vo.getCreateTime() != null) { - vo.setRunDuration(getDuration(vo.getUpdateTime().getTime() - vo.getCreateTime().getTime())); + vo.setRunDuration(DateUtils.getDatePoor(vo.getUpdateTime(), vo.getCreateTime())); } } map.put("list", list); @@ -254,34 +258,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return map; } - /** - * 任务完成时间处理 - * - * @param time 时间 - */ - private String getDuration(long time) { - - long day = time / (24 * 60 * 60 * 1000); - long hour = (time / (60 * 60 * 1000) - day * 24); - long minute = ((time / (60 * 1000)) - day * 24 * 60 - hour * 60); - long second = (time / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); - - if (day > 0) { - return day + "天" + hour + "小时" + minute + "分钟"; - } - if (hour > 0) { - return hour + "小时" + minute + "分钟"; - } - if (minute > 0) { - return minute + "分钟"; - } - if (second > 0) { - return second + "秒"; - } else { - return 0 + "秒"; - } - } - /** * 按照实例id更新状态 * From 1387769f2688e66dba7df00f9750ff8490d615fb Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 17:11:39 +0800 Subject: [PATCH 100/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E5=A4=A9=E6=95=B0=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/TestLeaveBo.java | 1 - .../service/impl/TestLeaveServiceImpl.java | 2 + .../dromara/workflow/utils/WorkDaysUtils.java | 270 ++++++++++++++++++ 3 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index 877e98160..a1a4b5968 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -53,7 +53,6 @@ public class TestLeaveBo extends BaseEntity { /** * 请假天数 */ - @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class}) private Integer leaveDays; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 1b186c295..859aeaa42 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -21,6 +21,7 @@ import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; import org.dromara.workflow.mapper.TestLeaveMapper; import org.dromara.workflow.service.ITestLeaveService; +import org.dromara.workflow.utils.WorkDaysUtils; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -83,6 +84,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { */ @Override public TestLeaveVo insertByBo(TestLeaveBo bo) { + bo.setLeaveDays(WorkDaysUtils.calculateWorkDays(bo.getStartDate(), bo.getEndDate())); TestLeave add = MapstructUtils.convert(bo, TestLeave.class); if (StringUtils.isBlank(add.getStatus())) { add.setStatus(FlowStatus.TOBESUBMIT.getKey()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java new file mode 100644 index 000000000..ac14bb36f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java @@ -0,0 +1,270 @@ +package org.dromara.workflow.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.redis.utils.RedisUtils; + +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + * 工作日工具类 + * + * @author AprilWind + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WorkDaysUtils { + + private static final String DAYS_IN_YEARS_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "DAYS_IN_YEARS:"; + private static final LockTemplate LOCK_TEMPLATE = SpringUtils.getBean(LockTemplate.class); + //工作日 + public static final int WORKDAY = 0; + //休息日 + public static final int RESTDAY = 1; + + /** + * 根据开始日期和工作日数计算截止日期 + * + * @param startDate 开始日期 + * @param workDays 工作日数 + * @return 截止日期 + */ + public static Date calculateEndDate(Date startDate, int workDays) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + // 获取开始日期的年份 + int startYear = getYear(startDate); + //开始日期年份天 + Integer[] daysArray = daysInYear(startYear); + int startIndex = getDayOfYearIndex(startDate); + int endIndex = startIndex; + // 循环找到指定的工作日数 + while (workDays > 0) { + // 检查当前日期是否是工作日 + if (daysArray[endIndex] == WORKDAY) { + workDays--; + } + // 结束条件:工作日数为零 + if (workDays <= 0) { + break; + } + // 移动到下一天 + endIndex++; + // 如果移动到下一年 + if (endIndex >= daysArray.length) { + startYear++; + daysArray = daysInYear(startYear); + endIndex = 0; + // 更新年份 + calendar.set(Calendar.YEAR, startYear); + } + } + // 设置截止日期 + calendar.set(Calendar.DAY_OF_YEAR, endIndex + 1); + return calendar.getTime(); + } + + /** + * 计算两个日期之间的工作日天数 + * + * @param start 开始日期 + * @param end 结束日期 + * @return 实际工作日天数 + */ + public static int calculateWorkDays(Date start, Date end) { + if (start.after(end)) { + throw new IllegalArgumentException("开始日期不能晚于结束日期"); + } + int workDays = 0; + + // 获取开始和结束日期的年份 + int startYear = getYear(start); + int endYear = getYear(end); + + // 如果在同一年 + if (startYear == endYear) { + //开始日期年份天 + Integer[] daysArray = daysInYear(startYear); + for (int i = getDayOfYearIndex(start); i <= getDayOfYearIndex(end); i++) { + if (daysArray[i] == WORKDAY) { + workDays++; + } + } + } else {//跨年 + // 处理开始年份 + Integer[] startYearDaysArray = daysInYear(startYear); + int startIndex = getDayOfYearIndex(start); + for (int i = startIndex; i < startYearDaysArray.length; i++) { + if (startYearDaysArray[i] == WORKDAY) { + workDays++; + } + } + + // 处理结束年份 + Integer[] endYearDaysArray = daysInYear(endYear); + int endIndex = getDayOfYearIndex(end); + for (int i = 0; i <= endIndex; i++) { + if (endYearDaysArray[i] == WORKDAY) { + workDays++; + } + } + + // 处理中间的完整年份 + for (int year = startYear + 1; year < endYear; year++) { + Integer[] fullYearDaysArray = daysInYear(year); + for (Integer integer : fullYearDaysArray) { + if (integer == WORKDAY) { + workDays++; + } + } + } + } + return workDays; + } + + /** + * 删除指定年份的数据 + */ + public static void clearData(Integer year) { + RedisUtils.deleteObject(DAYS_IN_YEARS_KEY + year); + } + + /** + * 计算指定年份的工作日数组,标记个人的加班和调休日期 + * + * @param year 指定年份 + * @param overtime 个人加班日期列表 + * @param adjustments 个人调休日期列表 + * @return 表示每一天状态的数组,0 表示工作日,1 表示休息日 + */ + public static Integer[] calculateWorkDays(Integer year, List overtime, List adjustments) { + //获取指定年份天数 + Integer[] daysArray = daysInYear(year); + //设置为工作日(假设用于标记补班的工作日) + updateDaysArray(daysArray, overtime, WORKDAY); + //设置为休息日(假设用于标记节假日) + updateDaysArray(daysArray, adjustments, RESTDAY); + return daysArray; + } + + /** + * 获取指定年份的天数数组。如果指定年份的数据不存在,则生成并缓存数据 + * + * @param year 指定年份 + * @return 表示一年中每一天的状态数组,0 表示工作日,1 表示周末 + */ + private static Integer[] daysInYear(Integer year) { + String key = DAYS_IN_YEARS_KEY + year; + Integer[] daysInYears = RedisUtils.getCacheObject(key); + if (ArrayUtil.isNotEmpty(daysInYears)) { + return daysInYears; + } + LockInfo lock = LOCK_TEMPLATE.lock(key); + try { + // 再次检查缓存,防止缓存穿透 + daysInYears = RedisUtils.getCacheObject(key); + if (ArrayUtil.isNotEmpty(daysInYears)) { + return daysInYears; + } + // 如果年份数据不存在,则生成指定年份的数据 + Integer[] daysArray = generateDaysArray(year); + RedisUtils.setCacheObject(key, daysArray); + return daysArray; + } finally { + LOCK_TEMPLATE.releaseLock(lock); + } + } + + /** + * 根据指定年份生成天数数组,其中工作日用 0 表示,周末用 1 表示 + * + * @param year 指定年份 + * @return 表示一年中每一天的状态数组 + */ + private static Integer[] generateDaysArray(int year) { + Calendar calendar = Calendar.getInstance(); + calendar.set(year, Calendar.JANUARY, 1); + + int daysInYear = getDaysInYear(year); + Integer[] daysArray = new Integer[daysInYear]; + + for (int i = 0; i < daysInYear; i++) { + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + daysArray[i] = (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) ? RESTDAY : WORKDAY; + calendar.add(Calendar.DAY_OF_MONTH, 1); + } + //设置为工作日(假设用于标记补班的工作日) + updateDaysArray(daysArray, Collections.emptyList(), WORKDAY); + //设置为休息日(假设用于标记节假日) + updateDaysArray(daysArray, Collections.emptyList(), RESTDAY); + return daysArray; + } + + /** + * 根据日期下标更新 daysArray,将对应下标的值改为指定值 + * + * @param daysArray 原始的天数数组 + * @param days 要修改的日期列表 + * @param valueToSet 休息日用 1,工作日用 0 + */ + private static void updateDaysArray(Integer[] daysArray, List days, int valueToSet) { + if (CollUtil.isEmpty(days)) { + return; + } + + // 遍历日期下标数组,将对应的 daysArray 元素设置为1 + for (Date holiday : days) { + int index = getDayOfYearIndex(holiday); + // 确保下标在有效范围内 + if (index >= 0 && index < daysArray.length) { + daysArray[index] = valueToSet; + } + } + } + + /** + * 获取日期在一年中的下标(天数) + * + * @param date 指定日期 + * @return 日期在该年份的下标(天数) + */ + private static int getDayOfYearIndex(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); + return dayOfYear - 1; + } + + /** + * 获取指定日期的年份 + * + * @param date 指定日期 + * @return 年份 + */ + private static int getYear(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.get(Calendar.YEAR); + } + + /** + * 获取指定年份的天数 + * + * @param year 指定年份 + * @return 年份中的天数 + */ + private static int getDaysInYear(int year) { + Calendar calendar = Calendar.getInstance(); + calendar.set(year, Calendar.DECEMBER, 31); + return calendar.get(Calendar.DAY_OF_YEAR); + } + +} From 4e2090c5f41bb63050352d38c7a3759d4d88e53a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 17:25:58 +0800 Subject: [PATCH 101/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E5=A4=A9=E6=95=B0=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=BC=93=E5=AD=98=EF=BC=8C=E5=8A=A0=E9=94=81?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E5=8F=AF=E4=BB=A5=E9=87=87=E7=94=A8?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E4=BC=A0=E5=8F=82=E7=9A=84=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86redis=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WfTaskAssigneeServiceImpl.java | 3 +- .../dromara/workflow/utils/WorkDaysUtils.java | 54 ++++++------------- 2 files changed, 18 insertions(+), 39 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 3aebd3328..5c58ad9ff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -8,6 +8,7 @@ import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.enums.FormatsType; import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; @@ -119,7 +120,7 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle Optional.ofNullable(assignee.getGroupName()) .map(deptService::selectDeptNameByIds) .orElse(DEFAULT_GROUP_NAME), DEFAULT_GROUP_NAME)) - .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); + .setCreateTime(assignee -> DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java index ac14bb36f..f038830da 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java @@ -1,19 +1,10 @@ package org.dromara.workflow.utils; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.redis.utils.RedisUtils; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 工作日工具类 @@ -23,11 +14,16 @@ import java.util.List; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkDaysUtils { - private static final String DAYS_IN_YEARS_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "DAYS_IN_YEARS:"; - private static final LockTemplate LOCK_TEMPLATE = SpringUtils.getBean(LockTemplate.class); - //工作日 + private static final Map DAYS_IN_YEARS = new HashMap<>(); + + /** + * 工作日 + */ public static final int WORKDAY = 0; - //休息日 + + /** + * 休息日 + */ public static final int RESTDAY = 1; /** @@ -130,13 +126,6 @@ public class WorkDaysUtils { return workDays; } - /** - * 删除指定年份的数据 - */ - public static void clearData(Integer year) { - RedisUtils.deleteObject(DAYS_IN_YEARS_KEY + year); - } - /** * 计算指定年份的工作日数组,标记个人的加班和调休日期 * @@ -162,29 +151,18 @@ public class WorkDaysUtils { * @return 表示一年中每一天的状态数组,0 表示工作日,1 表示周末 */ private static Integer[] daysInYear(Integer year) { - String key = DAYS_IN_YEARS_KEY + year; - Integer[] daysInYears = RedisUtils.getCacheObject(key); - if (ArrayUtil.isNotEmpty(daysInYears)) { - return daysInYears; - } - LockInfo lock = LOCK_TEMPLATE.lock(key); - try { - // 再次检查缓存,防止缓存穿透 - daysInYears = RedisUtils.getCacheObject(key); - if (ArrayUtil.isNotEmpty(daysInYears)) { - return daysInYears; - } + if (DAYS_IN_YEARS.containsKey(year)) { + return DAYS_IN_YEARS.get(year); + } else { // 如果年份数据不存在,则生成指定年份的数据 Integer[] daysArray = generateDaysArray(year); - RedisUtils.setCacheObject(key, daysArray); + DAYS_IN_YEARS.put(year, daysArray); return daysArray; - } finally { - LOCK_TEMPLATE.releaseLock(lock); } } /** - * 根据指定年份生成天数数组,其中工作日用 0 表示,周末用 1 表示 + * 根据指定年份生成天数数组 * * @param year 指定年份 * @return 表示一年中每一天的状态数组 @@ -216,7 +194,7 @@ public class WorkDaysUtils { * @param valueToSet 休息日用 1,工作日用 0 */ private static void updateDaysArray(Integer[] daysArray, List days, int valueToSet) { - if (CollUtil.isEmpty(days)) { + if (ArrayUtil.isEmpty(days)) { return; } From 51a3bc9c4edf8c8e33ec44de1584c06f1286e792 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 17:39:47 +0800 Subject: [PATCH 102/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=BA=E5=91=98=E7=B1=BB=E5=9E=8B=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 4 -- .../common/enums/TaskAssigneeType.java | 49 +++++++++++++++++++ .../controller/FlwInstanceController.java | 1 - .../service/impl/FlwTaskServiceImpl.java | 4 +- 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 63435ef66..27062e852 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -23,8 +23,4 @@ public interface FlowConstant { */ String BUSINESS_KEY = "businessKey"; - /** - * 模型标识key命名规范正则表达式 - */ - String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java new file mode 100644 index 000000000..eed1b91fb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 人员类型 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum TaskAssigneeType { + + /** + * 待办任务的审批人权限 + *

该权限表示用户是待办任务的审批人,负责审核任务的执行情况。

+ */ + APPROVER("1", "待办任务的审批人权限"), + + /** + * 待办任务的转办人权限 + *

该权限表示用户是待办任务的转办人,负责将任务分配给其他人员。

+ */ + TRANSFER("2", "待办任务的转办人权限"), + + /** + * 待办任务的委托人权限 + *

该权限表示用户是待办任务的委托人,能够委托其他人代为处理任务。

+ */ + DELEGATE("3", "待办任务的委托人权限"), + + /** + * 待办任务的抄送人权限 + *

该权限表示用户是待办任务的抄送人,仅接收任务信息的通知,不参与任务的审批或处理。

+ */ + COPY("4", "待办任务的抄送人权限"); + + /** + * 类型 + */ + private final String code; + + /** + * 描述 + */ + private final String description; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 06cfab3d0..cb3b56d4a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -131,5 +131,4 @@ public class FlwInstanceController extends BaseController { return R.ok(flwInstanceService.getInstanceVariable(instanceId)); } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index da866bf8f..fb18b7ef9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -28,6 +28,7 @@ import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -47,7 +48,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; import static org.dromara.workflow.common.constant.FlowConstant.*; /** @@ -233,7 +233,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { List userList = new ArrayList<>(); for (WfCopy wfCopy : wfCopyList) { FlowUser flowUser = new FlowUser(); - flowUser.setType(String.valueOf(4)); + flowUser.setType(TaskAssigneeType.COPY.getCode()); flowUser.setProcessedBy(wfCopy.getUserId()); flowUser.setAssociated(taskId); userList.add(flowUser); From 8291680871a5665628b0b93552fd5bb835ef2142 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 17:48:44 +0800 Subject: [PATCH 103/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8A=84=E9=80=81=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index fb18b7ef9..cb36e81ed 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -210,38 +210,37 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param wfCopyList 抄送人 */ private void setCopy(FlowTask task, List wfCopyList) { + if (CollUtil.isEmpty(wfCopyList)) { + return; + } // 添加抄送人记录 - if (CollUtil.isNotEmpty(wfCopyList)) { - FlowHisTask flowHisTask = flowHisTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowHisTask.class).eq(FlowHisTask::getTaskId, task.getId())); - FlowNode flowNode = new FlowNode(); - flowNode.setNodeCode(flowHisTask.getTargetNodeCode()); - flowNode.setNodeName(flowHisTask.getTargetNodeName()); - //生成新的任务id - long taskId = identifierGenerator.nextId(null).longValue(); - task.setId(taskId); - task.setNodeName("【抄送】" + task.getNodeName()); - Date updateTime = new Date(flowHisTask.getUpdateTime().getTime()-1000); - FlowParams flowParams = FlowParams.build(); - flowParams.skipType(SkipType.NONE.getKey()); - flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); - HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); - hisTask.setCreateTime(updateTime); - hisTask.setUpdateTime(updateTime); - hisTaskService.save(hisTask); - //保存抄送人员 - List userList = new ArrayList<>(); - for (WfCopy wfCopy : wfCopyList) { + FlowHisTask flowHisTask = flowHisTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowHisTask.class).eq(FlowHisTask::getTaskId, task.getId())); + FlowNode flowNode = new FlowNode(); + flowNode.setNodeCode(flowHisTask.getTargetNodeCode()); + flowNode.setNodeName(flowHisTask.getTargetNodeName()); + //生成新的任务id + long taskId = identifierGenerator.nextId(null).longValue(); + task.setId(taskId); + task.setNodeName("【抄送】" + task.getNodeName()); + Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000); + FlowParams flowParams = FlowParams.build(); + flowParams.skipType(SkipType.NONE.getKey()); + flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); + flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); + HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); + hisTask.setCreateTime(updateTime); + hisTask.setUpdateTime(updateTime); + hisTaskService.save(hisTask); + List userList = wfCopyList.stream() + .map(wfCopy -> { FlowUser flowUser = new FlowUser(); flowUser.setType(TaskAssigneeType.COPY.getCode()); flowUser.setProcessedBy(wfCopy.getUserId()); flowUser.setAssociated(taskId); - userList.add(flowUser); - } - if (CollUtil.isNotEmpty(userList)) { - userService.saveBatch(userList); - } - } + return flowUser; + }).collect(Collectors.toList()); + // 批量保存抄送人员 + userService.saveBatch(userList); } /** From 5cec9249042d31445f48c9f7b274a43cf9b3a1bf Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 4 Dec 2024 18:13:28 +0800 Subject: [PATCH 104/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8F=AF=E9=A9=B3=E5=9B=9E=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwTaskServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index cb36e81ed..ccf67a619 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -374,15 +374,19 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { */ @Override public List getBackTaskNode(String instanceId) { + // 创建查询条件,查询历史任务记录 LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) .eq(FlowHisTask::getInstanceId, instanceId) .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) .orderByDesc(FlowHisTask::getCreateTime); List flowHisTasks = flowHisTaskMapper.selectList(lw); - if (CollUtil.isNotEmpty(flowHisTasks)) { - return flowHisTasks.stream().distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(flowHisTasks)) { + return Collections.emptyList(); } - return Collections.emptyList(); + // 直接返回去重后的列表 + return flowHisTasks.stream() + .distinct() + .collect(Collectors.toList()); } /** From 4ebf18a3a34312a4636684fec84d8fcf8b249e6b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 4 Dec 2024 22:13:50 +0800 Subject: [PATCH 105/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=85=A8=E5=B1=80=E7=9B=91=E5=90=AC=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BB=BB=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/BusinessStatusEnum.java | 10 ++ .../controller/FlwTaskController.java | 72 +------- .../listener/WorkflowAssignmentListener.java | 66 -------- .../listener/WorkflowFinishListener.java | 65 -------- .../listener/WorkflowGlobalListener.java | 71 ++++++++ .../listener/WorkflowStartListener.java | 61 ------- .../workflow/service/IFlwTaskService.java | 51 ++++++ .../service/impl/FlwInstanceServiceImpl.java | 15 +- .../service/impl/FlwTaskServiceImpl.java | 155 ++++++++++++++++-- script/bpmn/leaveFlow-serial1.xml | 2 +- 10 files changed, 291 insertions(+), 277 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index adb82e5c0..7913ddefd 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -90,6 +90,16 @@ public enum BusinessStatusEnum { return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); } + /** + * 判断是否为撤销,退回,作废,终止 + * + * @param status status + * @return 结果 + */ + public static boolean initialState(String status) { + return CANCEL.status.equals(status) || BACK.status.equals(status) || INVALID.status.equals(status) || TERMINATION.status.equals(status); + } + /** * 运行中的实例状态 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index b7f52c17c..86b7ea16c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -172,80 +172,20 @@ public class FlwTaskController extends BaseController { @RepeatSubmit @PostMapping("/{taskOperation}") public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { - FlowParams flowParams = new FlowParams(); - flowParams.message(bo.getMessage()); - - // 根据操作类型构建 FlowParams - switch (taskOperation) { - case "delegateTask", "transferTask", "addSignature" -> { - ValidatorUtils.validate(bo, AddGroup.class); - flowParams.addHandlers(bo.getUserIdentifiers()); - } - case "reductionSignature" -> { - ValidatorUtils.validate(bo, EditGroup.class); - flowParams.reductionHandlers(bo.getAllUserIdentifiers()); - } - case "updateAssignee" -> { - ValidatorUtils.validate(bo, AddGroup.class); - flowParams.addHandlers(bo.getUserIdentifiers()); - flowParams.cooperateType(CooperateType.APPROVAL.getKey()); - flowParams.ignore(false); - flowParams.message("修改任务办理人"); - } - default -> { - return R.fail("Invalid operation type: " + taskOperation); - } - } - - Long taskId = bo.getTaskId(); - // 设置任务状态并执行对应的任务操作 - switch (taskOperation) { - //委派任务 - case "delegateTask" -> { - flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); - return toAjax(taskService.depute(taskId, flowParams)); - } - //转办任务 - case "transferTask" -> { - flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); - return toAjax(taskService.transfer(taskId, flowParams)); - } - //加签,增加办理人 - case "addSignature" -> { - flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); - return toAjax(taskService.addSignature(taskId, flowParams)); - } - //减签,减少办理人 - case "reductionSignature" -> { - flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); - return toAjax(taskService.reductionSignature(taskId, flowParams)); - } - //修改办理人 - case "updateAssignee" -> { - return toAjax(taskService.updateHandler(taskId, flowParams)); - } - default -> { - return R.fail("Invalid operation type: " + taskOperation); - } - } + return toAjax(flwTaskService.taskOperation(bo, taskOperation)); } /** * TODO 待删除的方法(用上面那个),修改任务办理人 * - * @param taskId 任务id - * @param userId 办理人id + * @param taskIdList 任务id + * @param userId 办理人id */ @Log(title = "任务管理", businessType = BusinessType.UPDATE) @RepeatSubmit() - @PutMapping("/updateAssignee/{taskId}/{userId}") - public R updateAssignee(@PathVariable Long taskId, @PathVariable String userId) { - FlowParams flowParams = new FlowParams(); - flowParams.addHandlers(Collections.singletonList(USER.getCode()+userId)); - flowParams.cooperateType(CooperateType.APPROVAL.getKey()); - flowParams.ignore(false); - flowParams.message("修改任务办理人"); - return toAjax(taskService.updateHandler(taskId, flowParams)); + @PutMapping("/updateAssignee/{userId}") + public R updateAssignee(@RequestBody List taskIdList, @PathVariable String userId) { + return toAjax(flwTaskService.updateAssignee(taskIdList, userId)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java deleted file mode 100644 index 967267c83..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowAssignmentListener.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.workflow.listener; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.warm.flow.core.constant.FlowCons; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.listener.Listener; -import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.dromara.workflow.service.impl.WfTaskAssigneeServiceImpl; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * 分派办理人监听器,动态修改代办任务信息 - * - * @author AprilWind - */ -@RequiredArgsConstructor -@Component -@Slf4j -public class WorkflowAssignmentListener implements Listener { - - private final WfTaskAssigneeServiceImpl assigneeService; - - @Override - public void notify(ListenerVariable listenerVariable) { - log.info("分派办理人监听器开始执行......"); - List tasks = listenerVariable.getNextTasks(); - Instance instance = listenerVariable.getInstance(); - for (Task task : tasks) { - List permissionList = task.getPermissionList(); - // 记录待添加的权限项 - List toAddPermissions = new ArrayList<>(); - // 使用迭代器来避免直接删除元素 - Iterator iterator = permissionList.iterator(); - while (iterator.hasNext()) { - String permission = iterator.next(); - // 替换发起人审批权限 - if (StringUtils.isNotEmpty(permission) && permission.contains(FlowCons.WARMFLOWINITIATOR)) { - iterator.remove(); - permissionList.add(permission.replace(FlowCons.WARMFLOWINITIATOR, instance.getCreateBy())); - } else { - // 获取办理人 - List users = assigneeService.fetchUsersByStorageId(permission); - if (!users.isEmpty()) { - // 移除当前权限并替换成多个用户的权限 - iterator.remove(); - for (UserDTO user : users) { - toAddPermissions.add(String.valueOf(user.getUserId())); - } - } - } - } - // 添加新权限项 - permissionList.addAll(toAddPermissions); - } - log.info("分派办理人监听器执行结束......"); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java deleted file mode 100644 index 1617713f6..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.dromara.workflow.listener; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.enums.FlowStatus; -import org.dromara.warm.flow.core.listener.Listener; -import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.dromara.workflow.service.IFlwInstanceService; -import org.springframework.stereotype.Component; - -/** - * 流程完成监听器,用于处理流程结束时的业务逻辑 - *

- * 该监听器通常用于处理流程完成后的相关操作,如更新业务表、记录日志、通知等 - * 可以将业务逻辑放在此监听器中,也可以在业务代码中处理,或者使用局部监听器进行监听 - *

- *

- * 例如,当一个流程结束时,可能需要根据流程的状态更新业务表,执行后续的处理操作 - * 或者发送通知等。此监听器可以提供统一的处理入口 - *

- * - * @author AprilWind - */ -@RequiredArgsConstructor -@Component -@Slf4j -public class WorkflowFinishListener implements Listener { - - private final IFlwInstanceService iFlwInstanceService; - - /** - * 流程结束监听器,用于在流程结束后执行相关的业务逻辑 - *

- * 该方法会在流程完成后被触发,通常用于执行业务表的新增或更新操作 - * 或者其他与业务相关的操作(如通知发送、记录日志等) - *

- * - * @param listenerVariable 监听器变量,包含与当前流程相关的信息 - */ - @Override - public void notify(ListenerVariable listenerVariable) { - log.info("流程结束监听器"); - Instance instance = listenerVariable.getInstance(); - Definition definition = listenerVariable.getDefinition(); - ProcessEvent processEvent = new ProcessEvent(); - //检查流程是否已结束 - if (FlowStatus.isFinished(instance.getFlowStatus())) { - // 若流程已结束,更新状态为已完成 - iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - // 流程结束监听,处理结束后的业务逻辑 - processEvent.setStatus(BusinessStatusEnum.FINISH.getStatus()); - processEvent.setSubmit(false); - processEvent.setFlowCode(definition.getFlowCode()); - processEvent.setBusinessKey(instance.getBusinessId()); - SpringUtils.context().publishEvent(processEvent); - } - log.info("流程结束监听器结束;{}", "流程完成处理"); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java new file mode 100644 index 000000000..355bd2e67 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -0,0 +1,71 @@ +package org.dromara.workflow.listener; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.listener.GlobalListener; +import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.service.IFlwInstanceService; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 全局任务办理监听 + * + * @author may + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class WorkflowGlobalListener implements GlobalListener { + + private final FlowTaskMapper flowTaskMapper; + private final IFlwInstanceService flwInstanceService; + + @Override + public void finish(ListenerVariable listenerVariable) { + Instance instance = listenerVariable.getInstance(); + Definition definition = listenerVariable.getDefinition(); + FlowParams flowParams = listenerVariable.getFlowParams(); + //撤销,退回,作废,终止发送事件 + if (BusinessStatusEnum.initialState(flowParams.getFlowStatus())) { + publishProcessEvent(flowParams.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); + log.info("流程监听器流程状态:{}", flowParams.getFlowStatus()); + } + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instance.getId())); + if (CollUtil.isEmpty(flowTasks)) { + // 若流程已结束,更新状态为已完成并发送完成事件 + flwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); + publishProcessEvent(BusinessStatusEnum.FINISH.getStatus(), definition.getFlowCode(), instance.getBusinessId()); + log.info("流程结束,流程状态:{}", BusinessStatusEnum.FINISH.getStatus()); + } + + } + + /** + * 发布事件 + * + * @param status 状态 + * @param flowCode 流程编码 + * @param businessId 业务id + */ + private void publishProcessEvent(String status, String flowCode, String businessId) { + ProcessEvent processEvent = new ProcessEvent(); + processEvent.setStatus(status); + processEvent.setSubmit(false); + processEvent.setFlowCode(flowCode); + processEvent.setBusinessKey(businessId); + SpringUtils.context().publishEvent(processEvent); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java deleted file mode 100644 index 8171c1f59..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowStartListener.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.workflow.listener; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.event.ProcessTaskEvent; -import org.dromara.common.core.service.DeptService; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.listener.Listener; -import org.dromara.warm.flow.core.listener.ListenerVariable; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * 流程启动监听器,用于处理流程开始时的用户信息和权限设置 - *

- * 该监听器在流程启动阶段执行,主要任务是获取当前登录用户的信息,并为流程设置办理人ID及其相关权限 - * 它通过监听器变量从流程中获取参数,并设置当前用户的权限信息,如角色、岗位、用户ID和部门ID等 - * 该监听器可以避免重复编写相同的权限设置逻辑,简化流程的启动配置 - *

- * - * @author AprilWind - */ -@RequiredArgsConstructor -@Component -@Slf4j -public class WorkflowStartListener implements Listener { - - private final DeptService deptService; - - /** - * 全局开始监听器,用于在流程开始时,设置当前办理人的信息和权限 - *

- * 此方法通过监听器变量获取流程参数,获取当前登录用户,并设置当前办理人的ID和其权限信息 - * 该监听器可以用于流程的开始阶段,避免重复设置办理人信息和权限 - *

- * - * @param listenerVariable 监听器变量,包含流程参数等信息 - */ - @Override - public void notify(ListenerVariable listenerVariable) { - log.info("流程启动监听器"); - FlowParams flowParams = listenerVariable.getFlowParams(); - // 获取当前部门的负责人 - Long leader = deptService.selectDeptLeaderById(LoginHelper.getDeptId()); - flowParams.variable(Map.of("deptLeader", leader)); - Task task = listenerVariable.getTask(); - // 办理任务监听,记录任务执行信息 - ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); - processTaskEvent.setFlowCode(listenerVariable.getDefinition().getFlowCode()); - processTaskEvent.setNodeCode(task.getNodeCode()); - processTaskEvent.setTaskId(task.getId().toString()); - processTaskEvent.setBusinessKey(listenerVariable.getInstance().getBusinessId()); - SpringUtils.context().publishEvent(processTaskEvent); - log.info("流程启动监听器结束;{}", "开启流程完成"); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 758fd469e..ad7761c30 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.HisTask; +import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -79,6 +80,15 @@ public interface IFlwTaskService { */ TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery); + /** + * 修改任务办理人 + * + * @param taskIdList 任务id + * @param userId 用户id + * @return 结果 + */ + boolean updateAssignee(List taskIdList, String userId); + /** * 驳回审批 * @@ -102,4 +112,45 @@ public interface IFlwTaskService { * @return 结果 */ boolean terminationTask(FlowTerminationBo bo); + + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + * @return 结果 + */ + List selectByIdList(List taskIdList); + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + * @return 结果 + */ + FlowTask selectByIdList(Long taskId); + + /** + * 按照实例id查询任务 + * + * @param instanceIdList 流程实例id + * @return 结果 + */ + List selectByInstIdList(List instanceIdList); + + /** + * 按照实例id查询任务 + * + * @param instanceId 流程实例id + * @return 结果 + */ + List selectByInstId(Long instanceId); + + /** + * 任务操作 + * + * @param bo 参数 + * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 + * @return 结果 + */ + boolean taskOperation(TaskOperationBo bo, String taskOperation); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 40b38de44..dff11f356 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -17,11 +17,13 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.FlowFactory; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.enums.NodeType; @@ -45,7 +47,6 @@ import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.domain.vo.VariableVo; -import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; @@ -76,7 +77,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final TaskService taskService; private final FlowNodeMapper flowNodeMapper; private final NodeService nodeService; - private final FlowProcessEventHandler flowProcessEventHandler; /** * 分页查询正在运行的流程实例 @@ -165,6 +165,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (definition == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } + List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); + //获取已发布的流程节点 List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definition.getId())); AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); @@ -174,13 +176,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { FlowParams flowParams = FlowParams.build(); flowParams.nodeCode(nextNode.getNodeCode()); flowParams.message(bo.getMessage()); + flowParams.skipType(SkipType.PASS.getKey()); flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); - taskService.retrieve(instance.getId(), flowParams); - // 更新状态 - updateStatus(instance.getId(), BusinessStatusEnum.CANCEL.getStatus()); - //流程撤销监听 - flowProcessEventHandler.processHandler(definition.getFlowCode(), - bo.getBusinessId(), BusinessStatusEnum.CANCEL.getStatus(), false); + flowParams.ignore(true); + taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { log.error("撤销失败: {}", e.getMessage(), e); throw new ServiceException(e.getMessage()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index ccf67a619..a5fe14822 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -15,11 +15,15 @@ import org.dromara.common.core.service.AssigneeService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; +import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.enums.UserType; @@ -160,7 +164,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); - // 更新实例状态为待审核状态 iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); return true; @@ -196,7 +199,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } } // 批量删除现有任务的办理人记录 - userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + if (CollUtil.isNotEmpty(flowTasks)) { + userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + } // 确保要保存的 userList 不为空 if (CollUtil.isNotEmpty(userList)) { userService.saveBatch(userList); @@ -358,8 +363,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.nodeCode(bo.getNodeCode()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance, flowTasks.get(0), null); - flowProcessEventHandler.processHandler(definition.getFlowCode(), - instance.getBusinessId(), BusinessStatusEnum.BACK.getStatus(), false); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -398,18 +401,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Transactional(rollbackFor = Exception.class) public boolean terminationTask(FlowTerminationBo bo) { try { - FlowTask flowTask = flowTaskMapper.selectById(bo.getTaskId()); - Instance ins = insService.getById(flowTask.getInstanceId()); //流程定义 - Definition definition = defService.getById(flowTask.getDefinitionId()); FlowParams flowParams = new FlowParams(); flowParams.message(bo.getComment()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); taskService.termination(bo.getTaskId(), flowParams); - //流程终止监听 - flowProcessEventHandler.processHandler(definition.getFlowCode(), - ins.getBusinessId(), BusinessStatusEnum.TERMINATION.getStatus(), false); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -452,4 +449,142 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { return WorkflowUtils.getHandlerUser(userList); } + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + */ + @Override + public List selectByIdList(List taskIdList) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .in(FlowTask::getId, taskIdList)); + } + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + */ + @Override + public FlowTask selectByIdList(Long taskId) { + return flowTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getId, taskId)); + } + + /** + * 按照实例id查询任务 + * + * @param instanceIdList 流程实例id + */ + @Override + public List selectByInstIdList(List instanceIdList) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .in(FlowTask::getInstanceId, instanceIdList)); + } + + /** + * 按照实例id查询任务 + * + * @param instanceId 流程实例id + */ + @Override + public List selectByInstId(Long instanceId) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instanceId)); + } + + /** + * 任务操作 + * + * @param bo 参数 + * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean taskOperation(TaskOperationBo bo, String taskOperation) { + FlowParams flowParams = new FlowParams(); + flowParams.message(bo.getMessage()); + + // 根据操作类型构建 FlowParams + switch (taskOperation) { + case "delegateTask", "transferTask", "addSignature" -> { + ValidatorUtils.validate(bo, AddGroup.class); + flowParams.addHandlers(bo.getUserIdentifiers()); + } + case "reductionSignature" -> { + ValidatorUtils.validate(bo, EditGroup.class); + flowParams.reductionHandlers(bo.getAllUserIdentifiers()); + } + default -> { + log.error("Invalid operation type:{} ", taskOperation); + throw new ServiceException("Invalid operation type " + taskOperation); + } + } + + Long taskId = bo.getTaskId(); + // 设置任务状态并执行对应的任务操作 + switch (taskOperation) { + //委派任务 + case "delegateTask" -> { + flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); + return taskService.depute(taskId, flowParams); + } + //转办任务 + case "transferTask" -> { + flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); + return taskService.transfer(taskId, flowParams); + } + //加签,增加办理人 + case "addSignature" -> { + flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); + return taskService.addSignature(taskId, flowParams); + } + //减签,减少办理人 + case "reductionSignature" -> { + flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); + return taskService.reductionSignature(taskId, flowParams); + } + default -> { + log.error("Invalid operation type:{} ", taskOperation); + throw new ServiceException("Invalid operation type " + taskOperation); + } + } + } + + /** + * 修改任务办理人(此方法将会批量修改所有任务的办理人) + * + * @param taskIdList 任务id + * @param userId 用户id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateAssignee(List taskIdList, String userId) { + if (CollUtil.isEmpty(taskIdList)) { + return false; + } + try { + List flowTasks = selectByIdList(taskIdList); + // 批量删除现有任务的办理人记录 + if (CollUtil.isNotEmpty(flowTasks)) { + userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + } + List userList = flowTasks.stream() + .map(flowTask -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(UserType.APPROVAL.getKey()); + flowUser.setProcessedBy(userId); + flowUser.setAssociated(flowTask.getId()); + return flowUser; + }) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(userList)) { + userService.saveBatch(userList); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; + } } diff --git a/script/bpmn/leaveFlow-serial1.xml b/script/bpmn/leaveFlow-serial1.xml index 5f51196ac..e4e16e8a4 100644 --- a/script/bpmn/leaveFlow-serial1.xml +++ b/script/bpmn/leaveFlow-serial1.xml @@ -28,7 +28,7 @@ 5 2
- From 97e9c2d7d18c718cdc01e4aad70923ebeb07eaf4 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 4 Dec 2024 22:16:53 +0800 Subject: [PATCH 106/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8A=9E=E7=90=86=E4=BA=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/WorkflowGlobalListener.java | 6 ++-- .../service/impl/FlwTaskServiceImpl.java | 28 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 355bd2e67..458a95bcc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -15,6 +15,7 @@ import org.dromara.warm.flow.core.listener.ListenerVariable; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Component; import java.util.List; @@ -29,7 +30,7 @@ import java.util.List; @RequiredArgsConstructor public class WorkflowGlobalListener implements GlobalListener { - private final FlowTaskMapper flowTaskMapper; + private final IFlwTaskService iFlwTaskService; private final IFlwInstanceService flwInstanceService; @Override @@ -42,8 +43,7 @@ public class WorkflowGlobalListener implements GlobalListener { publishProcessEvent(flowParams.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); log.info("流程监听器流程状态:{}", flowParams.getFlowStatus()); } - List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) - .eq(FlowTask::getInstanceId, instance.getId())); + List flowTasks = iFlwTaskService.selectByInstId(instance.getId()); if (CollUtil.isEmpty(flowTasks)) { // 若流程已结束,更新状态为已完成并发送完成事件 flwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index a5fe14822..7b2a0d60d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -23,7 +23,6 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; -import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.enums.UserType; @@ -187,8 +186,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { //添加抄送人 setCopy(task, wfCopyList); // 根据流程实例ID查询所有关联的任务 - List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) - .eq(FlowTask::getInstanceId, instance.getId())); + List flowTasks = selectByInstId(instance.getId()); List userList = new ArrayList<>(); // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { @@ -568,18 +566,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); - } - List userList = flowTasks.stream() - .map(flowTask -> { - FlowUser flowUser = new FlowUser(); - flowUser.setType(UserType.APPROVAL.getKey()); - flowUser.setProcessedBy(userId); - flowUser.setAssociated(flowTask.getId()); - return flowUser; - }) - .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(userList)) { - userService.saveBatch(userList); + List userList = flowTasks.stream() + .map(flowTask -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(UserType.APPROVAL.getKey()); + flowUser.setProcessedBy(userId); + flowUser.setAssociated(flowTask.getId()); + return flowUser; + }) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(userList)) { + userService.saveBatch(userList); + } } } catch (Exception e) { log.error(e.getMessage(), e); From c51bb7f8155e811cc620f63d7799760ee033e8a1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 4 Dec 2024 22:45:45 +0800 Subject: [PATCH 107/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=98=B5?= =?UTF-8?q?=E7=A7=B0=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/NicknameTranslationImpl.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java index 04a8d5196..b92c7f0f5 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java @@ -2,16 +2,10 @@ package org.dromara.common.translation.core.impl; import lombok.AllArgsConstructor; import org.dromara.common.core.service.UserService; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.core.TranslationInterface; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; - /** * 用户名称翻译实现 * @@ -28,11 +22,6 @@ public class NicknameTranslationImpl implements TranslationInterface { if (key instanceof Long id) { return userService.selectNicknameByIds(id.toString()); } else if (key instanceof String ids) { - if (StringUtils.isNotBlank(ids)) { - ids = Stream.of(ids.split(StringUtils.SEPARATOR)) - .map(userId -> userId.contains(USER.getCode()) ? userId.replaceAll(USER.getCode(), StringUtils.EMPTY) : userId) - .collect(Collectors.joining(StringUtils.SEPARATOR)); - } return userService.selectNicknameByIds(ids); } return null; From 3343d08a72cc398479a5caca426f16d2f6f9d6f3 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 5 Dec 2024 10:00:18 +0800 Subject: [PATCH 108/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/BusinessStatusEnum.java | 119 ++++-------------- 1 file changed, 22 insertions(+), 97 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 7913ddefd..0716d6191 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -3,13 +3,14 @@ package org.dromara.common.core.enums; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; -import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; -import java.sql.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 业务状态枚举 @@ -64,20 +65,32 @@ public enum BusinessStatusEnum { */ private final String desc; + private static final Map STATUS_MAP = Arrays.stream(BusinessStatusEnum.values()) + .collect(Collectors.toConcurrentMap(BusinessStatusEnum::getStatus, Function.identity())); + /** - * 获取业务状态 + * 根据状态获取对应的 BusinessStatusEnum 枚举 * - * @param status 状态 + * @param status 业务状态码 + * @return 对应的 BusinessStatusEnum 枚举,如果找不到则返回 null + */ + public static BusinessStatusEnum getByStatus(String status) { + // 使用 STATUS_MAP 获取对应的枚举,若找不到则返回 null + return STATUS_MAP.get(status); + } + + /** + * 根据状态获取对应的业务状态描述信息 + * + * @param status 业务状态码 + * @return 返回业务状态描述,若状态码为空或未找到对应的枚举,返回空字符串 */ public static String findByStatus(String status) { if (StringUtils.isBlank(status)) { return StrUtil.EMPTY; } - return Arrays.stream(BusinessStatusEnum.values()) - .filter(statusEnum -> statusEnum.getStatus().equals(status)) - .findFirst() - .map(BusinessStatusEnum::getDesc) - .orElse(StrUtil.EMPTY); + BusinessStatusEnum statusEnum = STATUS_MAP.get(status); + return (statusEnum != null) ? statusEnum.getDesc() : StrUtil.EMPTY; } /** @@ -90,16 +103,6 @@ public enum BusinessStatusEnum { return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); } - /** - * 判断是否为撤销,退回,作废,终止 - * - * @param status status - * @return 结果 - */ - public static boolean initialState(String status) { - return CANCEL.status.equals(status) || BACK.status.equals(status) || INVALID.status.equals(status) || TERMINATION.status.equals(status); - } - /** * 运行中的实例状态 * @@ -127,82 +130,4 @@ public enum BusinessStatusEnum { return list; } - /** - * 启动流程校验 - * - * @param status 状态 - */ - public static void checkStartStatus(String status) { - if (WAITING.getStatus().equals(status)) { - throw new ServiceException("该单据已提交过申请,正在审批中!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 撤销流程校验 - * - * @param status 状态 - */ - public static void checkCancelStatus(String status) { - if (CANCEL.getStatus().equals(status)) { - throw new ServiceException("该单据已撤销!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (BACK.getStatus().equals(status)) { - throw new ServiceException("该单据已退回!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 驳回流程校验 - * - * @param status 状态 - */ - public static void checkBackStatus(String status) { - if (BACK.getStatus().equals(status)) { - throw new ServiceException("该单据已退回!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (CANCEL.getStatus().equals(status)) { - throw new ServiceException("该单据已撤销!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 作废,终止流程校验 - * - * @param status 状态 - */ - public static void checkInvalidStatus(String status) { - if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } } - From 11601418c27770dc3f06ef0a3e14726e544588f4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 5 Dec 2024 10:11:05 +0800 Subject: [PATCH 109/227] =?UTF-8?q?update=20=E5=9B=9E=E5=A4=8D=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/enums/BusinessStatusEnum.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 0716d6191..4365576df 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -103,6 +103,16 @@ public enum BusinessStatusEnum { return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); } + /** + * 判断是否为撤销,退回,作废,终止 + * + * @param status status + * @return 结果 + */ + public static boolean initialState(String status) { + return CANCEL.status.equals(status) || BACK.status.equals(status) || INVALID.status.equals(status) || TERMINATION.status.equals(status); + } + /** * 运行中的实例状态 * From 7a790eb23658836ac43070ec07371222cc12b99a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 5 Dec 2024 10:19:12 +0800 Subject: [PATCH 110/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86=E6=8E=A7=E5=88=B6=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/controller/FlwTaskController.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 86b7ea16c..6aa47fb0b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -5,23 +5,18 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; -import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -29,12 +24,9 @@ import org.dromara.workflow.service.IFlwTaskService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; import java.util.List; import java.util.Map; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; - /** * 任务管理 控制层 * @@ -176,7 +168,7 @@ public class FlwTaskController extends BaseController { } /** - * TODO 待删除的方法(用上面那个),修改任务办理人 + * 修改任务办理人 * * @param taskIdList 任务id * @param userId 办理人id From 463c141f04383b7f314be6d1e54720f5b37ab310 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 5 Dec 2024 10:33:36 +0800 Subject: [PATCH 111/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=AE=B0=E5=BD=95=E8=BF=90=E8=A1=8C=E6=97=B6=E9=95=BF?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/utils/DateUtils.java | 30 ++++++++++++++ .../workflow/domain/vo/FlowHisTaskVo.java | 41 +++++++++++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 6 --- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index 20d8dbab1..88cdbbc72 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -199,6 +199,36 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return String.format("%d天 %d小时 %d分钟", day, hour, min); } + /** + * 计算两个时间点的差值(天、小时、分钟、秒),当值为0时不显示该单位 + * + * @param endDate 结束时间 + * @param nowDate 当前时间 + * @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示 + */ + public static String getTimeDifference(Date endDate, Date nowDate) { + long diffInMillis = endDate.getTime() - nowDate.getTime(); + long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); + long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; + long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; + long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; + // 构建时间差字符串,条件是值不为0才显示 + StringBuilder result = new StringBuilder(); + if (day > 0) { + result.append(String.format("%d天 ", day)); + } + if (hour > 0) { + result.append(String.format("%d小时 ", hour)); + } + if (min > 0) { + result.append(String.format("%d分钟 ", min)); + } + if (sec > 0) { + result.append(String.format("%d秒", sec)); + } + return result.length() > 0 ? result.toString().trim() : "0秒"; + } + /** * 将 LocalDateTime 对象转换为 Date 对象 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 4b3351daf..e27f61eb7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,8 +1,10 @@ package org.dromara.workflow.domain.vo; import lombok.Data; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; +import org.dromara.warm.flow.core.enums.CooperateType; import java.io.Serial; import java.io.Serializable; @@ -183,4 +185,43 @@ public class FlowHisTaskVo implements Serializable { * 运行时长 */ private String runDuration; + + /** + * 设置创建时间并计算任务运行时长 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + updateRunDuration(); + } + + /** + * 设置更新时间并计算任务运行时长 + * + * @param updateTime 更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + updateRunDuration(); + } + + /** + * 更新运行时长 + */ + private void updateRunDuration() { + // 如果创建时间和更新时间均不为空,计算它们之间的时长 + if (this.updateTime != null && this.createTime != null) { + this.runDuration = DateUtils.getTimeDifference(this.updateTime, this.createTime); + } + } + + /** + * 设置协作方式,并通过协作方式获取名称 + */ + public void setCooperateType(Integer cooperateType) { + this.cooperateType = cooperateType; + this.cooperateTypeName = CooperateType.getValueByKey(cooperateType); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index dff11f356..700422207 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -241,12 +241,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); List list = BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class); - for (FlowHisTaskVo vo : list) { - vo.setCooperateTypeName(CooperateType.getValueByKey(vo.getCooperateType())); - if (vo.getUpdateTime() != null && vo.getCreateTime() != null) { - vo.setRunDuration(DateUtils.getDatePoor(vo.getUpdateTime(), vo.getCreateTime())); - } - } map.put("list", list); try { String flowChart = defService.flowChart(flowInstance.getId()); From 340b0524fd15fa1dd3c4b9b338a51151b2017fe0 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 5 Dec 2024 16:11:14 +0800 Subject: [PATCH 112/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=B8=B8=E9=87=8F=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/common/constant/FlowConstant.java | 5 +++++ .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 27062e852..605473545 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -23,4 +23,9 @@ public interface FlowConstant { */ String BUSINESS_KEY = "businessKey"; + /** + * 任务id + */ + String TASK_ID = "taskId"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 7b2a0d60d..c04de73ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -108,7 +108,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), "taskId", taskList.get(0).getId()); + return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); @@ -125,7 +125,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } - return Map.of("processInstanceId", instance.getId(), "taskId", taskList.get(0).getId()); + return Map.of(PROCESS_INSTANCE_ID, instance.getId(), TASK_ID, taskList.get(0).getId()); } /** From ed7bcec1a3fa16c5fdff3088077534e27fc10cdf Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 12:24:25 +0800 Subject: [PATCH 113/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/WorkflowService.java | 38 ++--------- .../workflow/service/IFlwInstanceService.java | 24 +++++++ .../workflow/service/IFlwTaskService.java | 34 ++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 34 ++++++++++ .../service/impl/FlwTaskServiceImpl.java | 66 +++++++++++++++++++ .../service/impl/WorkflowServiceImpl.java | 59 +++++------------ 6 files changed, 180 insertions(+), 75 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 2ff5c1d3f..52d4877b7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -23,7 +23,7 @@ public interface WorkflowService { * * @param taskId 任务id */ - String getBusinessStatusByTaskId(String taskId); + String getBusinessStatusByTaskId(Long taskId); /** * 获取当前流程状态 @@ -33,38 +33,12 @@ public interface WorkflowService { String getBusinessStatus(String businessKey); /** - * 设置流程变量(全局变量) + * 设置流程变量 * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 + * @param instanceId 流程实例id + * @param variable 流程变量 */ - void setVariable(String taskId, String variableName, Object value); - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - void setVariables(String taskId, Map variables); - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - void setVariableLocal(String taskId, String variableName, Object value); - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - void setVariablesLocal(String taskId, Map variables); + void setVariable(Long instanceId, Map variable); /** * 按照业务id查询流程实例id @@ -72,5 +46,5 @@ public interface WorkflowService { * @param businessKey 业务id * @return 结果 */ - String getInstanceIdByBusinessKey(String businessKey); + Long getInstanceIdByBusinessKey(String businessKey); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 7c6b3098d..ff9df7323 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -44,6 +44,22 @@ public interface IFlwInstanceService { */ FlowInstance instanceByBusinessId(String businessId); + /** + * 按照实例id查询流程实例 + * + * @param instanceId 实例id + * @return 结果 + */ + FlowInstance instanceById(Long instanceId); + + /** + * 按照实例id查询流程实例 + * + * @param instanceIds 实例id + * @return 结果 + */ + List instanceByIdList(List instanceIds); + /** * 按照业务id删除流程实例 * @@ -100,4 +116,12 @@ public interface IFlwInstanceService { * @return 结果 */ Map getInstanceVariable(String instanceId); + + /** + * 设置流程变量 + * + * @param instanceId 实例id + * @param variable 流程变量 + */ + void setVariable(Long instanceId, Map variable); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index ad7761c30..c4f2229a3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -3,6 +3,8 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.HisTask; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -129,6 +131,22 @@ public interface IFlwTaskService { */ FlowTask selectByIdList(Long taskId); + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + * @return 结果 + */ + List selectHisTaskByIdList(List taskIdList); + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + * @return 结果 + */ + FlowHisTask selectHisTaskById(Long taskId); + /** * 按照实例id查询任务 * @@ -153,4 +171,20 @@ public interface IFlwTaskService { * @return 结果 */ boolean taskOperation(TaskOperationBo bo, String taskOperation); + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + * @return 结果 + */ + FlowInstance selectByTaskId(Long taskId); + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + * @return 结果 + */ + List selectByTaskIdList(List taskIdList); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 700422207..55e3917a7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -122,6 +122,26 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return flowInstanceMapper.selectOne(new LambdaQueryWrapper().eq(FlowInstance::getBusinessId, businessId)); } + /** + * 按照实例id查询流程实例 + * + * @param instanceId 实例id + */ + @Override + public FlowInstance instanceById(Long instanceId) { + return flowInstanceMapper.selectById(instanceId); + } + + /** + * 按照实例id查询流程实例 + * + * @param instanceIds 实例id + */ + @Override + public List instanceByIdList(List instanceIds) { + return flowInstanceMapper.selectByIds(instanceIds); + } + /** * 按照业务id删除流程实例 * @@ -288,4 +308,18 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { map.put("variable", flowInstance.getVariable()); return map; } + + /** + * 设置流程变量 + * + * @param instanceId 实例id + * @param variable 流程变量 + */ + @Override + public void setVariable(Long instanceId, Map variable) { + Instance instance = insService.getById(instanceId); + if (instance != null) { + taskService.mergeVariable(instance, variable); + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c04de73ee..ecf8f222f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -469,6 +469,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { .eq(FlowTask::getId, taskId)); } + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + * @return 结果 + */ + @Override + public List selectHisTaskByIdList(List taskIdList) { + return flowHisTaskMapper.selectList(new LambdaQueryWrapper<>(FlowHisTask.class) + .in(FlowHisTask::getId, taskIdList)); + } + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public FlowHisTask selectHisTaskById(Long taskId) { + return flowHisTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowHisTask.class) + .eq(FlowHisTask::getId, taskId)); + } + /** * 按照实例id查询任务 * @@ -585,4 +609,46 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } return true; } + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + */ + @Override + public FlowInstance selectByTaskId(Long taskId) { + FlowTask flowTask = selectByIdList(taskId); + if (flowTask == null) { + FlowHisTask flowHisTask = selectHisTaskById(taskId); + if (flowHisTask != null) { + return iFlwInstanceService.instanceById(flowHisTask.getInstanceId()); + } + } + return null; + } + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + */ + @Override + public List selectByTaskIdList(List taskIdList) { + if (CollUtil.isEmpty(taskIdList)) { + return Collections.emptyList(); + } + Set instanceIds = new HashSet<>(); + List flowTaskList = selectByIdList(taskIdList); + for (FlowTask flowTask : flowTaskList) { + instanceIds.add(flowTask.getInstanceId()); + } + List flowHisTaskList = selectHisTaskByIdList(taskIdList); + for (FlowHisTask flowHisTask : flowHisTaskList) { + instanceIds.add(flowHisTask.getInstanceId()); + } + if (!instanceIds.isEmpty()) { + return iFlwInstanceService.instanceByIdList(new ArrayList<>(instanceIds)); + } + return Collections.emptyList(); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 0c2ec50ad..96f51a71f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -1,8 +1,11 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.service.WorkflowService; +import org.dromara.common.core.utils.StringUtils; import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; import java.util.List; @@ -17,7 +20,8 @@ import java.util.Map; @Service public class WorkflowServiceImpl implements WorkflowService { - private final IFlwInstanceService iFlwInstanceService; + private final IFlwInstanceService flwInstanceService; + private final IFlwTaskService flwTaskService; /** * 删除流程实例 @@ -27,7 +31,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public boolean deleteInstance(List businessKeys) { - return iFlwInstanceService.deleteByBusinessIds(businessKeys); + return flwInstanceService.deleteByBusinessIds(businessKeys); } /** @@ -36,8 +40,8 @@ public class WorkflowServiceImpl implements WorkflowService { * @param taskId 任务id */ @Override - public String getBusinessStatusByTaskId(String taskId) { - return ""; + public String getBusinessStatusByTaskId(Long taskId) { + return ObjectUtil.isNotNull(flwTaskService.selectByTaskId(taskId)) ? flwTaskService.selectByTaskId(taskId).getFlowStatus() : StringUtils.EMPTY; } /** @@ -47,49 +51,18 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatus(String businessKey) { - return ""; + return ObjectUtil.isNotNull(flwInstanceService.instanceByBusinessId(businessKey)) ? flwInstanceService.instanceByBusinessId(businessKey).getFlowStatus() : StringUtils.EMPTY; } /** - * 设置流程变量(全局变量) + * 设置流程变量 * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 + * @param instanceId 流程实例id + * @param variables 流程变量 */ @Override - public void setVariable(String taskId, String variableName, Object value) { - } - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - @Override - public void setVariables(String taskId, Map variables) { - } - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - @Override - public void setVariableLocal(String taskId, String variableName, Object value) { - } - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - @Override - public void setVariablesLocal(String taskId, Map variables) { + public void setVariable(Long instanceId, Map variables) { + flwInstanceService.setVariable(instanceId, variables); } /** @@ -99,7 +72,7 @@ public class WorkflowServiceImpl implements WorkflowService { * @return 结果 */ @Override - public String getInstanceIdByBusinessKey(String businessKey) { - return null; + public Long getInstanceIdByBusinessKey(String businessKey) { + return ObjectUtil.isNotNull(flwInstanceService.instanceByBusinessId(businessKey)) ? flwInstanceService.instanceByBusinessId(businessKey).getId() : null; } } From ee1d31405e716d149e605519acd0be7d1aa17bf5 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 12:29:19 +0800 Subject: [PATCH 114/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/FlowDefinitionVo.java | 94 ++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java index bae92af87..7e9bec3bf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -1,6 +1,96 @@ package org.dromara.workflow.domain.vo; -import org.dromara.warm.flow.orm.entity.FlowDefinition; +import lombok.Data; -public class FlowDefinitionVo extends FlowDefinition { +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程定义视图 + * + * @author may + */ +@Data +public class FlowDefinitionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 流程编码 + */ + private String flowCode; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 流程类别 + */ + private String category; + + /** + * 流程版本 + */ + private String version; + + /** + * 是否发布(0未开启 1开启) + */ + private Integer isPublish; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formPath; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 监听器类型 + */ + private String listenerType; + + /** + * 监听器路径 + */ + private String listenerPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; } From b60e3fba278d14640042722b5fb79b1492589709 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 13:14:06 +0800 Subject: [PATCH 115/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=A7=94=E6=89=98=EF=BC=8C=E8=BD=AC=E5=8A=9E=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/satoken/utils/LoginHelper.java | 1 - .../controller/FlwTaskController.java | 4 +-- .../workflow/domain/bo/TaskOperationBo.java | 34 +------------------ .../dromara/workflow/domain/vo/WfCopy.java | 5 --- .../handler/WorkflowPermissionHandler.java | 3 +- .../listener/WorkflowGlobalListener.java | 3 +- .../workflow/service/IFlwTaskService.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 12 +++---- .../impl/WfTaskAssigneeServiceImpl.java | 2 +- .../dromara/workflow/utils/WorkflowUtils.java | 3 +- 10 files changed, 15 insertions(+), 54 deletions(-) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 145fc7aa7..e2c92366f 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -15,7 +15,6 @@ import org.dromara.common.core.enums.UserType; import java.util.Set; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 登录鉴权助手 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 6aa47fb0b..ad05867cb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -158,11 +158,11 @@ public class FlwTaskController extends BaseController { * 任务操作 * * @param bo 参数 - * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature */ @Log(title = "任务管理", businessType = BusinessType.UPDATE) @RepeatSubmit - @PostMapping("/{taskOperation}") + @PostMapping("/taskOperation/{taskOperation}") public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { return toAjax(flwTaskService.taskOperation(bo, taskOperation)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java index 1788fdcce..4348e310c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java @@ -2,17 +2,13 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotNull; import lombok.Data; -import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import java.io.Serial; import java.io.Serializable; -import java.util.Collections; import java.util.List; -import java.util.Optional; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 任务操作业务对象,用于描述任务委派、转办、加签等操作的必要参数 @@ -27,7 +23,7 @@ public class TaskOperationBo implements Serializable { private static final long serialVersionUID = 1L; /** - * 委派/转办人的用户ID(必填,准对委派/转办人/修改办理人操作) + * 委派/转办人的用户ID(必填,准对委派/转办人操作) */ @NotNull(message = "委派/转办人id不能为空", groups = {AddGroup.class}) private String userId; @@ -49,32 +45,4 @@ public class TaskOperationBo implements Serializable { */ private String message; - /** - * 获取委派或转办的用户标识符列表 - *

- * 该方法将用户的代码(由 `USER.getCode()` 获取)与当前用户的 ID(`userId`)进行拼接,返回一个包含拼接结果的单一元素列表 - * - * @return 返回一个包含用户标识符的单一元素列表 - */ - public List getUserIdentifiers() { - return Optional.ofNullable(userId) - .map(id -> Collections.singletonList(USER.getCode() + id)) - .orElse(Collections.emptyList()); - } - - /** - * 获取加签或减签的用户标识符列表 - *

- * 该方法将用户代码(由 `USER.getCode()` 获取)与 `userIds` 列表中的每个用户ID拼接 - * 返回一个新的列表,每个元素都是用户代码与用户ID的拼接结果 - * - * @return 返回一个包含所有用户标识符的列表 - */ - public List getAllUserIdentifiers() { - return Optional.ofNullable(userIds) - .filter(ids -> !ids.isEmpty()) - .map(ids -> StreamUtils.toList(ids, id -> USER.getCode() + id)) - .orElse(Collections.emptyList()); - } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java index a3f5966f6..560b81435 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java @@ -5,7 +5,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 抄送 @@ -28,8 +27,4 @@ public class WfCopy implements Serializable { */ private String userName; - public String getUserId() { - return USER.getCode() + userId; - } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index 4c8ccd334..d06d22356 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -50,8 +50,7 @@ public class WorkflowPermissionHandler implements PermissionHandler { .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), // 用户和部门权限 - Stream.of( - TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), + Stream.of(String.valueOf(loginUser.getUserId()), TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() ) ) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 458a95bcc..44e7d9762 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; @@ -39,7 +40,7 @@ public class WorkflowGlobalListener implements GlobalListener { Definition definition = listenerVariable.getDefinition(); FlowParams flowParams = listenerVariable.getFlowParams(); //撤销,退回,作废,终止发送事件 - if (BusinessStatusEnum.initialState(flowParams.getFlowStatus())) { + if (flowParams != null && StringUtils.isNotBlank(flowParams.getFlowStatus()) && BusinessStatusEnum.initialState(flowParams.getFlowStatus())) { publishProcessEvent(flowParams.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); log.info("流程监听器流程状态:{}", flowParams.getFlowStatus()); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index c4f2229a3..d2b80c142 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -167,7 +167,7 @@ public interface IFlwTaskService { * 任务操作 * * @param bo 参数 - * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature * @return 结果 */ boolean taskOperation(TaskOperationBo bo, String taskOperation); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index ecf8f222f..779af3775 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -238,7 +238,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { .map(wfCopy -> { FlowUser flowUser = new FlowUser(); flowUser.setType(TaskAssigneeType.COPY.getCode()); - flowUser.setProcessedBy(wfCopy.getUserId()); + flowUser.setProcessedBy(String.valueOf(wfCopy.getUserId())); flowUser.setAssociated(taskId); return flowUser; }).collect(Collectors.toList()); @@ -519,7 +519,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * 任务操作 * * @param bo 参数 - * @param taskOperation 操作类型,区分委派、转办、加签、减签、修改办理人 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature */ @Override @Transactional(rollbackFor = Exception.class) @@ -529,13 +529,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 根据操作类型构建 FlowParams switch (taskOperation) { - case "delegateTask", "transferTask", "addSignature" -> { + case "delegateTask", "transferTask" -> { ValidatorUtils.validate(bo, AddGroup.class); - flowParams.addHandlers(bo.getUserIdentifiers()); + flowParams.addHandlers(Collections.singletonList(bo.getUserId())); } - case "reductionSignature" -> { + case "reductionSignature", "addSignature" -> { ValidatorUtils.validate(bo, EditGroup.class); - flowParams.reductionHandlers(bo.getAllUserIdentifiers()); + flowParams.reductionHandlers(bo.getUserIds()); } default -> { log.error("Invalid operation type:{} ", taskOperation); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 5c58ad9ff..8bd138f38 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -39,7 +39,7 @@ import java.util.Optional; @RequiredArgsConstructor @Service public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, HandlerSelectService { - final static String DEFAULT_GROUP_NAME = "默认分组"; + static final String DEFAULT_GROUP_NAME = "默认分组"; private final UserService userService; private final DeptService deptService; private final RoleService roleService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 8b3d39a89..4d47eeee3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -12,7 +12,6 @@ import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; import java.util.stream.Collectors; -import static org.dromara.common.core.enums.TaskAssigneeEnum.USER; /** * 工作流工具 @@ -62,7 +61,7 @@ public class WorkflowUtils { users.forEach(dto -> { FlowUser flowUser = new FlowUser(); flowUser.setType(user.getType()); - flowUser.setProcessedBy(USER.getCode()+dto.getUserId()); + flowUser.setProcessedBy(String.valueOf(dto.getUserId())); flowUser.setAssociated(taskId); list.add(flowUser); }); From e3825e928fb5b78d4e24d935e81f93ffa49598ea Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 19:13:05 +0800 Subject: [PATCH 116/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E5=AE=9E=E4=BE=8B=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 10 +-- .../workflow/domain/vo/FlowTaskVo.java | 1 + .../workflow/service/IFlwInstanceService.java | 22 +++++- .../workflow/service/IFlwTaskService.java | 19 +---- .../service/impl/FlwInstanceServiceImpl.java | 71 +++++++++++++++---- .../service/impl/FlwTaskServiceImpl.java | 64 ++++------------- .../service/impl/WorkflowServiceImpl.java | 8 +-- 7 files changed, 95 insertions(+), 100 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index ad05867cb..83d06f8de 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -131,15 +131,7 @@ public class FlwTaskController extends BaseController { */ @GetMapping("/getTaskById/{taskId}") public R getTaskById(@PathVariable Long taskId) { - Task task = taskService.getById(taskId); - if (ObjectUtil.isNotNull(task)) { - FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); - Instance instance = insService.getById(task.getInstanceId()); - flowTaskVo.setFlowStatus(instance.getFlowStatus()); - flowTaskVo.setFlowStatusName(BusinessStatusEnum.findByStatus(instance.getFlowStatus())); - return R.ok(flowTaskVo); - } - return R.fail(); + return R.ok(flwTaskService.selectById(taskId)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 806d8c271..5f7b0b622 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -116,6 +116,7 @@ public class FlowTaskVo implements Serializable { /** * 流程状态 */ + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "flowStatus",other = "wf_business_status") private String flowStatusName; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index ff9df7323..1be0f9c9c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -42,7 +42,7 @@ public interface IFlwInstanceService { * @param businessId 业务id * @return 结果 */ - FlowInstance instanceByBusinessId(String businessId); + FlowInstance selectInstByBusinessId(String businessId); /** * 按照实例id查询流程实例 @@ -50,7 +50,7 @@ public interface IFlwInstanceService { * @param instanceId 实例id * @return 结果 */ - FlowInstance instanceById(Long instanceId); + FlowInstance selectInstById(Long instanceId); /** * 按照实例id查询流程实例 @@ -58,7 +58,7 @@ public interface IFlwInstanceService { * @param instanceIds 实例id * @return 结果 */ - List instanceByIdList(List instanceIds); + List selectInstListByIdList(List instanceIds); /** * 按照业务id删除流程实例 @@ -124,4 +124,20 @@ public interface IFlwInstanceService { * @param variable 流程变量 */ void setVariable(Long instanceId, Map variable); + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + * @return 结果 + */ + FlowInstance selectByTaskId(Long taskId); + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + * @return 结果 + */ + List selectByTaskIdList(List taskIdList); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index d2b80c142..ffa6e800d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -4,7 +4,6 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -129,7 +128,7 @@ public interface IFlwTaskService { * @param taskId 任务id * @return 结果 */ - FlowTask selectByIdList(Long taskId); + FlowTaskVo selectById(Long taskId); /** * 按照任务id查询任务 @@ -171,20 +170,4 @@ public interface IFlwTaskService { * @return 结果 */ boolean taskOperation(TaskOperationBo bo, String taskOperation); - - /** - * 按任务id查询实例 - * - * @param taskId 任务id - * @return 结果 - */ - FlowInstance selectByTaskId(Long taskId); - - /** - * 按任务id查询实例 - * - * @param taskIdList 任务id - * @return 结果 - */ - List selectByTaskIdList(List taskIdList); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 55e3917a7..6d579bb8f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -11,7 +11,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -24,7 +23,6 @@ import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.enums.CooperateType; import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; @@ -33,10 +31,7 @@ import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.utils.AssertUtil; -import org.dromara.warm.flow.orm.entity.FlowDefinition; -import org.dromara.warm.flow.orm.entity.FlowHisTask; -import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; @@ -49,14 +44,12 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.domain.vo.VariableVo; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 流程实例 服务层实现 @@ -77,6 +70,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final TaskService taskService; private final FlowNodeMapper flowNodeMapper; private final NodeService nodeService; + private final IFlwTaskService flwTaskService; /** * 分页查询正在运行的流程实例 @@ -118,7 +112,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param businessId 业务id */ @Override - public FlowInstance instanceByBusinessId(String businessId) { + public FlowInstance selectInstByBusinessId(String businessId) { return flowInstanceMapper.selectOne(new LambdaQueryWrapper().eq(FlowInstance::getBusinessId, businessId)); } @@ -128,7 +122,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param instanceId 实例id */ @Override - public FlowInstance instanceById(Long instanceId) { + public FlowInstance selectInstById(Long instanceId) { return flowInstanceMapper.selectById(instanceId); } @@ -138,7 +132,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param instanceIds 实例id */ @Override - public List instanceByIdList(List instanceIds) { + public List selectInstListByIdList(List instanceIds) { return flowInstanceMapper.selectByIds(instanceIds); } @@ -177,7 +171,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Transactional(rollbackFor = Exception.class) public boolean cancelProcessApply(FlowCancelBo bo) { try { - Instance instance = instanceByBusinessId(bo.getBusinessId()); + Instance instance = selectInstByBusinessId(bo.getBusinessId()); if (instance == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } @@ -254,7 +248,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public Map getFlowImage(String businessId) { Map map = new HashMap<>(16); - FlowInstance flowInstance = instanceByBusinessId(businessId); + FlowInstance flowInstance = selectInstByBusinessId(businessId); + if (flowInstance == null) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); @@ -322,4 +319,48 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { taskService.mergeVariable(instance, variable); } } + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + */ + @Override + public FlowInstance selectByTaskId(Long taskId) { + Task task = taskService.getById(taskId); + if (task == null) { + FlowHisTask flowHisTask = flwTaskService.selectHisTaskById(taskId); + if (flowHisTask != null) { + return selectInstById(flowHisTask.getInstanceId()); + } + } else { + return selectInstById(task.getInstanceId()); + } + return null; + } + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + */ + @Override + public List selectByTaskIdList(List taskIdList) { + if (CollUtil.isEmpty(taskIdList)) { + return Collections.emptyList(); + } + Set instanceIds = new HashSet<>(); + List flowTaskList = flwTaskService.selectByIdList(taskIdList); + for (FlowTask flowTask : flowTaskList) { + instanceIds.add(flowTask.getInstanceId()); + } + List flowHisTaskList = flwTaskService.selectHisTaskByIdList(taskIdList); + for (FlowHisTask flowHisTask : flowHisTaskList) { + instanceIds.add(flowHisTask.getInstanceId()); + } + if (!instanceIds.isEmpty()) { + return selectInstListByIdList(new ArrayList<>(instanceIds)); + } + return Collections.emptyList(); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 779af3775..849db5265 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -29,6 +30,7 @@ import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.service.*; import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskAssigneeType; @@ -41,7 +43,6 @@ import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; -import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IWfDefinitionConfigService; import org.dromara.workflow.utils.WorkflowUtils; @@ -65,10 +66,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final TaskService taskService; private final InsService insService; + private final FlowInstanceMapper flowInstanceMapper; private final FlwTaskMapper flwTaskMapper; private final UserService userService; private final IWfDefinitionConfigService wfDefinitionConfigService; - private final IFlwInstanceService iFlwInstanceService; private final FlowTaskMapper flowTaskMapper; private final FlowHisTaskMapper flowHisTaskMapper; private final FlowSkipMapper flowSkipMapper; @@ -105,7 +106,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { log.error("流程定义ID【{}】不存在!", definitionId); throw new ServiceException("请到流程定义ID【" + definitionId + "】不存在!"); } - FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); + FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) + .eq(FlowInstance::getBusinessId, businessKey)); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); @@ -163,8 +165,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); - // 更新实例状态为待审核状态 - iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -464,9 +464,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param taskId 任务id */ @Override - public FlowTask selectByIdList(Long taskId) { - return flowTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowTask.class) - .eq(FlowTask::getId, taskId)); + public FlowTaskVo selectById(Long taskId) { + Task task = taskService.getById(taskId); + if (task == null) { + return null; + } + FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); + Instance instance = insService.getById(task.getInstanceId()); + flowTaskVo.setFlowStatus(instance.getFlowStatus()); + return flowTaskVo; } /** @@ -609,46 +615,4 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } return true; } - - /** - * 按任务id查询实例 - * - * @param taskId 任务id - */ - @Override - public FlowInstance selectByTaskId(Long taskId) { - FlowTask flowTask = selectByIdList(taskId); - if (flowTask == null) { - FlowHisTask flowHisTask = selectHisTaskById(taskId); - if (flowHisTask != null) { - return iFlwInstanceService.instanceById(flowHisTask.getInstanceId()); - } - } - return null; - } - - /** - * 按任务id查询实例 - * - * @param taskIdList 任务id - */ - @Override - public List selectByTaskIdList(List taskIdList) { - if (CollUtil.isEmpty(taskIdList)) { - return Collections.emptyList(); - } - Set instanceIds = new HashSet<>(); - List flowTaskList = selectByIdList(taskIdList); - for (FlowTask flowTask : flowTaskList) { - instanceIds.add(flowTask.getInstanceId()); - } - List flowHisTaskList = selectHisTaskByIdList(taskIdList); - for (FlowHisTask flowHisTask : flowHisTaskList) { - instanceIds.add(flowHisTask.getInstanceId()); - } - if (!instanceIds.isEmpty()) { - return iFlwInstanceService.instanceByIdList(new ArrayList<>(instanceIds)); - } - return Collections.emptyList(); - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 96f51a71f..d460a5ed6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -5,7 +5,6 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.StringUtils; import org.dromara.workflow.service.IFlwInstanceService; -import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; import java.util.List; @@ -21,7 +20,6 @@ import java.util.Map; public class WorkflowServiceImpl implements WorkflowService { private final IFlwInstanceService flwInstanceService; - private final IFlwTaskService flwTaskService; /** * 删除流程实例 @@ -41,7 +39,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatusByTaskId(Long taskId) { - return ObjectUtil.isNotNull(flwTaskService.selectByTaskId(taskId)) ? flwTaskService.selectByTaskId(taskId).getFlowStatus() : StringUtils.EMPTY; + return ObjectUtil.isNotNull(flwInstanceService.selectByTaskId(taskId)) ? flwInstanceService.selectByTaskId(taskId).getFlowStatus() : StringUtils.EMPTY; } /** @@ -51,7 +49,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatus(String businessKey) { - return ObjectUtil.isNotNull(flwInstanceService.instanceByBusinessId(businessKey)) ? flwInstanceService.instanceByBusinessId(businessKey).getFlowStatus() : StringUtils.EMPTY; + return ObjectUtil.isNotNull(flwInstanceService.selectInstByBusinessId(businessKey)) ? flwInstanceService.selectInstByBusinessId(businessKey).getFlowStatus() : StringUtils.EMPTY; } /** @@ -73,6 +71,6 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public Long getInstanceIdByBusinessKey(String businessKey) { - return ObjectUtil.isNotNull(flwInstanceService.instanceByBusinessId(businessKey)) ? flwInstanceService.instanceByBusinessId(businessKey).getId() : null; + return ObjectUtil.isNotNull(flwInstanceService.selectInstByBusinessId(businessKey)) ? flwInstanceService.selectInstByBusinessId(businessKey).getId() : null; } } From 71d91dc325e604f9c058134f8e9102e59311b026 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 19:25:11 +0800 Subject: [PATCH 117/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9F=A5=E8=AF=A2=E4=BC=9A=E7=AD=BE=EF=BC=8C=E7=A5=A8?= =?UTF-8?q?=E7=AD=BE=E6=AF=94=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/vo/FlowTaskVo.java | 8 +++++++- .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 5f7b0b622..e60cd0b54 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -7,6 +7,7 @@ import org.dromara.warm.flow.core.entity.User; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -116,7 +117,7 @@ public class FlowTaskVo implements Serializable { /** * 流程状态 */ - @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "flowStatus",other = "wf_business_status") + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "flowStatus", other = "wf_business_status") private String flowStatusName; /** @@ -134,4 +135,9 @@ public class FlowTaskVo implements Serializable { * 办理人类型 */ private String type; + + /** + * 流程签署比例值 大于0为票签,会签 + */ + private BigDecimal nodeRatio; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 849db5265..51f6501ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -77,6 +77,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final DefService defService; private final HisTaskService hisTaskService; private final IdentifierGenerator identifierGenerator; + private final NodeService nodeService; /** * 启动任务 @@ -341,7 +342,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { throw new ServiceException("任务不存在!"); } Long definitionId = flowTasks.get(0).getDefinitionId(); - Definition definition = defService.getById(definitionId); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); //开始节点的下一节点 @@ -472,6 +472,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); Instance instance = insService.getById(task.getInstanceId()); flowTaskVo.setFlowStatus(instance.getFlowStatus()); + List nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId()); + if (CollUtil.isNotEmpty(nodeList)) { + Node node = nodeList.get(0); + flowTaskVo.setNodeRatio(node.getNodeRatio()); + } return flowTaskVo; } From 8cbe6d1ba2e6b239bd52317ab06c11b42f762100 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 19:43:20 +0800 Subject: [PATCH 118/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=8A=9E?= =?UTF-8?q?=E7=90=86=E4=BA=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 51f6501ac..0f101301b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -620,4 +620,23 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } return true; } + + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + */ + @Override + public List getUserListTaskId(Long taskId) { + // 获取与当前任务关联的用户列表 + List associatedUsers = userService.getByAssociateds(Collections.singletonList(taskId)); + if (CollUtil.isEmpty(associatedUsers)) { + return Collections.emptyList(); + } + Set users = WorkflowUtils.getUser(associatedUsers, taskId); + if (CollUtil.isEmpty(users)) { + return Collections.emptyList(); + } + return WorkflowUtils.getHandlerUser(new ArrayList<>(users)); + } } From a9572ad4ac879d0861b1852c4bc086ae3ff8bb57 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Dec 2024 22:29:51 +0800 Subject: [PATCH 119/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE=20add=20=20=E5=8A=9E=E7=90=86=E4=BA=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/FlwTaskController.java | 16 +++++++++++----- .../workflow/service/IFlwTaskService.java | 9 +++++++++ .../service/impl/FlwTaskServiceImpl.java | 6 +++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 83d06f8de..1f2029a53 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -1,10 +1,8 @@ package org.dromara.workflow.controller; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; @@ -13,8 +11,6 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.HisTask; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.workflow.domain.bo.*; @@ -194,4 +190,14 @@ public class FlwTaskController extends BaseController { return R.ok(flwTaskService.getBackTaskNode(instanceId)); } + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + */ + @GetMapping("/getUserListTaskId/{taskId}") + public R> getUserListTaskId(@PathVariable Long taskId) { + return R.ok(flwTaskService.getUserListTaskId(taskId)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index ffa6e800d..6d738d39d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.HisTask; @@ -170,4 +171,12 @@ public interface IFlwTaskService { * @return 结果 */ boolean taskOperation(TaskOperationBo bo, String taskOperation); + + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + * @return 结果 + */ + List getUserListTaskId(Long taskId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 0f101301b..55d84494a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -544,7 +544,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { ValidatorUtils.validate(bo, AddGroup.class); flowParams.addHandlers(Collections.singletonList(bo.getUserId())); } - case "reductionSignature", "addSignature" -> { + case "addSignature" -> { + ValidatorUtils.validate(bo, EditGroup.class); + flowParams.addHandlers(bo.getUserIds()); + } + case "reductionSignature" -> { ValidatorUtils.validate(bo, EditGroup.class); flowParams.reductionHandlers(bo.getUserIds()); } From 4b2faf193b310c696033effb7fc79a4e3cbfba7d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 8 Dec 2024 12:07:05 +0800 Subject: [PATCH 120/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE=EF=BC=8C=E5=87=8F=E7=AD=BE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 20 ++++++++++++++++++ .../service/impl/FlwTaskServiceImpl.java | 21 ++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 605473545..18cc90678 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -28,4 +28,24 @@ public interface FlowConstant { */ String TASK_ID = "taskId"; + /** + * 委托 + */ + String DELEGATE_TASK = "delegateTask"; + + /** + * 转办 + */ + String TRANSFER_TASK = "transferTask"; + + /** + * 加签 + */ + String ADD_SIGNATURE = "addSignature"; + + /** + * 减签 + */ + String REDUCTION_SIGNATURE = "reductionSignature"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 55d84494a..4dfd03f07 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -49,6 +49,7 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -540,15 +541,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { // 根据操作类型构建 FlowParams switch (taskOperation) { - case "delegateTask", "transferTask" -> { + case DELEGATE_TASK, TRANSFER_TASK -> { ValidatorUtils.validate(bo, AddGroup.class); flowParams.addHandlers(Collections.singletonList(bo.getUserId())); } - case "addSignature" -> { + case ADD_SIGNATURE -> { ValidatorUtils.validate(bo, EditGroup.class); flowParams.addHandlers(bo.getUserIds()); } - case "reductionSignature" -> { + case REDUCTION_SIGNATURE -> { ValidatorUtils.validate(bo, EditGroup.class); flowParams.reductionHandlers(bo.getUserIds()); } @@ -559,25 +560,31 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } Long taskId = bo.getTaskId(); + FlowTaskVo flowTaskVo = selectById(taskId); + if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) { + if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) { + throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!"); + } + } // 设置任务状态并执行对应的任务操作 switch (taskOperation) { //委派任务 - case "delegateTask" -> { + case DELEGATE_TASK -> { flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); return taskService.depute(taskId, flowParams); } //转办任务 - case "transferTask" -> { + case TRANSFER_TASK -> { flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); return taskService.transfer(taskId, flowParams); } //加签,增加办理人 - case "addSignature" -> { + case ADD_SIGNATURE -> { flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); return taskService.addSignature(taskId, flowParams); } //减签,减少办理人 - case "reductionSignature" -> { + case REDUCTION_SIGNATURE -> { flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); return taskService.reductionSignature(taskId, flowParams); } From cc2e306620e67963d575c3514c67c1f8384253f7 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 8 Dec 2024 15:03:10 +0800 Subject: [PATCH 121/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 4dfd03f07..e234ba055 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -472,7 +472,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { } FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); Instance instance = insService.getById(task.getInstanceId()); + Definition definition = defService.getById(task.getDefinitionId()); flowTaskVo.setFlowStatus(instance.getFlowStatus()); + flowTaskVo.setVersion(definition.getVersion()); + flowTaskVo.setFlowCode(definition.getFlowCode()); + flowTaskVo.setFlowName(definition.getFlowName()); + flowTaskVo.setBusinessId(instance.getBusinessId()); List nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId()); if (CollUtil.isNotEmpty(nodeList)) { Node node = nodeList.get(0); @@ -538,6 +543,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public boolean taskOperation(TaskOperationBo bo, String taskOperation) { FlowParams flowParams = new FlowParams(); flowParams.message(bo.getMessage()); + if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { + flowParams.ignore(true); + } // 根据操作类型构建 FlowParams switch (taskOperation) { From 91cc65890c3cadf8fde67cec6bd9e0872ec4dd0f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 8 Dec 2024 15:32:24 +0800 Subject: [PATCH 122/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BD=9C=E5=BA=9F=20update=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwInstanceController.java | 16 ++++++++++ .../workflow/domain/bo/FlowInvalidBo.java | 31 +++++++++++++++++++ .../listener/WorkflowGlobalListener.java | 25 +++++++-------- .../workflow/service/IFlwInstanceService.java | 9 ++++++ .../service/impl/FlwInstanceServiceImpl.java | 25 +++++++++++++++ .../service/impl/FlwTaskServiceImpl.java | 1 - 6 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index cb3b56d4a..c2349ff99 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -2,6 +2,9 @@ package org.dromara.workflow.controller; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; @@ -9,6 +12,7 @@ import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.service.InsService; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.validation.annotation.Validated; @@ -131,4 +135,16 @@ public class FlwInstanceController extends BaseController { return R.ok(flwInstanceService.getInstanceVariable(instanceId)); } + /** + * 作废流程 + * + * @param bo 参数 + */ + @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/processInvalid") + public R processInvalid(@Validated @RequestBody FlowInvalidBo bo) { + return R.ok(flwInstanceService.processInvalid(bo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java new file mode 100644 index 000000000..297bd00d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 作废请求对象 + * + * @author may + */ +@Data +public class FlowInvalidBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + @NotNull(message = "流程实例id为空", groups = AddGroup.class) + private Long id; + + /** + * 审批意见 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 44e7d9762..99297d009 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -1,20 +1,17 @@ package org.dromara.workflow.listener; import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.listener.GlobalListener; import org.dromara.warm.flow.core.listener.ListenerVariable; import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Component; @@ -38,18 +35,18 @@ public class WorkflowGlobalListener implements GlobalListener { public void finish(ListenerVariable listenerVariable) { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); - FlowParams flowParams = listenerVariable.getFlowParams(); //撤销,退回,作废,终止发送事件 - if (flowParams != null && StringUtils.isNotBlank(flowParams.getFlowStatus()) && BusinessStatusEnum.initialState(flowParams.getFlowStatus())) { - publishProcessEvent(flowParams.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); - log.info("流程监听器流程状态:{}", flowParams.getFlowStatus()); - } - List flowTasks = iFlwTaskService.selectByInstId(instance.getId()); - if (CollUtil.isEmpty(flowTasks)) { - // 若流程已结束,更新状态为已完成并发送完成事件 - flwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - publishProcessEvent(BusinessStatusEnum.FINISH.getStatus(), definition.getFlowCode(), instance.getBusinessId()); - log.info("流程结束,流程状态:{}", BusinessStatusEnum.FINISH.getStatus()); + if (StringUtils.isNotBlank(instance.getFlowStatus()) && BusinessStatusEnum.initialState(instance.getFlowStatus())) { + publishProcessEvent(instance.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); + log.info("流程监听器流程状态:{}", instance.getFlowStatus()); + } else { + List flowTasks = iFlwTaskService.selectByInstId(instance.getId()); + if (CollUtil.isEmpty(flowTasks)) { + // 若流程已结束,更新状态为已完成并发送完成事件 + flwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); + publishProcessEvent(BusinessStatusEnum.FINISH.getStatus(), definition.getFlowCode(), instance.getBusinessId()); + log.info("流程结束,流程状态:{}", BusinessStatusEnum.FINISH.getStatus()); + } } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 1be0f9c9c..338bd3056 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -6,6 +6,7 @@ import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; @@ -140,4 +141,12 @@ public interface IFlwInstanceService { * @return 结果 */ List selectByTaskIdList(List taskIdList); + + /** + * 作废流程 + * + * @param bo 参数 + * @return 结果 + */ + boolean processInvalid(FlowInvalidBo bo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 6d579bb8f..ad754e07b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -39,6 +39,7 @@ import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.domain.vo.VariableVo; @@ -363,4 +364,28 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } return Collections.emptyList(); } + + /** + * 作废流程 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean processInvalid(FlowInvalidBo bo) { + try { + List flowTaskList = flwTaskService.selectByInstId(bo.getId()); + for (FlowTask flowTask : flowTaskList) { + FlowParams flowParams = new FlowParams(); + flowParams.message(bo.getComment()); + flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus()) + .hisStatus(TaskStatusEnum.INVALID.getStatus()); + taskService.termination(flowTask.getId(), flowParams); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index e234ba055..7806cffc3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -400,7 +400,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { @Transactional(rollbackFor = Exception.class) public boolean terminationTask(FlowTerminationBo bo) { try { - //流程定义 FlowParams flowParams = new FlowParams(); flowParams.message(bo.getComment()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) From 1723a631382eb9ad34d19ebe7181d94941ae128d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 8 Dec 2024 15:36:55 +0800 Subject: [PATCH 123/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B7=B2?= =?UTF-8?q?=E5=8A=9E=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwInstanceServiceImpl.java | 1 + .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 1 + 2 files changed, 2 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index ad754e07b..0549c36cc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -220,6 +220,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } } wrapper.eq(FlowInstance::getCreateBy, LoginHelper.getUserIdStr()); + wrapper.orderByDesc(FlowInstance::getCreateTime); Page page = flowInstanceMapper.selectPage(pageQuery.build(), wrapper); TableDataInfo build = TableDataInfo.build(); List flowInstanceVos = BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 7806cffc3..497973031 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -275,6 +275,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); + queryWrapper.orderByDesc("t.create_time").orderByDesc("t.update_time"); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } From 11caba88320109b3ac7af5852ae78c5cf54b0fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 9 Dec 2024 23:29:54 +0800 Subject: [PATCH 124/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AF=B7=E6=B1=82=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 18 ++++----- .../controller/FlwInstanceController.java | 40 +++++++++---------- .../controller/FlwTaskController.java | 40 +++++++++---------- .../WfDefinitionConfigController.java | 27 +++++++------ .../service/IFlwDefinitionService.java | 2 +- .../workflow/service/IFlwInstanceService.java | 10 ++--- .../workflow/service/IFlwTaskService.java | 12 +++--- .../impl/FlwDefinitionServiceImpl.java | 2 +- .../service/impl/FlwInstanceServiceImpl.java | 10 ++--- .../service/impl/FlwTaskServiceImpl.java | 12 +++--- 10 files changed, 87 insertions(+), 86 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 0d802d3c5..8178b9604 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -129,9 +129,9 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id */ @Log(title = "流程定义", businessType = BusinessType.INSERT) - @PostMapping("/copyDef/{id}") + @PostMapping("/copy/{id}") @Transactional(rollbackFor = Exception.class) - public R copyDef(@PathVariable Long id) { + public R copy(@PathVariable Long id) { return R.ok(defService.copyDef(id)); } @@ -141,9 +141,9 @@ public class FlwDefinitionController extends BaseController { * @param file 文件 */ @Log(title = "流程定义", businessType = BusinessType.IMPORT) - @PostMapping("/importDefinition") + @PostMapping("/importDef") @Transactional(rollbackFor = Exception.class) - public R importDefinition(MultipartFile file) { + public R importDef(MultipartFile file) { return R.ok(iFlwDefinitionService.importXml(file)); } @@ -155,9 +155,9 @@ public class FlwDefinitionController extends BaseController { * @throws IOException 异常 */ @Log(title = "流程定义", businessType = BusinessType.EXPORT) - @PostMapping("/exportDefinition/{id}") - public void exportDefinition(@PathVariable Long id, HttpServletResponse response) throws IOException { - iFlwDefinitionService.exportDefinition(id, response); + @PostMapping("/exportDef/{id}") + public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException { + iFlwDefinitionService.exportDef(id, response); } /** @@ -176,8 +176,8 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id * @param active 激活/挂起 */ - @PutMapping("/updateDefinitionState/{id}/{active}") - public R active(@PathVariable Long id, @PathVariable boolean active) { + @PutMapping("/active/{id}") + public R active(@PathVariable Long id, @RequestParam boolean active) { return R.ok(active ? defService.unActive(id) : defService.active(id)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index c2349ff99..91bb4e0cc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -29,7 +29,7 @@ import java.util.Map; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/workflow/processInstance") +@RequestMapping("/workflow/instance") public class FlwInstanceController extends BaseController { private final IFlwInstanceService flwInstanceService; @@ -41,9 +41,9 @@ public class FlwInstanceController extends BaseController { * @param instance 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByRunning") - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { - return flwInstanceService.getPageByRunning(instance, pageQuery); + @GetMapping("/pageByRunning") + public TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery) { + return flwInstanceService.pageByRunning(instance, pageQuery); } /** @@ -52,9 +52,9 @@ public class FlwInstanceController extends BaseController { * @param instance 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByFinish") - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { - return flwInstanceService.getPageByFinish(instance, pageQuery); + @GetMapping("/pageByFinish") + public TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery) { + return flwInstanceService.pageByFinish(instance, pageQuery); } /** @@ -93,8 +93,8 @@ public class FlwInstanceController extends BaseController { * @param id 流程定义id * @param active 激活/挂起 */ - @PutMapping("/active/{id}/{active}") - public R active(@PathVariable Long id, @PathVariable boolean active) { + @PutMapping("/active/{id}") + public R active(@PathVariable Long id, @RequestParam boolean active) { if (active) { return R.ok(insService.unActive(id)); } else { @@ -109,9 +109,9 @@ public class FlwInstanceController extends BaseController { * @param flowInstanceBo 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByCurrent") - public TableDataInfo getPageByCurrent(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - return flwInstanceService.getPageByCurrent(flowInstanceBo, pageQuery); + @GetMapping("/pageByCurrent") + public TableDataInfo pageByCurrent(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.pageByCurrent(flowInstanceBo, pageQuery); } @@ -120,9 +120,9 @@ public class FlwInstanceController extends BaseController { * * @param businessId 业务id */ - @GetMapping("/getFlowImage/{businessId}") - public R> getFlowImage(@PathVariable String businessId) { - return R.ok(flwInstanceService.getFlowImage(businessId)); + @GetMapping("/flowImage/{businessId}") + public R> flowImage(@PathVariable String businessId) { + return R.ok(flwInstanceService.flowImage(businessId)); } /** @@ -130,9 +130,9 @@ public class FlwInstanceController extends BaseController { * * @param instanceId 流程实例id */ - @GetMapping("/getInstanceVariable/{instanceId}") - public R> getInstanceVariable(@PathVariable String instanceId) { - return R.ok(flwInstanceService.getInstanceVariable(instanceId)); + @GetMapping("/instanceVariable/{instanceId}") + public R> instanceVariable(@PathVariable String instanceId) { + return R.ok(flwInstanceService.instanceVariable(instanceId)); } /** @@ -142,8 +142,8 @@ public class FlwInstanceController extends BaseController { */ @Log(title = "流程实例管理", businessType = BusinessType.INSERT) @RepeatSubmit() - @PostMapping("/processInvalid") - public R processInvalid(@Validated @RequestBody FlowInvalidBo bo) { + @PostMapping("/invalid") + public R invalid(@Validated @RequestBody FlowInvalidBo bo) { return R.ok(flwInstanceService.processInvalid(bo)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 1f2029a53..70c1a5820 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -69,9 +69,9 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByTaskWait") - public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - return flwTaskService.getPageByTaskWait(flowTaskBo, pageQuery); + @GetMapping("/pageByTaskWait") + public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskWait(flowTaskBo, pageQuery); } /** @@ -81,9 +81,9 @@ public class FlwTaskController extends BaseController { * @param pageQuery 分页 */ - @GetMapping("/getPageByTaskFinish") - public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - return flwTaskService.getPageByTaskFinish(flowTaskBo, pageQuery); + @GetMapping("/pageByTaskFinish") + public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskFinish(flowTaskBo, pageQuery); } /** @@ -92,9 +92,9 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByAllTaskWait") - public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - return flwTaskService.getPageByAllTaskWait(flowTaskBo, pageQuery); + @GetMapping("/pageByAllTaskWait") + public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery); } /** @@ -104,9 +104,9 @@ public class FlwTaskController extends BaseController { * @param pageQuery 分页 */ - @GetMapping("/getPageByAllTaskFinish") - public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - return flwTaskService.getPageByAllTaskFinish(flowTaskBo, pageQuery); + @GetMapping("/pageByAllTaskFinish") + public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery); } /** @@ -115,9 +115,9 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ - @GetMapping("/getPageByTaskCopy") - public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - return flwTaskService.getPageByTaskCopy(flowTaskBo, pageQuery); + @GetMapping("/pageByTaskCopy") + public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskCopy(flowTaskBo, pageQuery); } /** @@ -125,8 +125,8 @@ public class FlwTaskController extends BaseController { * * @param taskId 任务id */ - @GetMapping("/getTaskById/{taskId}") - public R getTaskById(@PathVariable Long taskId) { + @GetMapping("/getTask/{taskId}") + public R getTask(@PathVariable Long taskId) { return R.ok(flwTaskService.selectById(taskId)); } @@ -195,9 +195,9 @@ public class FlwTaskController extends BaseController { * * @param taskId 任务id */ - @GetMapping("/getUserListTaskId/{taskId}") - public R> getUserListTaskId(@PathVariable Long taskId) { - return R.ok(flwTaskService.getUserListTaskId(taskId)); + @GetMapping("/currentTaskAllUser/{taskId}") + public R> currentTaskAllUser(@PathVariable Long taskId) { + return R.ok(flwTaskService.currentTaskAllUser(taskId)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java index 176aba2e4..928935a95 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java @@ -1,20 +1,21 @@ package org.dromara.workflow.controller; -import java.util.List; - +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; -import jakarta.validation.constraints.*; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 流程定义配置 @@ -25,7 +26,7 @@ import org.dromara.workflow.service.IWfDefinitionConfigService; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/workflow/definitionConfig") +@RequestMapping("/workflow/defConfig") public class WfDefinitionConfigController extends BaseController { private final IWfDefinitionConfigService wfDefinitionConfigService; @@ -70,9 +71,9 @@ public class WfDefinitionConfigController extends BaseController { * @param tableName 表名 * @param definitionId 流程定义id */ - @GetMapping("/getByTableNameNotDefId/{tableName}/{definitionId}") - public R> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @PathVariable String tableName, - @NotBlank(message = "流程定义ID不能为空") @PathVariable String definitionId) { + @GetMapping("/getByTableNameNotDefId") + public R> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @RequestParam String tableName, + @NotBlank(message = "流程定义ID不能为空") @RequestParam String definitionId) { return R.ok(wfDefinitionConfigService.getByTableNameNotDefId(tableName, definitionId)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index fb4c1d27e..7386db256 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -40,7 +40,7 @@ public interface IFlwDefinitionService { * @param response 响应 * @throws IOException 异常 */ - void exportDefinition(Long id, HttpServletResponse response) throws IOException; + void exportDef(Long id, HttpServletResponse response) throws IOException; /** * 导入流程定义 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 338bd3056..f3834bf02 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -26,7 +26,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); + TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery); /** * 分页查询已结束的流程实例 @@ -35,7 +35,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); + TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery); /** * 按照业务id查询流程实例 @@ -92,7 +92,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery); + TableDataInfo pageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery); /** * 获取流程图,流程记录 @@ -100,7 +100,7 @@ public interface IFlwInstanceService { * @param businessId 业务id * @return 结果 */ - Map getFlowImage(String businessId); + Map flowImage(String businessId); /** * 按照实例id更新状态 @@ -116,7 +116,7 @@ public interface IFlwInstanceService { * @param instanceId 实例id * @return 结果 */ - Map getInstanceVariable(String instanceId); + Map instanceVariable(String instanceId); /** * 设置流程变量 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 6d738d39d..ba0436a44 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -43,7 +43,7 @@ public interface IFlwTaskService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); + TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); /** * 查询当前租户所有待办任务 @@ -52,7 +52,7 @@ public interface IFlwTaskService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); /** @@ -62,7 +62,7 @@ public interface IFlwTaskService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); + TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); /** * 查询已办任务 @@ -71,7 +71,7 @@ public interface IFlwTaskService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); /** * 查询当前用户的抄送 @@ -80,7 +80,7 @@ public interface IFlwTaskService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery); + TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery); /** * 修改任务办理人 @@ -178,5 +178,5 @@ public interface IFlwTaskService { * @param taskId 任务id * @return 结果 */ - List getUserListTaskId(Long taskId); + List currentTaskAllUser(Long taskId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index d40059aae..f6e78afe1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -101,7 +101,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { * @throws IOException 异常 */ @Override - public void exportDefinition(Long id, HttpServletResponse response) throws IOException { + public void exportDef(Long id, HttpServletResponse response) throws IOException { Document document = defService.exportXml(id); // 设置生成xml的格式 OutputFormat of = OutputFormat.createPrettyPrint(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 0549c36cc..ac7a87f15 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -80,7 +80,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + public TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("t.flow_status", BusinessStatusEnum.runningStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); @@ -97,7 +97,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + public TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("t.flow_status", BusinessStatusEnum.finishStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); @@ -209,7 +209,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery) { + public TableDataInfo pageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); if (StringUtils.isNotBlank(instanceBo.getFlowCode())) { List flowDefinitions = flowDefinitionMapper.selectList( @@ -248,7 +248,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param businessId 业务id */ @Override - public Map getFlowImage(String businessId) { + public Map flowImage(String businessId) { Map map = new HashMap<>(16); FlowInstance flowInstance = selectInstByBusinessId(businessId); if (flowInstance == null) { @@ -290,7 +290,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param instanceId 实例id */ @Override - public Map getInstanceVariable(String instanceId) { + public Map instanceVariable(String instanceId) { Map map = new HashMap<>(); FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); Map variableMap = flowInstance.getVariableMap(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 497973031..9e3d907e8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -255,7 +255,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); @@ -271,7 +271,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); @@ -287,7 +287,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); @@ -301,7 +301,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); @@ -314,7 +314,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); @@ -646,7 +646,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param taskId 任务id */ @Override - public List getUserListTaskId(Long taskId) { + public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 List associatedUsers = userService.getByAssociateds(Collections.singletonList(taskId)); if (CollUtil.isEmpty(associatedUsers)) { From 38670077ea36a24dca767cd130e9592a7cbd4f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 9 Dec 2024 23:56:11 +0800 Subject: [PATCH 125/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 4 +- .../service/impl/TestLeaveServiceImpl.java | 5 +- .../service/impl/WfCategoryServiceImpl.java | 5 +- .../dromara/workflow/utils/WorkDaysUtils.java | 248 ------------------ .../mapper/workflow/FlwInstanceMapper.xml | 42 +-- 5 files changed, 28 insertions(+), 276 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index ac7a87f15..3ebef57bc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -82,7 +82,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("t.flow_status", BusinessStatusEnum.runningStatus()); + queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -99,7 +99,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("t.flow_status", BusinessStatusEnum.finishStatus()); + queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 859aeaa42..72a30c10f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -21,7 +22,6 @@ import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; import org.dromara.workflow.mapper.TestLeaveMapper; import org.dromara.workflow.service.ITestLeaveService; -import org.dromara.workflow.utils.WorkDaysUtils; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -84,7 +84,8 @@ public class TestLeaveServiceImpl implements ITestLeaveService { */ @Override public TestLeaveVo insertByBo(TestLeaveBo bo) { - bo.setLeaveDays(WorkDaysUtils.calculateWorkDays(bo.getStartDate(), bo.getEndDate())); + long day = DateUtil.betweenDay(bo.getStartDate(), bo.getEndDate(), true); + bo.setLeaveDays((int) day); TestLeave add = MapstructUtils.convert(bo, TestLeave.class); if (StringUtils.isBlank(add.getStatus())) { add.setStatus(FlowStatus.TOBESUBMIT.getKey()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index 2470a2d23..9e7acbb86 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -75,7 +75,6 @@ public class WfCategoryServiceImpl implements IWfCategoryService { public Boolean updateByBo(WfCategoryBo bo) { WfCategory update = MapstructUtils.convert(bo, WfCategory.class); validEntityBeforeSave(update); - WfCategoryVo wfCategoryVo = baseMapper.selectVoById(bo.getId()); return baseMapper.updateById(update) > 0; } @@ -83,7 +82,7 @@ public class WfCategoryServiceImpl implements IWfCategoryService { * 保存前的数据校验 */ private void validEntityBeforeSave(WfCategory entity) { - //TODO 做一些数据校验,如唯一约束 + // 做一些数据校验,如唯一约束 } /** @@ -92,7 +91,7 @@ public class WfCategoryServiceImpl implements IWfCategoryService { @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 + // 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java deleted file mode 100644 index f038830da..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkDaysUtils.java +++ /dev/null @@ -1,248 +0,0 @@ -package org.dromara.workflow.utils; - -import cn.hutool.core.util.ArrayUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.*; - -/** - * 工作日工具类 - * - * @author AprilWind - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WorkDaysUtils { - - private static final Map DAYS_IN_YEARS = new HashMap<>(); - - /** - * 工作日 - */ - public static final int WORKDAY = 0; - - /** - * 休息日 - */ - public static final int RESTDAY = 1; - - /** - * 根据开始日期和工作日数计算截止日期 - * - * @param startDate 开始日期 - * @param workDays 工作日数 - * @return 截止日期 - */ - public static Date calculateEndDate(Date startDate, int workDays) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(startDate); - // 获取开始日期的年份 - int startYear = getYear(startDate); - //开始日期年份天 - Integer[] daysArray = daysInYear(startYear); - int startIndex = getDayOfYearIndex(startDate); - int endIndex = startIndex; - // 循环找到指定的工作日数 - while (workDays > 0) { - // 检查当前日期是否是工作日 - if (daysArray[endIndex] == WORKDAY) { - workDays--; - } - // 结束条件:工作日数为零 - if (workDays <= 0) { - break; - } - // 移动到下一天 - endIndex++; - // 如果移动到下一年 - if (endIndex >= daysArray.length) { - startYear++; - daysArray = daysInYear(startYear); - endIndex = 0; - // 更新年份 - calendar.set(Calendar.YEAR, startYear); - } - } - // 设置截止日期 - calendar.set(Calendar.DAY_OF_YEAR, endIndex + 1); - return calendar.getTime(); - } - - /** - * 计算两个日期之间的工作日天数 - * - * @param start 开始日期 - * @param end 结束日期 - * @return 实际工作日天数 - */ - public static int calculateWorkDays(Date start, Date end) { - if (start.after(end)) { - throw new IllegalArgumentException("开始日期不能晚于结束日期"); - } - int workDays = 0; - - // 获取开始和结束日期的年份 - int startYear = getYear(start); - int endYear = getYear(end); - - // 如果在同一年 - if (startYear == endYear) { - //开始日期年份天 - Integer[] daysArray = daysInYear(startYear); - for (int i = getDayOfYearIndex(start); i <= getDayOfYearIndex(end); i++) { - if (daysArray[i] == WORKDAY) { - workDays++; - } - } - } else {//跨年 - // 处理开始年份 - Integer[] startYearDaysArray = daysInYear(startYear); - int startIndex = getDayOfYearIndex(start); - for (int i = startIndex; i < startYearDaysArray.length; i++) { - if (startYearDaysArray[i] == WORKDAY) { - workDays++; - } - } - - // 处理结束年份 - Integer[] endYearDaysArray = daysInYear(endYear); - int endIndex = getDayOfYearIndex(end); - for (int i = 0; i <= endIndex; i++) { - if (endYearDaysArray[i] == WORKDAY) { - workDays++; - } - } - - // 处理中间的完整年份 - for (int year = startYear + 1; year < endYear; year++) { - Integer[] fullYearDaysArray = daysInYear(year); - for (Integer integer : fullYearDaysArray) { - if (integer == WORKDAY) { - workDays++; - } - } - } - } - return workDays; - } - - /** - * 计算指定年份的工作日数组,标记个人的加班和调休日期 - * - * @param year 指定年份 - * @param overtime 个人加班日期列表 - * @param adjustments 个人调休日期列表 - * @return 表示每一天状态的数组,0 表示工作日,1 表示休息日 - */ - public static Integer[] calculateWorkDays(Integer year, List overtime, List adjustments) { - //获取指定年份天数 - Integer[] daysArray = daysInYear(year); - //设置为工作日(假设用于标记补班的工作日) - updateDaysArray(daysArray, overtime, WORKDAY); - //设置为休息日(假设用于标记节假日) - updateDaysArray(daysArray, adjustments, RESTDAY); - return daysArray; - } - - /** - * 获取指定年份的天数数组。如果指定年份的数据不存在,则生成并缓存数据 - * - * @param year 指定年份 - * @return 表示一年中每一天的状态数组,0 表示工作日,1 表示周末 - */ - private static Integer[] daysInYear(Integer year) { - if (DAYS_IN_YEARS.containsKey(year)) { - return DAYS_IN_YEARS.get(year); - } else { - // 如果年份数据不存在,则生成指定年份的数据 - Integer[] daysArray = generateDaysArray(year); - DAYS_IN_YEARS.put(year, daysArray); - return daysArray; - } - } - - /** - * 根据指定年份生成天数数组 - * - * @param year 指定年份 - * @return 表示一年中每一天的状态数组 - */ - private static Integer[] generateDaysArray(int year) { - Calendar calendar = Calendar.getInstance(); - calendar.set(year, Calendar.JANUARY, 1); - - int daysInYear = getDaysInYear(year); - Integer[] daysArray = new Integer[daysInYear]; - - for (int i = 0; i < daysInYear; i++) { - int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); - daysArray[i] = (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) ? RESTDAY : WORKDAY; - calendar.add(Calendar.DAY_OF_MONTH, 1); - } - //设置为工作日(假设用于标记补班的工作日) - updateDaysArray(daysArray, Collections.emptyList(), WORKDAY); - //设置为休息日(假设用于标记节假日) - updateDaysArray(daysArray, Collections.emptyList(), RESTDAY); - return daysArray; - } - - /** - * 根据日期下标更新 daysArray,将对应下标的值改为指定值 - * - * @param daysArray 原始的天数数组 - * @param days 要修改的日期列表 - * @param valueToSet 休息日用 1,工作日用 0 - */ - private static void updateDaysArray(Integer[] daysArray, List days, int valueToSet) { - if (ArrayUtil.isEmpty(days)) { - return; - } - - // 遍历日期下标数组,将对应的 daysArray 元素设置为1 - for (Date holiday : days) { - int index = getDayOfYearIndex(holiday); - // 确保下标在有效范围内 - if (index >= 0 && index < daysArray.length) { - daysArray[index] = valueToSet; - } - } - } - - /** - * 获取日期在一年中的下标(天数) - * - * @param date 指定日期 - * @return 日期在该年份的下标(天数) - */ - private static int getDayOfYearIndex(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); - return dayOfYear - 1; - } - - /** - * 获取指定日期的年份 - * - * @param date 指定日期 - * @return 年份 - */ - private static int getYear(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - return calendar.get(Calendar.YEAR); - } - - /** - * 获取指定年份的天数 - * - * @param year 指定年份 - * @return 年份中的天数 - */ - private static int getDaysInYear(int year) { - Calendar calendar = Calendar.getInstance(); - calendar.set(year, Calendar.DECEMBER, 31); - return calendar.get(Calendar.DAY_OF_YEAR); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 1609fa826..036ce8e38 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -23,27 +23,27 @@ From a5ed5083ebc7ee9d1334d0acc3614a5ece41da1e Mon Sep 17 00:00:00 2001 From: dhb52 Date: Wed, 11 Dec 2024 16:45:11 +0800 Subject: [PATCH 126/227] =?UTF-8?q?fix=20FlwInstanceMapper=20xml=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/workflow/FlwInstanceMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 036ce8e38..a7f7a7022 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -42,7 +42,7 @@ fd.flow_code, fd.version from flow_instance fi - left join flow_definition fd on fi.definition_id = fd.id where fi.del_flag = '0' + left join flow_definition fd on fi.definition_id = fd.id and fi.del_flag = '0' ${ew.getCustomSqlSegment} From 4354d257e69236076c6c86463e2871415b1a5f0c Mon Sep 17 00:00:00 2001 From: dhb52 Date: Wed, 11 Dec 2024 18:30:41 +0800 Subject: [PATCH 127/227] =?UTF-8?q?style=20workflow=20xml=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/workflow/FlwDefMapper.xml | 24 ++-- .../mapper/workflow/FlwTaskMapper.xml | 110 ++++++++++-------- 2 files changed, 73 insertions(+), 61 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index 565aee3d8..d95e737b6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -5,16 +5,20 @@ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index b91a1e7e2..be7ccc31d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -47,35 +47,37 @@ + @@ -106,32 +108,38 @@ c.flow_code, c.version from flow_his_task a - left join flow_instance b on a.instance_id = b.id - left join flow_definition c on a.definition_id = c.id where - a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' and a.node_type in ('1','3','4') - ) t ${ew.getCustomSqlSegment} + left join flow_instance b on a.instance_id = b.id + left join flow_definition c on a.definition_id = c.id + where a.del_flag ='0' + and b.del_flag = '0' + and c.del_flag = '0' + and a.node_type in ('1','3','4') + ) t + ${ew.getCustomSqlSegment} From 189845dc4ac4f5b7b9ae3108508f29145d9113f1 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 12 Dec 2024 09:10:14 +0800 Subject: [PATCH 128/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=BF=80?= =?UTF-8?q?=E6=B4=BB/=E6=8C=82=E8=B5=B7=E5=8F=96=E5=8F=8D=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 2 +- .../workflow/controller/FlwInstanceController.java | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 8178b9604..2030f280c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -178,7 +178,7 @@ public class FlwDefinitionController extends BaseController { */ @PutMapping("/active/{id}") public R active(@PathVariable Long id, @RequestParam boolean active) { - return R.ok(active ? defService.unActive(id) : defService.active(id)); + return R.ok(active ? defService.active(id) : defService.unActive(id)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 91bb4e0cc..d446bae9e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -31,7 +31,6 @@ import java.util.Map; @RestController @RequestMapping("/workflow/instance") public class FlwInstanceController extends BaseController { - private final IFlwInstanceService flwInstanceService; private final InsService insService; @@ -88,21 +87,16 @@ public class FlwInstanceController extends BaseController { } /** - * 激活/挂起流程定义 + * 激活/挂起流程实例 * - * @param id 流程定义id + * @param id 流程实例id * @param active 激活/挂起 */ @PutMapping("/active/{id}") public R active(@PathVariable Long id, @RequestParam boolean active) { - if (active) { - return R.ok(insService.unActive(id)); - } else { - return R.ok(insService.active(id)); - } + return R.ok(active ? insService.active(id) : insService.unActive(id)); } - /** * 获取当前登陆人发起的流程实例 * @@ -114,7 +108,6 @@ public class FlwInstanceController extends BaseController { return flwInstanceService.pageByCurrent(flowInstanceBo, pageQuery); } - /** * 获取流程图,流程记录 * From cd518853687c1e9098440eb68073ea2fc0ed4bd7 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 12 Dec 2024 09:24:35 +0800 Subject: [PATCH 129/227] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=BC=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/controller/FlwTaskController.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 70c1a5820..7c430788f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -11,8 +11,6 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.HisTask; -import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.TaskService; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -35,8 +33,6 @@ import java.util.Map; public class FlwTaskController extends BaseController { private final IFlwTaskService flwTaskService; - private final TaskService taskService; - private final InsService insService; /** * 启动任务 From a7d55420accc0661371f93090742070a410b3900 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 12 Dec 2024 11:29:22 +0800 Subject: [PATCH 130/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E4=BB=BB=E5=8A=A1=E5=8A=9E=E7=90=86=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/WorkflowGlobalListener.java | 85 +++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 99297d009..79a2ed11d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -28,27 +28,80 @@ import java.util.List; @RequiredArgsConstructor public class WorkflowGlobalListener implements GlobalListener { - private final IFlwTaskService iFlwTaskService; - private final IFlwInstanceService flwInstanceService; + private final IFlwTaskService taskService; + private final IFlwInstanceService instanceService; + /** + * 创建监听器,任务创建时执行 + * + * @param listenerVariable 监听器变量 + */ + @Override + public void create(ListenerVariable listenerVariable) { + } + + /** + * 开始监听器,任务开始办理时执行 + * + * @param listenerVariable 监听器变量 + */ + @Override + public void start(ListenerVariable listenerVariable) { + } + + /** + * 分派监听器,动态修改代办任务信息 + * + * @param listenerVariable 监听器变量 + */ + @Override + public void assignment(ListenerVariable listenerVariable) { + } + + /** + * 完成监听器,当前任务完成后执行 + * + * @param listenerVariable 监听器变量 + */ @Override public void finish(ListenerVariable listenerVariable) { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); - //撤销,退回,作废,终止发送事件 - if (StringUtils.isNotBlank(instance.getFlowStatus()) && BusinessStatusEnum.initialState(instance.getFlowStatus())) { - publishProcessEvent(instance.getFlowStatus(), definition.getFlowCode(), instance.getBusinessId()); - log.info("流程监听器流程状态:{}", instance.getFlowStatus()); - } else { - List flowTasks = iFlwTaskService.selectByInstId(instance.getId()); - if (CollUtil.isEmpty(flowTasks)) { - // 若流程已结束,更新状态为已完成并发送完成事件 - flwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - publishProcessEvent(BusinessStatusEnum.FINISH.getStatus(), definition.getFlowCode(), instance.getBusinessId()); - log.info("流程结束,流程状态:{}", BusinessStatusEnum.FINISH.getStatus()); - } - } + String businessId = instance.getBusinessId(); + String instanceFlowStatus = instance.getFlowStatus(); + // 判断流程状态 + String status = determineFlowStatus(instance, instanceFlowStatus); + if (StringUtils.isNotBlank(status)) { + // 如果流程状态有效,发布事件 + publishProcessEvent(status, definition.getFlowCode(), businessId); + } + } + + /** + * 根据流程实例和当前流程状态确定最终状态 + * + * @param instance 流程实例 + * @param instanceFlowStatus 流程实例当前状态 + * @return 流程最终状态 + */ + private String determineFlowStatus(Instance instance, String instanceFlowStatus) { + if (StringUtils.isNotBlank(instanceFlowStatus) && BusinessStatusEnum.initialState(instanceFlowStatus)) { + log.info("流程实例当前状态: {}", instanceFlowStatus); + return instanceFlowStatus; + } else { + Long instanceId = instance.getId(); + List flowTasks = taskService.selectByInstId(instanceId); + if (CollUtil.isEmpty(flowTasks)) { + String status = BusinessStatusEnum.FINISH.getStatus(); + // 更新流程状态为已完成 + instanceService.updateStatus(instanceId, status); + log.info("流程已结束,状态更新为: {}", status); + return status; + } + log.warn("流程未结束,实例ID: {}", instanceId); + return null; + } } /** @@ -59,6 +112,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @param businessId 业务id */ private void publishProcessEvent(String status, String flowCode, String businessId) { + log.info("发布流程事件,流程状态: {}, 流程编码: {}, 业务ID: {}", status, flowCode, businessId); ProcessEvent processEvent = new ProcessEvent(); processEvent.setStatus(status); processEvent.setSubmit(false); @@ -66,4 +120,5 @@ public class WorkflowGlobalListener implements GlobalListener { processEvent.setBusinessKey(businessId); SpringUtils.context().publishEvent(processEvent); } + } From 5f071c85317511d635cd0a94995d1bf3b3a92140 Mon Sep 17 00:00:00 2001 From: liyang Date: Thu, 12 Dec 2024 12:27:22 +0800 Subject: [PATCH 131/227] =?UTF-8?q?[add]=20=E5=A2=9E=E5=8A=A0=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E4=BA=BA=E5=8F=8A=E7=94=B3=E8=AF=B7=E4=BA=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=20[fix]=20=E4=BF=AE=E5=A4=8D=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E4=B8=AD=E3=80=81=E5=B7=B2=E5=AE=8C=E6=88=90=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E6=9F=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwInstanceController.java | 13 ++++++------- .../workflow/domain/bo/FlowInstanceBo.java | 11 +++++++++++ .../dromara/workflow/domain/bo/FlowTaskBo.java | 4 ++++ .../workflow/domain/vo/FlowHisTaskVo.java | 5 ++++- .../workflow/domain/vo/FlowInstanceVo.java | 4 ++++ .../dromara/workflow/domain/vo/FlowTaskVo.java | 8 ++++++++ .../workflow/service/IFlwInstanceService.java | 5 ++--- .../service/impl/FlwInstanceServiceImpl.java | 16 ++++++++++++---- .../service/impl/FlwTaskServiceImpl.java | 3 ++- .../mapper/workflow/FlwInstanceMapper.xml | 13 ++++++++++--- .../resources/mapper/workflow/FlwTaskMapper.xml | 13 +++++++++++-- 11 files changed, 74 insertions(+), 21 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index d446bae9e..2f58baf1d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -8,7 +8,6 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; -import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.service.InsService; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; @@ -37,23 +36,23 @@ public class FlwInstanceController extends BaseController { /** * 分页查询正在运行的流程实例 * - * @param instance 参数 + * @param flowInstanceBo 参数 * @param pageQuery 分页 */ @GetMapping("/pageByRunning") - public TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery) { - return flwInstanceService.pageByRunning(instance, pageQuery); + public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.pageByRunning(flowInstanceBo, pageQuery); } /** * 分页查询已结束的流程实例 * - * @param instance 参数 + * @param flowInstanceBo 参数 * @param pageQuery 分页 */ @GetMapping("/pageByFinish") - public TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery) { - return flwInstanceService.pageByFinish(instance, pageQuery); + public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.pageByFinish(flowInstanceBo, pageQuery); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index 6d59292f3..7bbee5439 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -40,4 +40,15 @@ public class FlowInstanceBo implements Serializable { * 模型分类 */ private String categoryCode; + + /** + * 任务名称 + */ + private String nodeName; + + + /** + * 申请人 + */ + private String nickName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 66dc70a61..e6e072029 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -41,4 +41,8 @@ public class FlowTaskBo implements Serializable { * 权限列表 */ private List permissionList; + /** + * 申请人 + */ + private String nickName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index e27f61eb7..d2a2ef92b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -223,5 +223,8 @@ public class FlowHisTaskVo implements Serializable { this.cooperateType = cooperateType; this.cooperateTypeName = CooperateType.getValueByKey(cooperateType); } - + /** + * 创建者昵称 + */ + private String nickName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index a8a85fb51..4a05b36b0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -113,4 +113,8 @@ public class FlowInstanceVo { * 流程定义版本 */ private String version; + /** + * 创建者昵称 + */ + private String nickName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index e60cd0b54..75407b3ad 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -140,4 +140,12 @@ public class FlowTaskVo implements Serializable { * 流程签署比例值 大于0为票签,会签 */ private BigDecimal nodeRatio; + /** + * 创建者 + */ + private String createBy; + /** + * 创建者昵称 + */ + private String nickName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index f3834bf02..3022745cb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -2,7 +2,6 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; @@ -26,7 +25,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery); + TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); /** * 分页查询已结束的流程实例 @@ -35,7 +34,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery); + TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); /** * 按照业务id查询流程实例 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 3ebef57bc..dfb60f778 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -76,13 +76,17 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询正在运行的流程实例 * - * @param instance 参数 + * @param flowInstanceBo 参数 * @param pageQuery 分页 */ @Override - public TableDataInfo pageByRunning(Instance instance, PageQuery pageQuery) { + public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNickName()), "su.nick_name", flowInstanceBo.getNickName()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -93,13 +97,17 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询已结束的流程实例 * - * @param instance 参数 + * @param flowInstanceBo 参数 * @param pageQuery 分页 */ @Override - public TableDataInfo pageByFinish(Instance instance, PageQuery pageQuery) { + public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNickName()), "su.nick_name", flowInstanceBo.getNickName()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 9e3d907e8..9ac5ee5f4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -325,7 +325,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { QueryWrapper wrapper = Wrappers.query(); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); - wrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNickName()), "t.nick_name", flowTaskBo.getNickName()); wrapper.orderByDesc("t.create_time"); return wrapper; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index a7f7a7022..47782d717 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -21,6 +21,8 @@ + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index be7ccc31d..6c113a83e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -21,6 +21,8 @@ + + @@ -68,14 +70,17 @@ d.form_path, d.version, uu.processed_by, - uu.type + uu.type, + su.nick_name from flow_task as t left join flow_user uu on uu.associated = t.id left join flow_definition d on t.definition_id = d.id left join flow_instance i on t.instance_id = i.id + left join sys_user su on i.create_by = su.user_id where t.node_type = 1 and t.del_flag = '0' and uu.del_flag = '0' + and su.del_flag ='0' and uu.type in ('1','2','3') ) t ${ew.getCustomSqlSegment} @@ -106,13 +111,17 @@ c.form_path, c.flow_name, c.flow_code, - c.version + c.version, + b.create_by, + su.nick_name from flow_his_task a left join flow_instance b on a.instance_id = b.id left join flow_definition c on a.definition_id = c.id + left join sys_user su on b.create_by = su.user_id where a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' + and su.del_flag ='0' and a.node_type in ('1','3','4') ) t ${ew.getCustomSqlSegment} From 70ffb62b88b9021fb3ec3ee80fbd260336751231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 13 Dec 2024 00:15:30 +0800 Subject: [PATCH 132/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/mapper/SysDeptMapper.java | 12 ------------ .../main/resources/mapper/system/SysDeptMapper.xml | 11 ----------- 2 files changed, 23 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index b69624cf0..0f2c90667 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -3,7 +3,6 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; @@ -32,17 +31,6 @@ public interface SysDeptMapper extends BaseMapperPlus { }) List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - /** - * 分页查询部门管理数据 - * - * @param queryWrapper 查询条件 - * @return 部门信息集合 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - }) - Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - /** * 统计指定部门ID的部门数量 * diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 9057a0e22..6ad866f29 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -18,17 +18,6 @@ from sys_dept ${ew.getCustomSqlSegment} - - From e4ea8a0012a3e9d4471e5823730f6265c0590dbe Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 13 Dec 2024 09:54:49 +0800 Subject: [PATCH 133/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=86=E9=85=8D=E4=BA=BA=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/core/enums/BusinessStatusEnum.java | 1 + .../org/dromara/workflow/common}/enums/TaskAssigneeEnum.java | 2 +- .../org/dromara/workflow/handler/WorkflowPermissionHandler.java | 2 +- .../workflow/service/impl/WfTaskAssigneeServiceImpl.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename {ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common}/enums/TaskAssigneeEnum.java (98%) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 4365576df..2053bea47 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -40,6 +40,7 @@ public enum BusinessStatusEnum { * 已完成 */ FINISH("finish", "已完成"), + /** * 已作废 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java similarity index 98% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java index 88ee56679..60be92fe9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TaskAssigneeEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.enums; +package org.dromara.workflow.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index d06d22356..a58709a5f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.TaskAssigneeEnum; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.handler.PermissionHandler; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 8bd138f38..86dc12dc1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -9,7 +9,7 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.enums.FormatsType; -import org.dromara.common.core.enums.TaskAssigneeEnum; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.PostService; From 45ca34514f2b3f897059e192043f98f6391db017 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 13 Dec 2024 10:09:04 +0800 Subject: [PATCH 134/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E4=BA=BA=E7=BF=BB=E8=AF=91=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...mework.boot.autoconfigure.AutoConfiguration.imports | 1 - .../org/dromara/workflow}/service/AssigneeService.java | 2 +- .../workflow/service/impl/FlwTaskServiceImpl.java | 2 +- .../service}/impl/TaskAssigneeTranslationImpl.java | 10 ++++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) rename {ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow}/service/AssigneeService.java (93%) rename {ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service}/impl/TaskAssigneeTranslationImpl.java (76%) diff --git a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index d578b7370..ad40205ed 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,4 +4,3 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl -org.dromara.common.translation.core.impl.TaskAssigneeTranslationImpl diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java similarity index 93% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java index 62450d8c1..7753a3543 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.service; +package org.dromara.workflow.service; import org.dromara.common.core.domain.dto.UserDTO; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 9ac5ee5f4..3c14c1b9b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -12,7 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.AssigneeService; +import org.dromara.workflow.service.AssigneeService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java similarity index 76% rename from ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java index bb55f2028..ef2f53068 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java @@ -1,16 +1,22 @@ -package org.dromara.common.translation.core.impl; +package org.dromara.workflow.service.impl; import lombok.AllArgsConstructor; -import org.dromara.common.core.service.AssigneeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.core.TranslationInterface; +import org.dromara.workflow.service.AssigneeService; +import org.springframework.stereotype.Service; /** * 任务办理人翻译实现 * * @author AprilWind */ +@Slf4j +@RequiredArgsConstructor +@Service @AllArgsConstructor @TranslationType(type = TransConstant.TASK_ID_TO_ASSIGNEE) public class TaskAssigneeTranslationImpl implements TranslationInterface { From c681b50ae433cc413135e3477791a73df7775ed5 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 13 Dec 2024 10:14:20 +0800 Subject: [PATCH 135/227] =?UTF-8?q?update=20=E5=9B=9E=E9=80=80=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/mapper/SysDeptMapper.java | 12 ++++++++++++ .../main/resources/mapper/system/SysDeptMapper.xml | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 0f2c90667..b69624cf0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -3,6 +3,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; @@ -31,6 +32,17 @@ public interface SysDeptMapper extends BaseMapperPlus { }) List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 分页查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + }) + Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** * 统计指定部门ID的部门数量 * diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 6ad866f29..9057a0e22 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -18,6 +18,17 @@ from sys_dept ${ew.getCustomSqlSegment} + + From 79d0a536c9c69d303a949a7c212f3256787c8670 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 12:23:37 +0800 Subject: [PATCH 136/227] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E4=BA=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/FlowInstanceBo.java | 5 ++-- .../workflow/domain/bo/FlowTaskBo.java | 4 ++-- .../workflow/domain/vo/FlowHisTaskVo.java | 5 ++-- .../workflow/domain/vo/FlowInstanceVo.java | 7 ++++-- .../workflow/domain/vo/FlowTaskVo.java | 6 +++-- .../service/impl/FlwInstanceServiceImpl.java | 24 ++++++++++++------- .../service/impl/FlwTaskServiceImpl.java | 2 +- .../mapper/workflow/FlwInstanceMapper.xml | 6 +---- .../mapper/workflow/FlwTaskMapper.xml | 10 ++------ 9 files changed, 36 insertions(+), 33 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index 7bbee5439..79042eb6e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 流程实例请求对象 @@ -48,7 +49,7 @@ public class FlowInstanceBo implements Serializable { /** - * 申请人 + * 申请人Ids */ - private String nickName; + private List createByIds; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index e6e072029..904ef167e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -42,7 +42,7 @@ public class FlowTaskBo implements Serializable { */ private List permissionList; /** - * 申请人 + * 申请人Ids */ - private String nickName; + private List createByIds; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index d2a2ef92b..59fb8cb9f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -224,7 +224,8 @@ public class FlowHisTaskVo implements Serializable { this.cooperateTypeName = CooperateType.getValueByKey(cooperateType); } /** - * 创建者昵称 + * 申请人 */ - private String nickName; + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index 4a05b36b0..5d7587cad 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.vo; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.util.Date; @@ -114,7 +116,8 @@ public class FlowInstanceVo { */ private String version; /** - * 创建者昵称 + * 申请人 */ - private String nickName; + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 75407b3ad..aec63ed0e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -144,8 +144,10 @@ public class FlowTaskVo implements Serializable { * 创建者 */ private String createBy; + /** - * 创建者昵称 + * 申请人 */ - private String nickName; + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index dfb60f778..81fd3dab8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -81,12 +81,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNickName()), "su.nick_name", flowInstanceBo.getNickName()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -104,10 +100,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNickName()), "su.nick_name", flowInstanceBo.getNickName()); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -115,6 +107,20 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return build; } + /** + * 通用查询条件 + * @param flowInstanceBo 查询条件 + * @return 查询条件构造方法 + */ + private QueryWrapper buildQueryWrapper(FlowInstanceBo flowInstanceBo) { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); + queryWrapper.orderByDesc("fi.create_time"); + return queryWrapper; + } /** * 根据业务id查询流程实例 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 3c14c1b9b..8cbdefd07 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -326,7 +326,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); - wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNickName()), "t.nick_name", flowTaskBo.getNickName()); + wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()),"t.create_by",flowTaskBo.getCreateByIds()); wrapper.orderByDesc("t.create_time"); return wrapper; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 47782d717..7b5199974 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -22,7 +22,6 @@ - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 6c113a83e..f0683680c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -22,7 +22,6 @@ - @@ -71,16 +70,14 @@ d.version, uu.processed_by, uu.type, - su.nick_name + i.create_by from flow_task as t left join flow_user uu on uu.associated = t.id left join flow_definition d on t.definition_id = d.id left join flow_instance i on t.instance_id = i.id - left join sys_user su on i.create_by = su.user_id where t.node_type = 1 and t.del_flag = '0' and uu.del_flag = '0' - and su.del_flag ='0' and uu.type in ('1','2','3') ) t ${ew.getCustomSqlSegment} @@ -112,16 +109,13 @@ c.flow_name, c.flow_code, c.version, - b.create_by, - su.nick_name + b.create_by from flow_his_task a left join flow_instance b on a.instance_id = b.id left join flow_definition c on a.definition_id = c.id - left join sys_user su on b.create_by = su.user_id where a.del_flag ='0' and b.del_flag = '0' and c.del_flag = '0' - and su.del_flag ='0' and a.node_type in ('1','3','4') ) t ${ew.getCustomSqlSegment} From 88c6cf4480eca01b8d049c580a6f39071fc07949 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 16:36:20 +0800 Subject: [PATCH 137/227] =?UTF-8?q?=E5=8A=9E=E7=90=86=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/bo/CompleteTaskBo.java | 6 ++++++ .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 2 ++ .../workflow/service/impl/TaskAssigneeTranslationImpl.java | 2 -- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index b83942a71..b6d4cce1e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -54,6 +54,12 @@ public class CompleteTaskBo implements Serializable { */ private Map variables; + /** + * 扩展变量(此处为逗号分隔的ossId) + * @return + */ + private String ext; + public Map getVariables() { if (variables == null) { return new HashMap<>(16); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 8cbdefd07..9d9ecad0a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -165,6 +165,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); + + flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); return true; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java index ef2f53068..52d5fa4ff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java @@ -1,6 +1,5 @@ package org.dromara.workflow.service.impl; -import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.translation.annotation.TranslationType; @@ -17,7 +16,6 @@ import org.springframework.stereotype.Service; @Slf4j @RequiredArgsConstructor @Service -@AllArgsConstructor @TranslationType(type = TransConstant.TASK_ID_TO_ASSIGNEE) public class TaskAssigneeTranslationImpl implements TranslationInterface { From f5358eee6b2e886896d27feaf8be2b6ca7f3dd4d Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 18:14:40 +0800 Subject: [PATCH 138/227] =?UTF-8?q?[add]=201.=E5=B7=A5=E4=BD=9C=E6=B5=81sq?= =?UTF-8?q?l=E8=84=9A=E6=9C=AC=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=8A=B6=E6=80=81=202.=E5=B7=B2=E7=BB=93=E6=9D=9F=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E7=85=A7=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=80=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_workflow.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index b03e9a727..7882f24df 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -228,6 +228,7 @@ insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', ' INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表'); INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, '2024-12-01 14:32:07', 1, '2024-12-13 17:53:59', '任务状态'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已撤销'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate(), NULL, NULL, '草稿'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'待审核'); @@ -237,6 +238,18 @@ INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_valu INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL,NULL, '已终止'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'自定义表单'); INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'动态表单'); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:32:47', 1, '2024-12-01 14:32:55', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, '2024-12-01 14:33:07', 1, '2024-12-01 14:35:12', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:37:13', 1, '2024-12-01 14:37:13', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:37:52', 1, '2024-12-01 14:37:52', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:38:08', 1, '2024-12-01 14:38:08', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:38:24', 1, '2024-12-01 14:38:24', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:38:42', 1, '2024-12-01 14:38:42', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:13', 1, '2024-12-01 14:39:13', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:32', 1, '2024-12-01 14:39:37', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:55', 1, '2024-12-01 14:39:55', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:40:23', 1, '2024-12-01 14:40:23', ''); +INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:40:46', 1, '2024-12-01 14:40:46', ''); -- ---------------------------- -- 6、请假单信息 From effd8a92e90b0675c21b9fb91d95cca00a164160 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 18:19:37 +0800 Subject: [PATCH 139/227] =?UTF-8?q?[update]=201.=E5=B7=B2=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E6=B5=81=E7=A8=8B=E6=8C=89=E7=85=A7=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=80=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwInstanceServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 81fd3dab8..2c7c259ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -100,6 +100,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); + queryWrapper.orderByDesc("fi.create_time"); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); From 0a1d49fc32c013f5bc6553db1d7181d2aac20dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 13 Dec 2024 18:29:00 +0800 Subject: [PATCH 140/227] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=20=E5=B0=86?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=B0=81=E8=A3=85=E4=B8=BA=E5=8D=95=E7=8B=AC=E7=9A=84service?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DeptService.java | 10 -- .../common/core/service/PostService.java | 11 -- .../common/core/service/RoleService.java | 11 -- .../core/service/TaskAssigneeService.java | 47 +++++ .../common/core/service/UserService.java | 10 -- .../service/impl/SysDeptServiceImpl.java | 44 ----- .../service/impl/SysPostServiceImpl.java | 37 ---- .../service/impl/SysRoleServiceImpl.java | 31 ---- .../impl/SysTaskAssigneeServiceImpl.java | 168 ++++++++++++++++++ .../service/impl/SysUserServiceImpl.java | 39 +--- .../impl/WfTaskAssigneeServiceImpl.java | 19 +- 11 files changed, 227 insertions(+), 200 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java index c79c2e831..f93d1778a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -1,8 +1,6 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.DeptDTO; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import java.util.List; @@ -36,12 +34,4 @@ public interface DeptService { */ List selectDeptsByList(); - /** - * 查询部门并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery); - } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java index 6e4ead244..41d4e8308 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -1,8 +1,5 @@ package org.dromara.common.core.service; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; - /** * 通用 岗位服务 * @@ -10,12 +7,4 @@ import org.dromara.common.core.domain.model.TaskAssigneeBody; */ public interface PostService { - /** - * 查询岗位并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery); - } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java index f2307215f..ba62c82ae 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java @@ -1,8 +1,5 @@ package org.dromara.common.core.service; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; - /** * 通用 角色服务 * @@ -10,12 +7,4 @@ import org.dromara.common.core.domain.model.TaskAssigneeBody; */ public interface RoleService { - /** - * 查询角色并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery); - } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java new file mode 100644 index 000000000..cc976393b --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java @@ -0,0 +1,47 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; + +/** + * 工作流设计器获取任务执行人 + * + * @author Lion Li + */ +public interface TaskAssigneeService { + + /** + * 查询角色并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery); + + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery); + + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery); + + /** + * 查询用户并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 1914b3fff..67cd54fba 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -1,8 +1,6 @@ package org.dromara.common.core.service; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import java.util.List; @@ -93,12 +91,4 @@ public interface UserService { */ List selectUsersByPostIds(List postIds); - /** - * 查询用户并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery); - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 948a9c14e..0199ec719 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -8,17 +8,13 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.DeptDTO; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.utils.*; -import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.satoken.utils.LoginHelper; @@ -205,46 +201,6 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return BeanUtil.copyToList(list, DeptDTO.class); } - /** - * 查询部门并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - // 使用 LambdaQueryWrapper 构建查询条件 - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(SysDept::getDelFlag, SystemConstants.NORMAL); - wrapper.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()); - wrapper.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()); - if (StringUtils.isNotBlank(taskQuery.getGroupId())) { - //部门树搜索 - wrapper.and(x -> { - Long parentId = Long.valueOf(taskQuery.getGroupId()); - List deptList = baseMapper.selectListByParentId(parentId); - List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); - deptIds.add(parentId); - x.in(SysDept::getDeptId, deptIds); - }); - } - wrapper.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - wrapper.orderByAsc(SysDept::getAncestors); - wrapper.orderByAsc(SysDept::getParentId); - wrapper.orderByAsc(SysDept::getOrderNum); - wrapper.orderByAsc(SysDept::getDeptId); - - Page page = baseMapper.selectPageDeptList(pageQuery.build(), wrapper); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - /** * 根据ID查询所有子部门数(正常状态) * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 120d79ddf..5888985a7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -7,8 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.MapstructUtils; @@ -29,7 +27,6 @@ import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; -import java.util.Optional; /** * 岗位信息 服务层处理 @@ -249,38 +246,4 @@ public class SysPostServiceImpl implements ISysPostService, PostService { return baseMapper.updateById(post); } - /** - * 查询岗位并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - - SysPostBo post = new SysPostBo(); - post.setPostCategory(taskQuery.getHandlerCode()); - post.setPostName(taskQuery.getHandlerName()); - Optional.ofNullable(taskQuery.getGroupId()) - .filter(StringUtils::isNotBlank) - .map(Long::valueOf) - .ifPresent(post::setBelongDeptId); - - LambdaQueryWrapper wrapper = buildQueryWrapper(post); - // 如果 beginTime 和 endTime 都有值,才添加到 params 中 - if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { - wrapper.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), - SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); - } - - Page page = baseMapper.selectPagePostList(pageQuery.build(), wrapper); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 452b40935..0a2e485f6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -15,9 +15,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.RoleService; import org.dromara.common.core.utils.MapstructUtils; @@ -551,33 +549,4 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { }); } - /** - * 查询角色并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - - SysRoleBo role = new SysRoleBo(); - role.setRoleKey(taskQuery.getHandlerCode()); - role.setRoleName(taskQuery.getHandlerName()); - - // 如果 beginTime 和 endTime 都有值,才添加到 params 中 - if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { - Map params = role.getParams(); - params.put("beginTime", taskQuery.getBeginTime()); - params.put("endTime", taskQuery.getEndTime()); - } - Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java new file mode 100644 index 000000000..23dd0520c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -0,0 +1,168 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.service.TaskAssigneeService; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 工作流设计器获取任务执行人 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { + + private final SysPostMapper postMapper; + private final SysDeptMapper deptMapper; + private final SysUserMapper userMapper; + private final SysRoleMapper roleMapper; + + /** + * 查询角色并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "r.role_name", taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "r.role_key", taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + "r.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc("r.role_sort").orderByAsc("r.create_time"); + Page page = roleMapper.selectPageRoleList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + Long belongDeptId = Long.valueOf(taskQuery.getGroupId()); + wrapper.and(x -> { + List deptList = deptMapper.selectListByParentId(belongDeptId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(belongDeptId); + x.in(SysPost::getDeptId, deptIds); + }); + } + Page page = postMapper.selectPagePostList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(SysDept::getDelFlag, SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc(SysDept::getAncestors) + .orderByAsc(SysDept::getParentId) + .orderByAsc(SysDept::getOrderNum) + .orderByAsc(SysDept::getDeptId); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + //部门树搜索 + wrapper.and(x -> { + Long parentId = Long.valueOf(taskQuery.getGroupId()); + List deptList = deptMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); + x.in(SysDept::getDeptId, deptIds); + }); + } + Page page = deptMapper.selectPageDeptList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + + /** + * 查询用户并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "u.user_name", taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "u.nick_name", taskQuery.getHandlerName()) + .between(taskQuery.getBeginTime() != null && taskQuery.getEndTime() != null, + "u.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc("u.user_id"); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + //部门树搜索 + wrapper.and(x -> { + Long parentId = Long.valueOf(taskQuery.getGroupId()); + List deptList = deptMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); + x.in("u.dept_id", deptIds); + }); + } + Page page = userMapper.selectPageUserList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 763ac582d..40811707b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -15,9 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.*; @@ -37,7 +35,10 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * 用户 业务层处理 @@ -718,36 +719,4 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return selectListByIds(new ArrayList<>(userIds)); } - /** - * 查询用户并返回任务指派的列表,支持分页 - * - * @param taskQuery 查询条件 - * @return 办理人 - */ - @Override - public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { - PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - SysUserBo user = new SysUserBo(); - user.setUserName(taskQuery.getHandlerCode()); - user.setNickName(taskQuery.getHandlerName()); - Optional.ofNullable(taskQuery.getGroupId()) - .filter(StringUtils::isNotBlank) - .map(Long::valueOf) - .ifPresent(user::setDeptId); - - // 如果 beginTime 和 endTime 都有值,才添加到 params 中 - if (StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime())) { - Map params = user.getParams(); - params.put("beginTime", taskQuery.getBeginTime()); - params.put("endTime", taskQuery.getEndTime()); - } - Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); - - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), - SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime); - - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 86dc12dc1..68c3660ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -9,12 +9,9 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.enums.FormatsType; +import org.dromara.common.core.service.*; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.DeptService; -import org.dromara.common.core.service.PostService; -import org.dromara.common.core.service.RoleService; -import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.ui.dto.HandlerFunDto; @@ -39,11 +36,11 @@ import java.util.Optional; @RequiredArgsConstructor @Service public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, HandlerSelectService { - static final String DEFAULT_GROUP_NAME = "默认分组"; + + private static final String DEFAULT_GROUP_NAME = "默认分组"; + private final TaskAssigneeService taskAssigneeService; private final UserService userService; private final DeptService deptService; - private final RoleService roleService; - private final PostService postService; /** * 获取办理人权限设置列表tabs页签 @@ -80,10 +77,10 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle */ private TaskAssigneeDTO fetchTaskAssigneeData(TaskAssigneeEnum type, TaskAssigneeBody taskQuery) { return switch (type) { - case USER -> userService.selectUsersByTaskAssigneeList(taskQuery); - case ROLE -> roleService.selectRolesByTaskAssigneeList(taskQuery); - case DEPT -> deptService.selectDeptsByTaskAssigneeList(taskQuery); - case POST -> postService.selectPostsByTaskAssigneeList(taskQuery); + case USER -> taskAssigneeService.selectUsersByTaskAssigneeList(taskQuery); + case ROLE -> taskAssigneeService.selectRolesByTaskAssigneeList(taskQuery); + case DEPT -> taskAssigneeService.selectDeptsByTaskAssigneeList(taskQuery); + case POST -> taskAssigneeService.selectPostsByTaskAssigneeList(taskQuery); default -> throw new ServiceException("Unsupported handler type"); }; } From 873d9c5f4da90670c5df1b17cd2fa0cf923aecaf Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 19:13:23 +0800 Subject: [PATCH 141/227] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=9F=A5=E8=AF=A2=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwDefinitionServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index f6e78afe1..4447a2b5f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -14,6 +14,7 @@ import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.service.DefService; @@ -56,6 +57,8 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { @Override public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()),"flow_code", flowDefinition.getFlowCode()); + queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()),"flow_Name", flowDefinition.getFlowName()); queryWrapper.orderByDesc("create_time"); Page page = flwDefMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); From de4f72019181f770454a9be3fb51398be9a7304e Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 13 Dec 2024 19:23:53 +0800 Subject: [PATCH 142/227] =?UTF-8?q?[add]=20=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=A2=9E=E5=8A=A0=E5=88=86=E7=B1=BB=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwDefinitionServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 4447a2b5f..657eff683 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -59,6 +59,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()),"flow_code", flowDefinition.getFlowCode()); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()),"flow_Name", flowDefinition.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getCategory()),"category", flowDefinition.getCategory()); queryWrapper.orderByDesc("create_time"); Page page = flwDefMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); From fecb3b730277ea6412d80adaf1832f228ad3921f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 13 Dec 2024 23:00:26 +0800 Subject: [PATCH 143/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=8A=9E?= =?UTF-8?q?=E7=90=86=E7=9B=91=E5=90=AC=20remove=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/event/ProcessTaskEvent.java | 2 +- .../WfDefinitionConfigController.java | 80 ------------ .../dromara/workflow/domain/WfCategory.java | 5 - .../workflow/domain/WfDefinitionConfig.java | 56 --------- .../workflow/domain/bo/FlowInstanceBo.java | 2 +- .../workflow/domain/bo/StartProcessBo.java | 6 +- .../workflow/domain/bo/WfCategoryBo.java | 6 - .../domain/bo/WfDefinitionConfigBo.java | 59 --------- .../workflow/domain/vo/WfCategoryVo.java | 6 - .../domain/vo/WfDefinitionConfigVo.java | 64 ---------- .../handler/FlowProcessEventHandler.java | 5 +- .../listener/WorkflowGlobalListener.java | 53 ++++---- .../mapper/WfDefinitionConfigMapper.java | 15 --- .../workflow/service/IWfCategoryService.java | 9 -- .../service/IWfDefinitionConfigService.java | 83 ------------- .../impl/FlwDefinitionServiceImpl.java | 5 +- .../service/impl/FlwInstanceServiceImpl.java | 4 +- .../service/impl/FlwTaskServiceImpl.java | 23 +--- .../service/impl/TestLeaveServiceImpl.java | 2 +- .../service/impl/WfCategoryServiceImpl.java | 11 -- .../impl/WfDefinitionConfigServiceImpl.java | 117 ------------------ .../workflow/WfDefinitionConfigMapper.xml | 7 -- 22 files changed, 37 insertions(+), 583 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java index 78d0d9e29..d751bd0ae 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -30,7 +30,7 @@ public class ProcessTaskEvent implements Serializable { /** * 任务id */ - private String taskId; + private Long taskId; /** * 业务id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java deleted file mode 100644 index 928935a95..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.dromara.workflow.controller; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 流程定义配置 - * - * @author may - * @date 2024-03-18 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/defConfig") -public class WfDefinitionConfigController extends BaseController { - - private final IWfDefinitionConfigService wfDefinitionConfigService; - - - /** - * 获取流程定义配置详细信息 - * - * @param definitionId 主键 - */ - @GetMapping("/getByDefId/{definitionId}") - public R getByDefId(@NotBlank(message = "流程定义ID不能为空") - @PathVariable String definitionId) { - return R.ok(wfDefinitionConfigService.getByDefId(definitionId)); - } - - /** - * 新增流程定义配置 - */ - @Log(title = "流程定义配置", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/saveOrUpdate") - public R saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) { - return toAjax(wfDefinitionConfigService.saveOrUpdate(bo)); - } - - /** - * 删除流程定义配置 - * - * @param ids 主键串 - */ - @Log(title = "流程定义配置", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids))); - } - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param tableName 表名 - * @param definitionId 流程定义id - */ - @GetMapping("/getByTableNameNotDefId") - public R> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @RequestParam String tableName, - @NotBlank(message = "流程定义ID不能为空") @RequestParam String definitionId) { - return R.ok(wfDefinitionConfigService.getByTableNameNotDefId(tableName, definitionId)); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java index 94a7cf500..657ca7e89 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java @@ -33,11 +33,6 @@ public class WfCategory extends TenantEntity { */ private String categoryName; - /** - * 分类编码 - */ - private String categoryCode; - /** * 父级id */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java deleted file mode 100644 index a18d8cf9c..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.dromara.workflow.domain; - -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 流程定义配置对象 wf_definition_config - * - * @author may - * @date 2024-03-18 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_definition_config") -public class WfDefinitionConfig extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表名 - */ - private String tableName; - - /** - * 流程定义ID - */ - private Long definitionId; - - /** - * 流程KEY - */ - private String processKey; - - /** - * 流程版本 - */ - private String version; - - /** - * 备注 - */ - private String remark; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index 79042eb6e..682eefc97 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -40,7 +40,7 @@ public class FlowInstanceBo implements Serializable { /** * 模型分类 */ - private String categoryCode; + private String category; /** * 任务名称 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index 7af7935e6..452354760 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -29,10 +29,10 @@ public class StartProcessBo implements Serializable { private String businessKey; /** - * 表名 + * 流程定义编码 */ - @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) - private String tableName; + @NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class}) + private String flowCode; /** * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java index 972302c57..a5d772f72 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java @@ -33,12 +33,6 @@ public class WfCategoryBo extends BaseEntity { @NotBlank(message = "分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String categoryName; - /** - * 分类编码 - */ - @NotBlank(message = "分类编码不能为空", groups = {AddGroup.class, EditGroup.class}) - private String categoryCode; - /** * 父级id */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java deleted file mode 100644 index 4b1fc7cba..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; - -/** - * 流程定义配置业务对象 wf_form_definition - * - * @author may - * @date 2024-03-18 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfDefinitionConfig.class, reverseConvertGenerate = false) -public class WfDefinitionConfigBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 表名 - */ - @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) - private String tableName; - - /** - * 流程定义ID - */ - @NotNull(message = "流程定义ID不能为空", groups = {AddGroup.class}) - private Long definitionId; - - /** - * 流程KEY - */ - @NotBlank(message = "流程KEY不能为空", groups = {AddGroup.class}) - private String processKey; - - /** - * 流程版本 - */ - @NotBlank(message = "流程版本不能为空", groups = {AddGroup.class}) - private String version; - - /** - * 备注 - */ - private String remark; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java index 362f64625..9424a3620 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java @@ -36,12 +36,6 @@ public class WfCategoryVo implements Serializable { @ExcelProperty(value = "分类名称") private String categoryName; - /** - * 分类编码 - */ - @ExcelProperty(value = "分类编码") - private String categoryCode; - /** * 父级id */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java deleted file mode 100644 index 369ddaa5d..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.workflow.domain.WfDefinitionConfig; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 流程定义配置视图对象 wf_definition_config - * - * @author may - * @date 2024-03-18 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfDefinitionConfig.class) -public class WfDefinitionConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表名 - */ - @ExcelProperty(value = "表名") - private String tableName; - - /** - * 流程定义ID - */ - @ExcelProperty(value = "流程定义ID") - private Long definitionId; - - /** - * 流程KEY - */ - @ExcelProperty(value = "流程KEY") - private String processKey; - - - /** - * 流程版本 - */ - @ExcelProperty(value = "流程版本") - private String version; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index 7c8e15633..16592ceee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -1,5 +1,6 @@ package org.dromara.workflow.handler; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.utils.SpringUtils; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Component; * @author may * @date 2024-06-02 */ +@Slf4j @Component public class FlowProcessEventHandler { @@ -23,6 +25,7 @@ public class FlowProcessEventHandler { * @param submit 当为true时为申请人节点办理 */ public void processHandler(String flowCode, String businessKey, String status, boolean submit) { + log.info("发布流程事件,流程状态: {}, 流程编码: {}, 业务ID: {}", status, flowCode, businessKey); ProcessEvent processEvent = new ProcessEvent(); processEvent.setFlowCode(flowCode); processEvent.setBusinessKey(businessKey); @@ -39,7 +42,7 @@ public class FlowProcessEventHandler { * @param taskId 任务id * @param businessKey 业务id */ - public void processTaskHandler(String flowCode, String nodeCode, String taskId, String businessKey) { + public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) { ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); processTaskEvent.setFlowCode(flowCode); processTaskEvent.setNodeCode(nodeCode); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 79a2ed11d..58bd348a0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -3,15 +3,15 @@ package org.dromara.workflow.listener; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.listener.GlobalListener; import org.dromara.warm.flow.core.listener.ListenerVariable; import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Component; @@ -30,6 +30,7 @@ public class WorkflowGlobalListener implements GlobalListener { private final IFlwTaskService taskService; private final IFlwInstanceService instanceService; + private final FlowProcessEventHandler flowProcessEventHandler; /** * 创建监听器,任务创建时执行 @@ -38,6 +39,15 @@ public class WorkflowGlobalListener implements GlobalListener { */ @Override public void create(ListenerVariable listenerVariable) { + Instance instance = listenerVariable.getInstance(); + Definition definition = listenerVariable.getDefinition(); + String businessId = instance.getBusinessId(); + String flowStatus = instance.getFlowStatus(); + Task task = listenerVariable.getTask(); + if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) { + // 判断流程状态(发布审批中事件) + flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId); + } } /** @@ -68,27 +78,25 @@ public class WorkflowGlobalListener implements GlobalListener { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); String businessId = instance.getBusinessId(); - String instanceFlowStatus = instance.getFlowStatus(); - - // 判断流程状态 - String status = determineFlowStatus(instance, instanceFlowStatus); + String flowStatus = instance.getFlowStatus(); + // 判断流程状态(发布:驳回,作废,终止,作废,已完成事件) + String status = determineFlowStatus(instance, flowStatus); if (StringUtils.isNotBlank(status)) { - // 如果流程状态有效,发布事件 - publishProcessEvent(status, definition.getFlowCode(), businessId); + flowProcessEventHandler.processHandler(definition.getFlowCode(), businessId, status, false); } } /** * 根据流程实例和当前流程状态确定最终状态 * - * @param instance 流程实例 - * @param instanceFlowStatus 流程实例当前状态 + * @param instance 流程实例 + * @param flowStatus 流程实例当前状态 * @return 流程最终状态 */ - private String determineFlowStatus(Instance instance, String instanceFlowStatus) { - if (StringUtils.isNotBlank(instanceFlowStatus) && BusinessStatusEnum.initialState(instanceFlowStatus)) { - log.info("流程实例当前状态: {}", instanceFlowStatus); - return instanceFlowStatus; + private String determineFlowStatus(Instance instance, String flowStatus) { + if (StringUtils.isNotBlank(flowStatus) && BusinessStatusEnum.initialState(flowStatus)) { + log.info("流程实例当前状态: {}", flowStatus); + return flowStatus; } else { Long instanceId = instance.getId(); List flowTasks = taskService.selectByInstId(instanceId); @@ -104,21 +112,4 @@ public class WorkflowGlobalListener implements GlobalListener { } } - /** - * 发布事件 - * - * @param status 状态 - * @param flowCode 流程编码 - * @param businessId 业务id - */ - private void publishProcessEvent(String status, String flowCode, String businessId) { - log.info("发布流程事件,流程状态: {}, 流程编码: {}, 业务ID: {}", status, flowCode, businessId); - ProcessEvent processEvent = new ProcessEvent(); - processEvent.setStatus(status); - processEvent.setSubmit(false); - processEvent.setFlowCode(flowCode); - processEvent.setBusinessKey(businessId); - SpringUtils.context().publishEvent(processEvent); - } - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java deleted file mode 100644 index ee2088255..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 流程定义配置Mapper接口 - * - * @author may - * @date 2024-03-18 - */ -public interface WfDefinitionConfigMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java index acf0aa2bc..82cde8e7c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java @@ -1,6 +1,5 @@ package org.dromara.workflow.service; -import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.bo.WfCategoryBo; import org.dromara.workflow.domain.vo.WfCategoryVo; @@ -40,12 +39,4 @@ public interface IWfCategoryService { * 校验并批量删除流程分类信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 按照类别编码查询 - * - * @param categoryCode 分类比吗 - * @return 结果 - */ - WfCategory queryByCategoryCode(String categoryCode); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java deleted file mode 100644 index 0ca50355c..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; - -import java.util.Collection; -import java.util.List; - -/** - * 流程定义配置Service接口 - * - * @author may - * @date 2024-03-18 - */ -public interface IWfDefinitionConfigService { - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @return 结果 - */ - WfDefinitionConfigVo getByDefId(String definitionId); - - /** - * 查询流程定义配置 - * - * @param tableName 表名 - * @return 结果 - */ - WfDefinitionConfigVo getByTableNameLastVersion(String tableName); - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName); - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - List getByTableNameNotDefId(String tableName, String definitionId); - - /** - * 查询流程定义配置列表 - * - * @param definitionIds 流程定义id - * @return 结果 - */ - List queryList(List definitionIds); - - - /** - * 新增流程定义配置 - * - * @param bo 参数 - * @return 结果 - */ - Boolean saveOrUpdate(WfDefinitionConfigBo bo); - - /** - * 删除 - * - * @param ids id - * @return 结果 - */ - Boolean deleteByIds(Collection ids); - - /** - * 按照流程定义id删除 - * - * @param ids 流程定义id - * @return 结果 - */ - Boolean deleteByDefIds(Collection ids); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 657eff683..eff1201d7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -25,7 +25,6 @@ import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; -import org.dromara.workflow.service.IWfDefinitionConfigService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -46,7 +45,6 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowDefinitionMapper flowDefinitionMapper; private final FlwDefMapper flwDefMapper; private final FlowHisTaskMapper flowHisTaskMapper; - private final IWfDefinitionConfigService wfDefinitionConfigService; /** * 分页查询 @@ -59,7 +57,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()),"flow_code", flowDefinition.getFlowCode()); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()),"flow_Name", flowDefinition.getFlowName()); - queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getCategory()),"category", flowDefinition.getCategory()); + queryWrapper.eq(StringUtils.isNotBlank(flowDefinition.getCategory()),"category", flowDefinition.getCategory()); queryWrapper.orderByDesc("create_time"); Page page = flwDefMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); @@ -147,7 +145,6 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { } try { defService.removeDef(ids); - wfDefinitionConfigService.deleteByDefIds(ids); } catch (Exception e) { log.error("Error removing flow definitions: {}", e.getMessage(), e); throw new RuntimeException("Failed to remove flow definitions", e); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 2c7c259ae..2f9ab0f54 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -98,9 +98,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); - queryWrapper.orderByDesc("fi.create_time"); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -118,6 +117,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getCategory()),"category", flowInstanceBo.getCategory()); queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); queryWrapper.orderByDesc("fi.create_time"); return queryWrapper; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 9d9ecad0a..21c901a88 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -39,12 +39,10 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.domain.vo.WfCopy; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwTaskService; -import org.dromara.workflow.service.IWfDefinitionConfigService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,7 +68,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final FlowInstanceMapper flowInstanceMapper; private final FlwTaskMapper flwTaskMapper; private final UserService userService; - private final IWfDefinitionConfigService wfDefinitionConfigService; private final FlowTaskMapper flowTaskMapper; private final FlowHisTaskMapper flowHisTaskMapper; private final FlowSkipMapper flowSkipMapper; @@ -98,16 +95,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { variables.put(INITIATOR, LoginHelper.getUserIdStr()); // 业务id variables.put(BUSINESS_KEY, businessKey); - WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); - if (wfDefinitionConfigVo == null || wfDefinitionConfigVo.getDefinitionId() == null) { - throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); - } - Long definitionId = wfDefinitionConfigVo.getDefinitionId(); - Definition definition = defService.getById(definitionId); - if (definition == null) { - log.error("流程定义ID【{}】不存在!", definitionId); - throw new ServiceException("请到流程定义ID【" + definitionId + "】不存在!"); - } FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) .eq(FlowInstance::getBusinessId, businessKey)); if (flowInstance != null) { @@ -115,7 +102,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); - flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); + flowParams.flowCode(startProcessBo.getFlowCode()); flowParams.variable(startProcessBo.getVariables()); flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; @@ -147,18 +134,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { List wfCopyList = completeTaskBo.getWfCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); - // 获取流程定义信息 Definition definition = defService.getById(flowTask.getDefinitionId()); - // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); } - - // 办理任务监听,记录任务执行信息 - flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), taskId.toString(), ins.getBusinessId()); - // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 FlowParams flowParams = new FlowParams(); flowParams.variable(completeTaskBo.getVariables()); @@ -328,7 +309,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); - wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()),"t.create_by",flowTaskBo.getCreateByIds()); + wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); wrapper.orderByDesc("t.create_time"); return wrapper; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 72a30c10f..5386f359a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -88,7 +88,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { bo.setLeaveDays((int) day); TestLeave add = MapstructUtils.convert(bo, TestLeave.class); if (StringUtils.isBlank(add.getStatus())) { - add.setStatus(FlowStatus.TOBESUBMIT.getKey()); + add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); } boolean flag = baseMapper.insert(add) > 0; if (flag) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index 9e7acbb86..67f072c69 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -49,7 +49,6 @@ public class WfCategoryServiceImpl implements IWfCategoryService { private LambdaQueryWrapper buildQueryWrapper(WfCategoryBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), WfCategory::getCategoryName, bo.getCategoryName()); - lqw.eq(StringUtils.isNotBlank(bo.getCategoryCode()), WfCategory::getCategoryCode, bo.getCategoryCode()); return lqw; } @@ -95,14 +94,4 @@ public class WfCategoryServiceImpl implements IWfCategoryService { } return baseMapper.deleteByIds(ids) > 0; } - - /** - * 按照类别编码查询 - * - * @param categoryCode 分类比吗 - */ - @Override - public WfCategory queryByCategoryCode(String categoryCode) { - return baseMapper.selectOne(new LambdaQueryWrapper().eq(WfCategory::getCategoryCode, categoryCode)); - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java deleted file mode 100644 index ccf7127d7..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import org.dromara.common.core.utils.MapstructUtils; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.springframework.stereotype.Service; -import org.dromara.workflow.mapper.WfDefinitionConfigMapper; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Collection; - -/** - * 流程定义配置Service业务层处理 - * - * @author may - * @date 2024-03-18 - */ -@RequiredArgsConstructor -@Service -public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService { - - private final WfDefinitionConfigMapper baseMapper; - - /** - * 查询流程定义配置 - */ - @Override - public WfDefinitionConfigVo getByDefId(String definitionId) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(WfDefinitionConfig::getDefinitionId, definitionId)); - } - - /** - * 查询流程定义配置 - * - * @param tableName 表名 - * @return 结果 - */ - @Override - public WfDefinitionConfigVo getByTableNameLastVersion(String tableName) { - List wfDefinitionConfigVos = baseMapper.selectVoList( - new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, tableName).orderByDesc(WfDefinitionConfig::getVersion)); - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - return wfDefinitionConfigVos.get(0); - } - return null; - } - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - @Override - public WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName) { - return baseMapper.selectVoOne(new LambdaQueryWrapper() - .eq(WfDefinitionConfig::getDefinitionId, definitionId) - .eq(WfDefinitionConfig::getTableName, tableName)); - } - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param tableName 表名 - * @param definitionId 流程定义id - */ - @Override - public List getByTableNameNotDefId(String tableName, String definitionId) { - return baseMapper.selectVoList(new LambdaQueryWrapper() - .eq(WfDefinitionConfig::getTableName, tableName) - .ne(WfDefinitionConfig::getDefinitionId, definitionId)); - } - - /** - * 查询流程定义配置列表 - */ - @Override - public List queryList(List definitionIds) { - return baseMapper.selectVoList(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, definitionIds)); - } - - /** - * 新增流程定义配置 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveOrUpdate(WfDefinitionConfigBo bo) { - WfDefinitionConfig add = MapstructUtils.convert(bo, WfDefinitionConfig.class); - baseMapper.delete(new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, bo.getTableName())); - add.setTableName(add.getTableName().toLowerCase()); - boolean flag = baseMapper.insertOrUpdate(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 批量删除流程定义配置 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 0; - } - - @Override - public Boolean deleteByDefIds(Collection ids) { - return baseMapper.delete(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, ids)) > 0; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml deleted file mode 100644 index 8d579f705..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From f789ecf41863d6bb6f8d19186cbd18513fe67021 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 00:30:41 +0800 Subject: [PATCH 144/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 3 +- .../workflow/domain/bo/BackProcessBo.java | 5 ++ .../workflow/domain/bo/CompleteTaskBo.java | 5 ++ .../handler/FlowProcessEventHandler.java | 1 + .../listener/WorkflowGlobalListener.java | 1 + .../workflow/service/IFlwTaskService.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 23 ++++++-- .../dromara/workflow/utils/WorkflowUtils.java | 58 ++++++++++++++++++- 8 files changed, 89 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 7c430788f..1e14130ec 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -11,6 +11,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.HisTask; +import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -182,7 +183,7 @@ public class FlwTaskController extends BaseController { * @param instanceId 实例id */ @GetMapping("/getBackTaskNode/{instanceId}") - public R> getBackTaskNode(@PathVariable String instanceId) { + public R> getBackTaskNode(@PathVariable String instanceId) { return R.ok(flwTaskService.getBackTaskNode(instanceId)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index 60bd30feb..80b9691d9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -46,6 +46,11 @@ public class BackProcessBo implements Serializable { */ private String message; + /** + * 通知 + */ + private String notice; + /** * 流程变量 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index b6d4cce1e..255ee54a0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -49,6 +49,11 @@ public class CompleteTaskBo implements Serializable { */ private String message; + /** + * 消息通知 + */ + private String notice; + /** * 流程变量 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index 16592ceee..f0ae46d20 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -43,6 +43,7 @@ public class FlowProcessEventHandler { * @param businessKey 业务id */ public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) { + log.info("发布流程任务事件, 流程编码: {}, 业务ID: {}", flowCode, businessKey); ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); processTaskEvent.setFlowCode(flowCode); processTaskEvent.setNodeCode(nodeCode); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 58bd348a0..c4b8a4db6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -14,6 +14,7 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Component; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index ba0436a44..7d9e08bea 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -105,7 +105,7 @@ public interface IFlwTaskService { * @param instanceId 实例id * @return 结果 */ - List getBackTaskNode(String instanceId); + List getBackTaskNode(String instanceId); /** * 终止任务 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 21c901a88..43061e30d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -130,6 +130,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { try { // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); + List messageType = completeTaskBo.getMessageType(); + String notice = completeTaskBo.getNotice(); // 获取抄送人 List wfCopyList = completeTaskBo.getWfCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); @@ -150,6 +152,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); + //消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -323,11 +327,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public boolean backProcess(BackProcessBo bo) { try { Long taskId = bo.getTaskId(); + String notice = bo.getNotice(); + List messageType = bo.getMessageType(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { throw new ServiceException("任务不存在!"); } Long definitionId = flowTasks.get(0).getDefinitionId(); + Definition definition = defService.getById(definitionId); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); //开始节点的下一节点 @@ -347,6 +354,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.nodeCode(bo.getNodeCode()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance, flowTasks.get(0), null); + //消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -360,20 +369,24 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param instanceId 实例id */ @Override - public List getBackTaskNode(String instanceId) { + public List getBackTaskNode(String instanceId) { // 创建查询条件,查询历史任务记录 LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) + .select(FlowHisTask::getNodeCode, FlowHisTask::getNodeName) .eq(FlowHisTask::getInstanceId, instanceId) .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) .orderByDesc(FlowHisTask::getCreateTime); + List flowHisTasks = flowHisTaskMapper.selectList(lw); if (CollUtil.isEmpty(flowHisTasks)) { return Collections.emptyList(); } - // 直接返回去重后的列表 - return flowHisTasks.stream() - .distinct() - .collect(Collectors.toList()); + return new ArrayList<>(flowHisTasks.stream() + .collect(Collectors.toMap( + FlowHisTask::getNodeCode, + task -> task, + (existing, replacement) -> existing + )).values()); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 4d47eeee3..1452d82f7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,12 +1,22 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; @@ -20,6 +30,8 @@ import java.util.stream.Collectors; */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { + public static final IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); + public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class); /** * 获取办理人 @@ -31,7 +43,6 @@ public class WorkflowUtils { if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); // 获取所有用户的 UserDTO 列表 return userList.stream() .map(User::getProcessedBy) @@ -52,7 +63,6 @@ public class WorkflowUtils { return Set.of(); } Set list = new HashSet<>(); - IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); @@ -70,4 +80,48 @@ public class WorkflowUtils { return list; } + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(String flowName, Long instId, List messageType, String message) { + List userList = new ArrayList<>(); + List list = iFlwTaskService.selectByInstId(instId); + if (StringUtils.isBlank(message)) { + message = "有新的【" + flowName + "】单据已经提交至您的待办,请您及时处理。"; + } + for (Task task : list) { + List users = iFlwTaskService.currentTaskAllUser(task.getId()); + if (CollUtil.isNotEmpty(users)) { + userList.addAll(users); + } + } + if (CollUtil.isNotEmpty(userList)) { + for (String code : messageType) { + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); + if (ObjectUtil.isNotEmpty(messageTypeEnum)) { + switch (messageTypeEnum) { + case SYSTEM_MESSAGE: + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(StreamUtils.toList(userList, UserDTO::getUserId))); + dto.setMessage(message); + WebSocketUtils.publishMessage(dto); + break; + case EMAIL_MESSAGE: + MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); + break; + case SMS_MESSAGE: + //todo 短信发送 + break; + default: + throw new IllegalStateException("Unexpected value: " + messageTypeEnum); + } + } + } + } + } + } From 5e3de648053edede52ddecea5912ce9cafe5a63d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 00:50:50 +0800 Subject: [PATCH 145/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/FlowInstanceVo.java | 5 +++ .../service/impl/FlwInstanceServiceImpl.java | 44 +++++-------------- .../mapper/workflow/FlwInstanceMapper.xml | 4 +- 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index 5d7587cad..d6c476dd2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -120,4 +120,9 @@ public class FlowInstanceVo { */ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") private String createByName; + + /** + * 流程分类id + */ + private String category; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 2f9ab0f54..0ef7e0f4c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -23,7 +23,6 @@ import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.DefService; @@ -76,8 +75,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询正在运行的流程实例 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 参数 + * @param pageQuery 分页 */ @Override public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { @@ -93,8 +92,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询已结束的流程实例 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 参数 + * @param pageQuery 分页 */ @Override public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { @@ -109,6 +108,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 通用查询条件 + * * @param flowInstanceBo 查询条件 * @return 查询条件构造方法 */ @@ -117,11 +117,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); - queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getCategory()),"category", flowInstanceBo.getCategory()); + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getCategory()), "fd.category", flowInstanceBo.getCategory()); queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); queryWrapper.orderByDesc("fi.create_time"); return queryWrapper; } + /** * 根据业务id查询流程实例 * @@ -225,34 +226,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo pageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - if (StringUtils.isNotBlank(instanceBo.getFlowCode())) { - List flowDefinitions = flowDefinitionMapper.selectList( - new LambdaQueryWrapper().eq(FlowDefinition::getFlowCode, instanceBo.getFlowCode())); - if (CollUtil.isNotEmpty(flowDefinitions)) { - List defIdList = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); - wrapper.in(FlowInstance::getDefinitionId, defIdList); - } - } - wrapper.eq(FlowInstance::getCreateBy, LoginHelper.getUserIdStr()); - wrapper.orderByDesc(FlowInstance::getCreateTime); - Page page = flowInstanceMapper.selectPage(pageQuery.build(), wrapper); + QueryWrapper queryWrapper = buildQueryWrapper(instanceBo); + queryWrapper.eq("fi.create_by", LoginHelper.getUserIdStr()); + Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); - List flowInstanceVos = BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class); - if (CollUtil.isNotEmpty(flowInstanceVos)) { - List definitionIds = StreamUtils.toList(flowInstanceVos, FlowInstanceVo::getDefinitionId); - List flowDefinitions = flowDefinitionMapper.selectByIds(definitionIds); - for (FlowInstanceVo vo : flowInstanceVos) { - flowDefinitions.stream().filter(e -> e.getId().toString().equals(vo.getDefinitionId().toString())).findFirst().ifPresent(e -> { - vo.setFlowName(e.getFlowName()); - vo.setFlowCode(e.getFlowCode()); - vo.setVersion(e.getVersion()); - vo.setFlowStatusName(FlowStatus.getValueByKey(vo.getFlowStatus())); - }); - } - - } - build.setRows(flowInstanceVos); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); build.setTotal(page.getTotal()); return build; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 7b5199974..b80209cba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -22,6 +22,7 @@ + From 603d7a7a71ba17c4043efc24189634c2bf93f774 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 14:00:42 +0800 Subject: [PATCH 147/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=9F=A5=E8=AF=A2=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/workflow/FlwDefMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index d95e737b6..b965b13ff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -14,7 +14,7 @@ max(case when is_publish = 1 then version end), max(version) ) as version - from flow_definition + from flow_definition where del_flag = '0' group by flow_code ) b on (a.flow_code = b.flow_code and a.version = b.version) where a.del_flag = '0' From a2273beae9540144c52644c7154347e8155d7e67 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 18:58:42 +0800 Subject: [PATCH 148/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TestLeaveServiceImpl.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 5386f359a..23e9071e8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -125,13 +125,13 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * * @param processEvent 参数 */ - @EventListener(condition = "#processEvent.flowCode.startsWith('leaveFlow-serial1')") + @EventListener(condition = "#processEvent.flowCode.startsWith('leave')") public void processHandler(ProcessEvent processEvent) { log.info("当前任务执行了{}", processEvent.toString()); TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey())); testLeave.setStatus(processEvent.getStatus()); if (processEvent.isSubmit()) { - testLeave.setStatus(FlowStatus.APPROVAL.getKey()); + testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); } baseMapper.updateById(testLeave); } @@ -140,21 +140,17 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * 执行办理任务监听 * 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断 * 在方法中判断流程节点key - * if ("xxx".equals(processTaskEvent.getTaskDefinitionKey())) { + * if ("xxx".equals(processTaskEvent.getNodeCode())) { * //执行业务逻辑 * } * * @param processTaskEvent 参数 */ - @EventListener(condition = "#processTaskEvent.flowCode=='leaveFlow-serial1'") + @EventListener(condition = "#processTaskEvent.flowCode=='leave'") public void processTaskHandler(ProcessTaskEvent processTaskEvent) { - // 所有demo案例的申请人节点id - String[] ids = {"0", "1", "2", "3", "4", "5", "6"}; - if (StringUtils.equalsAny(processTaskEvent.getNodeCode(), ids)) { - log.info("当前任务执行了{}", processTaskEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); - baseMapper.updateById(testLeave); - } + log.info("当前任务执行了{}", processTaskEvent.toString()); + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); + testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + baseMapper.updateById(testLeave); } } From fa5ddaa385b211962add419dd29ae2411e9bb9ba Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 19:32:09 +0800 Subject: [PATCH 149/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 23 ++++++++++++++++++- .../dromara/workflow/utils/WorkflowUtils.java | 4 ++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index c5b110bcb..93bd21494 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; @@ -248,12 +249,32 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (flowInstance == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } + //运行中的任务 + List list = new ArrayList<>(); + List flowTaskList = flwTaskService.selectByInstId(flowInstance.getId()); + if (CollUtil.isNotEmpty(flowTaskList)) { + List flowHisTaskVos = BeanUtil.copyToList(flowTaskList, FlowHisTaskVo.class); + for (FlowHisTaskVo flowHisTaskVo : flowHisTaskVos) { + flowHisTaskVo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); + flowHisTaskVo.setUpdateTime(null); + List allUser = flwTaskService.currentTaskAllUser(flowHisTaskVo.getTaskId()); + if (CollUtil.isNotEmpty(allUser)) { + String join = StreamUtils.join(allUser, e -> String.valueOf(e.getUserId())); + flowHisTaskVo.setApprover(join); + } + } + list.addAll(flowHisTaskVos); + } + //历史任务 LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(FlowHisTask::getInstanceId, flowInstance.getId()); wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); - List list = BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class); + if (CollUtil.isNotEmpty(flowHisTasks)) { + list.addAll(BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class)); + } + map.put("list", list); try { String flowChart = defService.flowChart(flowInstance.getId()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 1452d82f7..b74bb84d2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -44,11 +44,11 @@ public class WorkflowUtils { return Collections.emptyList(); } // 获取所有用户的 UserDTO 列表 - return userList.stream() + return new ArrayList<>(userList.stream() .map(User::getProcessedBy) .filter(Objects::nonNull) .flatMap(processedBy -> taskAssigneeService.fetchUsersByStorageId(processedBy).stream()) - .collect(Collectors.toList()); + .collect(Collectors.toMap(UserDTO::getUserId, user -> user, (ex, rep) -> ex)).values()); } /** From 67c9c5f910ffba7a7da1b87191c1a30fa07f08ca Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 19:33:04 +0800 Subject: [PATCH 150/227] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/bpmn/leave1.xml | 17 +++++++++++++ script/bpmn/leave2.xml | 24 +++++++++++++++++++ script/bpmn/leaveFlow-serial1.xml | 40 ------------------------------- 3 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 script/bpmn/leave1.xml create mode 100644 script/bpmn/leave2.xml delete mode 100644 script/bpmn/leaveFlow-serial1.xml diff --git a/script/bpmn/leave1.xml b/script/bpmn/leave1.xml new file mode 100644 index 000000000..339e2b72b --- /dev/null +++ b/script/bpmn/leave1.xml @@ -0,0 +1,17 @@ + + + + + dd515cdd-59f6-446f-94ca-25ca062afb42 + + + 78fa8e5b-e809-44ed-978a-41092409ebcf + + + a8abf15f-b83e-428a-86cc-033555ea9bbe + + + 8b82b7d7-8660-455e-b880-d6d22ea3eb6d + + + diff --git a/script/bpmn/leave2.xml b/script/bpmn/leave2.xml new file mode 100644 index 000000000..bc0fdb2bb --- /dev/null +++ b/script/bpmn/leave2.xml @@ -0,0 +1,24 @@ + + + + + fdcae93b-b69c-498a-b231-09255e74bcbd + + + 7b8c7ead-7dc8-4951-a7f3-f0c41995909e + + + b3528155-dcb7-4445-bbdf-3d00e3499e86 + 5ed2362b-fc0c-4d52-831f-95208b830605 + + + c9fa6d7d-2a74-4e78-b947-0cad8a6af869 + + + 40aa65fd-0712-4d23-b6f7-d0432b920fd1 + + + + c9fa6d7d-2a74-4e78-b947-0cad8a6af869 + + diff --git a/script/bpmn/leaveFlow-serial1.xml b/script/bpmn/leaveFlow-serial1.xml deleted file mode 100644 index e4e16e8a4..000000000 --- a/script/bpmn/leaveFlow-serial1.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - 2 - - - 3 - - - 4 - - - 5 - 2 - - - 6 - - - From 0bc46c849f910dd334c3374c85ef274200aa8066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 14 Dec 2024 23:39:21 +0800 Subject: [PATCH 151/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B0=86?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=94=B9=E4=B8=BAsse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/pom.xml | 2 +- .../java/org/dromara/workflow/utils/WorkflowUtils.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index c64ee5a80..37c6cc10d 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -20,7 +20,7 @@ org.dromara - ruoyi-common-websocket + ruoyi-common-sse diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index b74bb84d2..0f50f2171 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -9,8 +9,8 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mail.utils.MailUtils; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.orm.entity.FlowTask; @@ -105,10 +105,10 @@ public class WorkflowUtils { if (ObjectUtil.isNotEmpty(messageTypeEnum)) { switch (messageTypeEnum) { case SYSTEM_MESSAGE: - WebSocketMessageDto dto = new WebSocketMessageDto(); - dto.setSessionKeys(new ArrayList<>(StreamUtils.toList(userList, UserDTO::getUserId))); + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId)); dto.setMessage(message); - WebSocketUtils.publishMessage(dto); + SseMessageUtils.publishMessage(dto); break; case EMAIL_MESSAGE: MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); From 14463d3b1ffe3ebf38de2cf85f29f2e403b3d92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 14 Dec 2024 23:52:48 +0800 Subject: [PATCH 152/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../translation/constant/TransConstant.java | 5 ---- .../dromara/workflow/constant/WfConstant.java | 15 ++++++++++ .../workflow/domain/vo/FlowTaskVo.java | 3 +- .../workflow/service/AssigneeService.java | 30 ------------------- .../workflow/service/IFlwTaskService.java | 17 ++++++++++- .../service/impl/FlwTaskServiceImpl.java | 20 ++++++------- .../impl/TaskAssigneeTranslationImpl.java | 12 ++++---- 7 files changed, 49 insertions(+), 53 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index c14175ebe..c084ea1a0 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -32,9 +32,4 @@ public interface TransConstant { */ String OSS_ID_TO_URL = "oss_id_to_url"; - /** - * 任务Id转任务办理人名称 - */ - String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java new file mode 100644 index 000000000..af3c2f13f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.constant; + +/** + * 常量 + * + * @author Lion Li + */ +public interface WfConstant { + + /** + * 任务Id转任务办理人名称 + */ + String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index aec63ed0e..872392add 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -4,6 +4,7 @@ import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.entity.User; +import org.dromara.workflow.constant.WfConstant; import java.io.Serial; import java.io.Serializable; @@ -123,7 +124,7 @@ public class FlowTaskVo implements Serializable { /** * 办理人名称 */ - @Translation(type = TransConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") + @Translation(type = WfConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") private String transactorNames; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java deleted file mode 100644 index 7753a3543..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/AssigneeService.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.core.domain.dto.UserDTO; - -import java.util.List; - -/** - * 通用 办理人服务 - * - * @author AprilWind - */ -public interface AssigneeService { - - /** - * 通过taskId查询对应的任务办理人 - * - * @param taskIds taskId串逗号分隔 - * @return 任务办理人名称串逗号分隔 - */ - String selectAssigneeByIds(String taskIds); - - /** - * 通过taskId查询对应的任务办理人列表 - * - * @param taskIdList 任务id - * @return 列表 - */ - List selectByIds(List taskIdList); - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 7d9e08bea..2bdb6714f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -3,7 +3,6 @@ package org.dromara.workflow.service; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; @@ -115,6 +114,22 @@ public interface IFlwTaskService { */ boolean terminationTask(FlowTerminationBo bo); + /** + * 通过taskId查询对应的任务办理人 + * + * @param taskIds taskId串逗号分隔 + * @return 任务办理人名称串逗号分隔 + */ + String selectAssigneeNamesByIds(String taskIds); + + /** + * 通过taskId查询对应的任务办理人列表 + * + * @param taskIdList 任务id + * @return 列表 + */ + List selectAssigneeByIds(List taskIdList); + /** * 按照任务id查询任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 43061e30d..26a307c7d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; @@ -12,7 +13,6 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; -import org.dromara.workflow.service.AssigneeService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -61,7 +61,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.*; @Slf4j @RequiredArgsConstructor @Service -public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { +public class FlwTaskServiceImpl implements IFlwTaskService { private final TaskService taskService; private final InsService insService; @@ -417,16 +417,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @return 任务办理人名称串逗号分隔 */ @Override - public String selectAssigneeByIds(String taskIds) { + public String selectAssigneeNamesByIds(String taskIds) { if (StringUtils.isBlank(taskIds)) { return null; } - List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds)) - , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); - // 获取处理用户的昵称并将其合并为一个字符串 - return WorkflowUtils.getHandlerUser(userList).stream() - .map(UserDTO::getNickName) - .collect(Collectors.joining(",")); + List taskIdList = StringUtils.splitTo(taskIds, Convert::toLong); + List list = this.selectAssigneeByIds(taskIdList); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, UserDTO::getNickName); } /** @@ -436,7 +436,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @return 列表 */ @Override - public List selectByIds(List taskIdList) { + public List selectAssigneeByIds(List taskIdList) { if (CollUtil.isEmpty(taskIdList)) { return Collections.emptyList(); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java index 52d5fa4ff..b02398055 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java @@ -3,9 +3,9 @@ package org.dromara.workflow.service.impl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.core.TranslationInterface; -import org.dromara.workflow.service.AssigneeService; +import org.dromara.workflow.constant.WfConstant; +import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; /** @@ -16,17 +16,17 @@ import org.springframework.stereotype.Service; @Slf4j @RequiredArgsConstructor @Service -@TranslationType(type = TransConstant.TASK_ID_TO_ASSIGNEE) +@TranslationType(type = WfConstant.TASK_ID_TO_ASSIGNEE) public class TaskAssigneeTranslationImpl implements TranslationInterface { - private final AssigneeService assigneeService; + private final IFlwTaskService flwTaskService; @Override public String translation(Object key, String other) { if (key instanceof Long id) { - return assigneeService.selectAssigneeByIds(id.toString()); + return flwTaskService.selectAssigneeNamesByIds(id.toString()); } else if (key instanceof String id) { - return assigneeService.selectAssigneeByIds(id); + return flwTaskService.selectAssigneeNamesByIds(id); } return null; } From 8a2ee6d61e0ca7d31586380b07dba995c0c23618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 14 Dec 2024 23:58:17 +0800 Subject: [PATCH 153/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/constant/FlowConstant.java | 5 +++++ .../org/dromara/workflow/constant/WfConstant.java | 15 --------------- .../dromara/workflow/domain/vo/FlowTaskVo.java | 4 ++-- .../service/impl/TaskAssigneeTranslationImpl.java | 4 ++-- 4 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 18cc90678..9b62fd833 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -8,6 +8,11 @@ package org.dromara.workflow.common.constant; */ public interface FlowConstant { + /** + * 任务Id转任务办理人名称 + */ + String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; + /** * 流程发起人 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java deleted file mode 100644 index af3c2f13f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/constant/WfConstant.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.constant; - -/** - * 常量 - * - * @author Lion Li - */ -public interface WfConstant { - - /** - * 任务Id转任务办理人名称 - */ - String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 872392add..4e8fb8b09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -4,7 +4,7 @@ import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.entity.User; -import org.dromara.workflow.constant.WfConstant; +import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; import java.io.Serializable; @@ -124,7 +124,7 @@ public class FlowTaskVo implements Serializable { /** * 办理人名称 */ - @Translation(type = WfConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") + @Translation(type = FlowConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") private String transactorNames; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java index b02398055..9a67364b8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.core.TranslationInterface; -import org.dromara.workflow.constant.WfConstant; +import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; @@ -16,7 +16,7 @@ import org.springframework.stereotype.Service; @Slf4j @RequiredArgsConstructor @Service -@TranslationType(type = WfConstant.TASK_ID_TO_ASSIGNEE) +@TranslationType(type = FlowConstant.TASK_ID_TO_ASSIGNEE) public class TaskAssigneeTranslationImpl implements TranslationInterface { private final IFlwTaskService flwTaskService; From b9a6426c1a40acf90e834e0d3fc058571081e4dd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 00:22:21 +0800 Subject: [PATCH 154/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E5=8A=9E=E4=BA=BA=E6=9F=A5=E8=AF=A2=E9=94=99=E8=AF=AF=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 2 +- .../dromara/workflow/utils/WorkflowUtils.java | 15 +++++++---- script/bpmn/leave3.xml | 27 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 script/bpmn/leave3.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 93bd21494..8095defeb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -257,7 +257,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { for (FlowHisTaskVo flowHisTaskVo : flowHisTaskVos) { flowHisTaskVo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); flowHisTaskVo.setUpdateTime(null); - List allUser = flwTaskService.currentTaskAllUser(flowHisTaskVo.getTaskId()); + List allUser = flwTaskService.currentTaskAllUser(flowHisTaskVo.getId()); if (CollUtil.isNotEmpty(allUser)) { String join = StreamUtils.join(allUser, e -> String.valueOf(e.getUserId())); flowHisTaskVo.setApprover(join); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 0f50f2171..f16abb78c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -63,17 +63,22 @@ public class WorkflowUtils { return Set.of(); } Set list = new HashSet<>(); + Set processedBySet = new HashSet<>(); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { - FlowUser flowUser = new FlowUser(); - flowUser.setType(user.getType()); - flowUser.setProcessedBy(String.valueOf(dto.getUserId())); - flowUser.setAssociated(taskId); - list.add(flowUser); + String processedBy = String.valueOf(dto.getUserId()); + if (!processedBySet.contains(processedBy)) { + FlowUser flowUser = new FlowUser(); + flowUser.setType(user.getType()); + flowUser.setProcessedBy(processedBy); + flowUser.setAssociated(taskId); + list.add(flowUser); + processedBySet.add(processedBy); + } }); } } diff --git a/script/bpmn/leave3.xml b/script/bpmn/leave3.xml new file mode 100644 index 000000000..dcb385ee6 --- /dev/null +++ b/script/bpmn/leave3.xml @@ -0,0 +1,27 @@ + + + + + b7bbb571-06de-455c-8083-f83c07bf0b99 + + + 84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a + + + 4b7743cd-940c-431b-926f-e7b614fbf1fe + 762cb975-37d8-4276-b6db-79a4c3606394 + + + b66b6563-f9fe-41cc-a782-f7837bb6f3d2 + + + 23e7429e-2b47-4431-b93e-40db7c431ce6 + + + f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1 + + + + b66b6563-f9fe-41cc-a782-f7837bb6f3d2 + + From 02be6a4e9358026d481825aa746a09d56eb99492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 15 Dec 2024 00:26:07 +0800 Subject: [PATCH 155/227] =?UTF-8?q?Revert=20"update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E6=96=B9=E6=B3=95"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0185a468bdb790ace78a37c69dbccc61063b2945. --- .../org/dromara/system/mapper/SysDeptMapper.java | 12 ++++++++++++ .../main/resources/mapper/system/SysDeptMapper.xml | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 0f2c90667..b69624cf0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -3,6 +3,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; @@ -31,6 +32,17 @@ public interface SysDeptMapper extends BaseMapperPlus { }) List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 分页查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + }) + Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** * 统计指定部门ID的部门数量 * diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 6ad866f29..9057a0e22 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -18,6 +18,17 @@ from sys_dept ${ew.getCustomSqlSegment} + + From 722c1937a321cbe40a469d59d59ac1fc04d79f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 15 Dec 2024 00:27:36 +0800 Subject: [PATCH 156/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20workflow?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0doc=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 37c6cc10d..d195fafa3 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -23,6 +23,11 @@ ruoyi-common-sse + + org.dromara + ruoyi-common-doc + + org.dromara ruoyi-common-mail From 4b6493cfd5c876b77d1e7aceaad3e66fb2853fd9 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 01:37:52 +0800 Subject: [PATCH 157/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8A=9E=E7=90=86=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 5 - .../controller/FlwTaskController.java | 1 - .../workflow/domain/vo/FlowTaskVo.java | 9 +- .../workflow/service/IFlwTaskService.java | 24 ++--- .../service/impl/FlwTaskServiceImpl.java | 91 +++++++++---------- .../impl/TaskAssigneeTranslationImpl.java | 33 ------- .../dromara/workflow/utils/WorkflowUtils.java | 23 +---- 7 files changed, 61 insertions(+), 125 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 9b62fd833..18cc90678 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -8,11 +8,6 @@ package org.dromara.workflow.common.constant; */ public interface FlowConstant { - /** - * 任务Id转任务办理人名称 - */ - String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; - /** * 流程发起人 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 1e14130ec..ba4b3fc87 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -10,7 +10,6 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; -import org.dromara.warm.flow.core.entity.HisTask; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 4e8fb8b09..e56d4d1e5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -4,7 +4,6 @@ import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.entity.User; -import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; import java.io.Serializable; @@ -121,11 +120,15 @@ public class FlowTaskVo implements Serializable { @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "flowStatus", other = "wf_business_status") private String flowStatusName; + /** + * 办理人ids + */ + private String assigneeIds; + /** * 办理人名称 */ - @Translation(type = FlowConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") - private String transactorNames; + private String assigneeNames; /** * 抄送人id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 2bdb6714f..3f7a169c6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -114,22 +114,6 @@ public interface IFlwTaskService { */ boolean terminationTask(FlowTerminationBo bo); - /** - * 通过taskId查询对应的任务办理人 - * - * @param taskIds taskId串逗号分隔 - * @return 任务办理人名称串逗号分隔 - */ - String selectAssigneeNamesByIds(String taskIds); - - /** - * 通过taskId查询对应的任务办理人列表 - * - * @param taskIdList 任务id - * @return 列表 - */ - List selectAssigneeByIds(List taskIdList); - /** * 按照任务id查询任务 * @@ -187,6 +171,14 @@ public interface IFlwTaskService { */ boolean taskOperation(TaskOperationBo bo, String taskOperation); + /** + * 获取任务所有办理人 + * + * @param taskIdList 任务id + * @return 结果 + */ + Map> currentTaskAllUser(List taskIdList); + /** * 获取当前任务的所有办理人 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 26a307c7d..aaf5bf4da 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -2,7 +2,6 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; @@ -76,6 +75,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final HisTaskService hisTaskService; private final IdentifierGenerator identifierGenerator; private final NodeService nodeService; + private final org.dromara.common.core.service.UserService sysUserService = SpringUtils.getBean(org.dromara.common.core.service.UserService.class); /** * 启动任务 @@ -182,7 +182,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 获取与当前任务关联的用户列表 List associatedUsers = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); if (CollUtil.isNotEmpty(associatedUsers)) { - userList.addAll(WorkflowUtils.getUser(associatedUsers, flowTask.getId())); + userList.addAll(WorkflowUtils.buildUser(associatedUsers, flowTask.getId())); } } // 批量删除现有任务的办理人记录 @@ -247,7 +247,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + Page page = getFlowTaskVoPage(pageQuery, queryWrapper); return TableDataInfo.build(page); } @@ -277,10 +277,27 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + Page page = getFlowTaskVoPage(pageQuery, queryWrapper); return TableDataInfo.build(page); } + private Page getFlowTaskVoPage(PageQuery pageQuery, QueryWrapper queryWrapper) { + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + List records = page.getRecords(); + if (CollUtil.isNotEmpty(records)) { + List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); + Map> listMap = currentTaskAllUser(taskIds); + records.forEach(t -> { + List userList = listMap.getOrDefault(t.getId(), Collections.emptyList()); + if (CollUtil.isNotEmpty(userList)) { + t.setAssigneeIds(StreamUtils.join(userList, e -> String.valueOf(e.getUserId()))); + t.setAssigneeNames(StreamUtils.join(userList, UserDTO::getNickName)); + } + }); + } + return page; + } + /** * 查询已办任务 * @@ -410,41 +427,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } - /** - * 通过taskId查询对应的任务办理人 - * - * @param taskIds taskId串逗号分隔 - * @return 任务办理人名称串逗号分隔 - */ - @Override - public String selectAssigneeNamesByIds(String taskIds) { - if (StringUtils.isBlank(taskIds)) { - return null; - } - List taskIdList = StringUtils.splitTo(taskIds, Convert::toLong); - List list = this.selectAssigneeByIds(taskIdList); - if (CollUtil.isEmpty(list)) { - return StringUtils.EMPTY; - } - return StreamUtils.join(list, UserDTO::getNickName); - } - - /** - * 通过taskId查询对应的任务办理人列表 - * - * @param taskIdList 任务id - * @return 列表 - */ - @Override - public List selectAssigneeByIds(List taskIdList) { - if (CollUtil.isEmpty(taskIdList)) { - return Collections.emptyList(); - } - List userList = userService.getByAssociateds(taskIdList - , UserType.APPROVAL.getKey(), UserType.TRANSFER.getKey(), UserType.DEPUTE.getKey()); - return WorkflowUtils.getHandlerUser(userList); - } - /** * 按照任务id查询任务 * @@ -637,6 +619,27 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return true; } + /** + * 获取任务所有办理人 + * + * @param taskIdList 任务id + */ + @Override + public Map> currentTaskAllUser(List taskIdList) { + Map> map = new HashMap<>(); + // 获取与当前任务关联的用户列表 + List associatedUsers = userService.getByAssociateds(taskIdList); + Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); + for (Map.Entry> entry : listMap.entrySet()) { + List value = entry.getValue(); + if (CollUtil.isNotEmpty(value)) { + List userDTOS = sysUserService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + map.put(entry.getKey(), userDTOS); + } + } + return map; + } + /** * 获取当前任务的所有办理人 * @@ -645,14 +648,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 - List associatedUsers = userService.getByAssociateds(Collections.singletonList(taskId)); - if (CollUtil.isEmpty(associatedUsers)) { + List userList = userService.getByAssociateds(Collections.singletonList(taskId)); + if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - Set users = WorkflowUtils.getUser(associatedUsers, taskId); - if (CollUtil.isEmpty(users)) { - return Collections.emptyList(); - } - return WorkflowUtils.getHandlerUser(new ArrayList<>(users)); + return sysUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java deleted file mode 100644 index 9a67364b8..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TaskAssigneeTranslationImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.workflow.service.impl; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.core.TranslationInterface; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.service.IFlwTaskService; -import org.springframework.stereotype.Service; - -/** - * 任务办理人翻译实现 - * - * @author AprilWind - */ -@Slf4j -@RequiredArgsConstructor -@Service -@TranslationType(type = FlowConstant.TASK_ID_TO_ASSIGNEE) -public class TaskAssigneeTranslationImpl implements TranslationInterface { - - private final IFlwTaskService flwTaskService; - - @Override - public String translation(Object key, String other) { - if (key instanceof Long id) { - return flwTaskService.selectAssigneeNamesByIds(id.toString()); - } else if (key instanceof String id) { - return flwTaskService.selectAssigneeNamesByIds(id); - } - return null; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index f16abb78c..0c5a0ad90 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -20,7 +20,6 @@ import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; -import java.util.stream.Collectors; /** @@ -34,31 +33,13 @@ public class WorkflowUtils { public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class); /** - * 获取办理人 - * - * @param userList 办理用户 - * @return 用户 - */ - public static List getHandlerUser(List userList) { - if (CollUtil.isEmpty(userList)) { - return Collections.emptyList(); - } - // 获取所有用户的 UserDTO 列表 - return new ArrayList<>(userList.stream() - .map(User::getProcessedBy) - .filter(Objects::nonNull) - .flatMap(processedBy -> taskAssigneeService.fetchUsersByStorageId(processedBy).stream()) - .collect(Collectors.toMap(UserDTO::getUserId, user -> user, (ex, rep) -> ex)).values()); - } - - /** - * 获取办理人 + * 构建工作流用户 * * @param userList 办理用户 * @param taskId 任务ID * @return 用户 */ - public static Set getUser(List userList, Long taskId) { + public static Set buildUser(List userList, Long taskId) { if (CollUtil.isEmpty(userList)) { return Set.of(); } From 0e96074dacb8983c3dd89db51742fb62828647f1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 14:11:01 +0800 Subject: [PATCH 158/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B9=B6?= =?UTF-8?q?=E8=A1=8C=E7=8E=AF=E8=8A=82=E6=92=A4=E9=94=80=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=E5=8A=9E=E7=90=86=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/BusinessStatusEnum.java | 79 +++++++++++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 55 +++++++++---- .../service/impl/FlwTaskServiceImpl.java | 38 ++++++--- .../impl/WfTaskAssigneeServiceImpl.java | 1 - .../dromara/workflow/utils/WorkflowUtils.java | 4 +- 5 files changed, 148 insertions(+), 29 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 2053bea47..b941760ca 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -3,6 +3,7 @@ package org.dromara.common.core.enums; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import java.util.ArrayList; @@ -141,4 +142,82 @@ public enum BusinessStatusEnum { return list; } + /** + * 启动流程校验 + * + * @param status 状态 + */ + public static void checkStartStatus(String status) { + if (WAITING.getStatus().equals(status)) { + throw new ServiceException("该单据已提交过申请,正在审批中!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 撤销流程校验 + * + * @param status 状态 + */ + public static void checkCancelStatus(String status) { + if (CANCEL.getStatus().equals(status)) { + throw new ServiceException("该单据已撤销!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (BACK.getStatus().equals(status)) { + throw new ServiceException("该单据已退回!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 驳回流程校验 + * + * @param status 状态 + */ + public static void checkBackStatus(String status) { + if (BACK.getStatus().equals(status)) { + throw new ServiceException("该单据已退回!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (CANCEL.getStatus().equals(status)) { + throw new ServiceException("该单据已撤销!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 作废,终止流程校验 + * + * @param status 状态 + */ + public static void checkInvalidStatus(String status) { + if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 8095defeb..9a02d164b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -20,22 +20,20 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.FlowFactory; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.Definition; -import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; +import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.utils.AssertUtil; import org.dromara.warm.flow.orm.entity.*; -import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; @@ -46,6 +44,7 @@ import org.dromara.workflow.domain.vo.VariableVo; import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,9 +64,9 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final InsService insService; private final DefService defService; private final FlowHisTaskMapper flowHisTaskMapper; + private final FlowTaskMapper flowTaskMapper; private final FlowInstanceMapper flowInstanceMapper; private final FlwInstanceMapper flwInstanceMapper; - private final FlowDefinitionMapper flowDefinitionMapper; private final TaskService taskService; private final FlowNodeMapper flowNodeMapper; private final NodeService nodeService; @@ -198,21 +197,44 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (definition == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } + BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); - //获取已发布的流程节点 List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definition.getId())); AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(nextNode.getNodeCode()); - flowParams.message(bo.getMessage()); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); - flowParams.ignore(true); - taskService.skip(list.get(0).getId(), flowParams); + for (Task task : list) { + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(nextNode.getNodeCode()); + flowParams.message(bo.getMessage()); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); + flowParams.ignore(true); + taskService.skip(task.getId(), flowParams); + } + //判断申请人节点是否有多个,只保留一个 + List currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); + if (CollUtil.isNotEmpty(currentTaskList)) { + Task task = currentTaskList.get(0); + if (currentTaskList.size() > 1) { + currentTaskList.remove(0); + List taskIds = StreamUtils.toList(currentTaskList, Task::getId); + WorkflowUtils.userService.deleteByTaskIds(taskIds); + flowTaskMapper.deleteByIds(taskIds); + } + //如果为空增加一个申请人 + List userList = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(task.getId())); + if (CollUtil.isEmpty(userList)) { + FlowUser flowUser = new FlowUser(); + flowUser.setAssociated(task.getId()); + flowUser.setProcessedBy(LoginHelper.getUserIdStr()); + flowUser.setType(UserType.APPROVAL.getKey()); + WorkflowUtils.userService.save(flowUser); + } + } + } catch (Exception e) { log.error("撤销失败: {}", e.getMessage(), e); throw new ServiceException(e.getMessage()); @@ -257,6 +279,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { for (FlowHisTaskVo flowHisTaskVo : flowHisTaskVos) { flowHisTaskVo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); flowHisTaskVo.setUpdateTime(null); + flowHisTaskVo.setRunDuration(null); List allUser = flwTaskService.currentTaskAllUser(flowHisTaskVo.getId()); if (CollUtil.isNotEmpty(allUser)) { String join = StreamUtils.join(allUser, e -> String.valueOf(e.getUserId())); @@ -390,6 +413,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Transactional(rollbackFor = Exception.class) public boolean processInvalid(FlowInvalidBo bo) { try { + Instance instance = insService.getById(bo.getId()); + if (instance != null) { + BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); + } List flowTaskList = flwTaskService.selectByInstId(bo.getId()); for (FlowTask flowTask : flowTaskList) { FlowParams flowParams = new FlowParams(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index aaf5bf4da..f63c87bad 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -75,7 +76,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final HisTaskService hisTaskService; private final IdentifierGenerator identifierGenerator; private final NodeService nodeService; - private final org.dromara.common.core.service.UserService sysUserService = SpringUtils.getBean(org.dromara.common.core.service.UserService.class); /** * 启动任务 @@ -98,6 +98,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) .eq(FlowInstance::getBusinessId, businessKey)); if (flowInstance != null) { + BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); } @@ -152,7 +153,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); - //消息通知 + // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { @@ -180,18 +181,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { // 获取与当前任务关联的用户列表 - List associatedUsers = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); + List associatedUsers = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(flowTask.getId())); if (CollUtil.isNotEmpty(associatedUsers)) { userList.addAll(WorkflowUtils.buildUser(associatedUsers, flowTask.getId())); } } // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + WorkflowUtils.userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); } // 确保要保存的 userList 不为空 if (CollUtil.isNotEmpty(userList)) { - userService.saveBatch(userList); + WorkflowUtils.userService.saveBatch(userList); } } @@ -232,7 +233,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return flowUser; }).collect(Collectors.toList()); // 批量保存抄送人员 - userService.saveBatch(userList); + WorkflowUtils.userService.saveBatch(userList); } /** @@ -350,6 +351,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (CollUtil.isEmpty(flowTasks)) { throw new ServiceException("任务不存在!"); } + Instance inst = insService.getById(flowTasks.get(0).getInstanceId()); + BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); Long definitionId = flowTasks.get(0).getDefinitionId(); Definition definition = defService.getById(definitionId); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); @@ -415,11 +418,20 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Transactional(rollbackFor = Exception.class) public boolean terminationTask(FlowTerminationBo bo) { try { + Long taskId = bo.getTaskId(); + Task task = taskService.getById(taskId); + if (task == null) { + throw new ServiceException("任务不存在!"); + } + Instance instance = insService.getById(task.getInstanceId()); + if (instance != null) { + BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); + } FlowParams flowParams = new FlowParams(); flowParams.message(bo.getComment()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); - taskService.termination(bo.getTaskId(), flowParams); + taskService.termination(taskId, flowParams); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -598,7 +610,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List flowTasks = selectByIdList(taskIdList); // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + WorkflowUtils.userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); List userList = flowTasks.stream() .map(flowTask -> { FlowUser flowUser = new FlowUser(); @@ -609,7 +621,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { }) .collect(Collectors.toList()); if (CollUtil.isNotEmpty(userList)) { - userService.saveBatch(userList); + WorkflowUtils.userService.saveBatch(userList); } } } catch (Exception e) { @@ -628,12 +640,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public Map> currentTaskAllUser(List taskIdList) { Map> map = new HashMap<>(); // 获取与当前任务关联的用户列表 - List associatedUsers = userService.getByAssociateds(taskIdList); + List associatedUsers = WorkflowUtils.userService.getByAssociateds(taskIdList); Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); if (CollUtil.isNotEmpty(value)) { - List userDTOS = sysUserService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + List userDTOS = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); map.put(entry.getKey(), userDTOS); } } @@ -648,10 +660,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 - List userList = userService.getByAssociateds(Collections.singletonList(taskId)); + List userList = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(taskId)); if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - return sysUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); + return userService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index 68c3660ae..77b82ebd0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -151,7 +151,6 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle case ROLE -> userService.selectUsersByRoleIds(ids); case DEPT -> userService.selectUsersByDeptIds(ids); case POST -> userService.selectUsersByPostIds(ids); - default -> Collections.emptyList(); }; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 0c5a0ad90..fa92c0259 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -13,6 +13,7 @@ import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.core.service.UserService; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.workflow.common.enums.MessageTypeEnum; @@ -31,6 +32,7 @@ import java.util.*; public class WorkflowUtils { public static final IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class); + public static final UserService userService = SpringUtils.getBean(UserService.class); /** * 构建工作流用户 @@ -77,7 +79,7 @@ public class WorkflowUtils { List userList = new ArrayList<>(); List list = iFlwTaskService.selectByInstId(instId); if (StringUtils.isBlank(message)) { - message = "有新的【" + flowName + "】单据已经提交至您的待办,请您及时处理。"; + message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; } for (Task task : list) { List users = iFlwTaskService.currentTaskAllUser(task.getId()); From 33e28daba635f897c0d9267331045b4fc0c7cd55 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 15:03:20 +0800 Subject: [PATCH 159/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E4=BC=9A?= =?UTF-8?q?=E7=AD=BE=20=E7=A5=A8=E7=AD=BE=E6=92=A4=E9=94=80=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 47 +++++++++++++++---- script/bpmn/leave4.xml | 20 ++++++++ 2 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 script/bpmn/leave4.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 9a02d164b..710ec8882 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -197,23 +197,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (definition == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } + String message = bo.getMessage(); BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); - List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); //获取已发布的流程节点 List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definition.getId())); AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); - for (Task task : list) { - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(nextNode.getNodeCode()); - flowParams.message(bo.getMessage()); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); - flowParams.ignore(true); - taskService.skip(task.getId(), flowParams); - } + //撤销 + cancelTask(message, instance, nextNode); //判断申请人节点是否有多个,只保留一个 List currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(currentTaskList)) { @@ -242,6 +235,39 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return true; } + /** + * 撤销流程 + * + * @param message 审批已经 + * @param instance 流程实例 + * @param nextNode 申请人节点 + */ + private void cancelTask(String message, Instance instance, Node nextNode) { + List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); + if (CollUtil.isNotEmpty(list)) { + List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(nextNode.getNodeCode())); + if (list.size() == tasks.size()) { + return; + } + } + for (Task task : list) { + List userList = flwTaskService.currentTaskAllUser(task.getId()); + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(nextNode.getNodeCode()); + flowParams.message(message); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); + flowParams.ignore(true); + //解决会签,或签撤销没权限问题 + if (CollUtil.isNotEmpty(userList)) { + flowParams.handler(userList.get(0).getUserId().toString()); + } + taskService.skip(task.getId(), flowParams); + } + //解决会签,或签多人审批问题 + cancelTask(message, instance, nextNode); + } + /** * 获取当前登陆人发起的流程实例 * @@ -423,6 +449,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { flowParams.message(bo.getComment()); flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus()) .hisStatus(TaskStatusEnum.INVALID.getStatus()); + flowParams.ignore(true); taskService.termination(flowTask.getId(), flowParams); } return true; diff --git a/script/bpmn/leave4.xml b/script/bpmn/leave4.xml new file mode 100644 index 000000000..f729e8c0c --- /dev/null +++ b/script/bpmn/leave4.xml @@ -0,0 +1,20 @@ + + + + + e90b98ef-35b4-410c-a663-bae8b7624b9f + + + 768b5b1a-6726-4d67-8853-4cc70d5b1045 + + + 2f9f2e21-9bcf-42a3-a07c-13037aad22d1 + + + 27461e01-3d9f-4530-8fe3-bd5ec7f9571f + + + b62b88c3-8d8d-4969-911e-2aaea219e7fc + + + From 5e47e7c261f041fa62a58d9b5eacad65e15dbba4 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 16:30:44 +0800 Subject: [PATCH 160/227] =?UTF-8?q?update=20=E6=8C=91=E6=88=98=E8=80=85?= =?UTF-8?q?=E9=A9=B3=E5=9B=9E=20=E6=92=A4=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 14 ++--- .../service/impl/FlwTaskServiceImpl.java | 62 +++++++++++++++---- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 710ec8882..d86bf5624 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -210,22 +210,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { //判断申请人节点是否有多个,只保留一个 List currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(currentTaskList)) { - Task task = currentTaskList.get(0); if (currentTaskList.size() > 1) { currentTaskList.remove(0); List taskIds = StreamUtils.toList(currentTaskList, Task::getId); WorkflowUtils.userService.deleteByTaskIds(taskIds); flowTaskMapper.deleteByIds(taskIds); } - //如果为空增加一个申请人 - List userList = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(task.getId())); - if (CollUtil.isEmpty(userList)) { - FlowUser flowUser = new FlowUser(); - flowUser.setAssociated(task.getId()); - flowUser.setProcessedBy(LoginHelper.getUserIdStr()); - flowUser.setType(UserType.APPROVAL.getKey()); - WorkflowUtils.userService.save(flowUser); - } } } catch (Exception e) { @@ -311,6 +301,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { String join = StreamUtils.join(allUser, e -> String.valueOf(e.getUserId())); flowHisTaskVo.setApprover(join); } + if (BusinessStatusEnum.isDraftOrCancelOrBack(flowInstance.getFlowStatus())) { + flowHisTaskVo.setApprover(LoginHelper.getUserIdStr()); + flowHisTaskVo.setApproveName(LoginHelper.getLoginUser().getNickname()); + } } list.addAll(flowHisTaskVos); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index f63c87bad..e674b2c6e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -22,6 +22,7 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.FlowFactory; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; @@ -347,6 +348,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Long taskId = bo.getTaskId(); String notice = bo.getNotice(); List messageType = bo.getMessageType(); + String message = bo.getMessage(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { throw new ServiceException("任务不存在!"); @@ -359,20 +361,23 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); //开始节点的下一节点 assert flowSkip != null; - String nextNodeCode = flowSkip.getNextNodeCode(); - - FlowParams flowParams = new FlowParams(); - flowParams.variable(bo.getVariables()); - flowParams.skipType(SkipType.PASS.getKey()); - if (nextNodeCode.equals(bo.getNodeCode())) { - flowParams.flowStatus(BusinessStatusEnum.BACK.getStatus()); + //申请人节点 + String applyUserNodeCode = flowSkip.getNextNodeCode(); + if (applyUserNodeCode.equals(bo.getNodeCode())) { + backApplyUser(message, inst, applyUserNodeCode); } else { - flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()); + List list = taskService.list(FlowFactory.newTask().setInstanceId(inst.getId())); + for (Task task : list) { + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(bo.getNodeCode()); + flowParams.message(message); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); + flowParams.ignore(true); + taskService.skip(task.getId(), flowParams); + } } - flowParams.hisStatus(TaskStatusEnum.BACK.getStatus()); - flowParams.message(bo.getMessage()); - flowParams.nodeCode(bo.getNodeCode()); - Instance instance = taskService.skip(taskId, flowParams); + Instance instance = insService.getById(inst.getId()); setHandler(instance, flowTasks.get(0), null); //消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); @@ -383,6 +388,39 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } + /** + * 退回 + * + * @param message 审批已经 + * @param instance 流程实例 + * @param applyUserNodeCode 申请人节点 + */ + private void backApplyUser(String message, Instance instance, String applyUserNodeCode) { + List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); + if (CollUtil.isNotEmpty(list)) { + List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(applyUserNodeCode)); + if (list.size() == tasks.size()) { + return; + } + } + for (Task task : list) { + List userList = currentTaskAllUser(task.getId()); + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(applyUserNodeCode); + flowParams.message(message); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(BusinessStatusEnum.BACK.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); + flowParams.ignore(true); + //解决会签,或签撤销没权限问题 + if (CollUtil.isNotEmpty(userList)) { + flowParams.handler(userList.get(0).getUserId().toString()); + } + taskService.skip(task.getId(), flowParams); + } + //解决会签,或签多人审批问题 + backApplyUser(message, instance, applyUserNodeCode); + } + /** * 获取可驳回节点 * From fc8e66299d891bdc28a6a03fbc8566b132188a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 15 Dec 2024 17:31:27 +0800 Subject: [PATCH 161/227] =?UTF-8?q?update=20=E8=A1=A8=E5=90=8D=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E7=BB=9F=E4=B8=80=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/GenTableServiceImpl.java | 2 +- ...roller.java => FlwCategoryController.java} | 34 ++-- .../{WfCategory.java => FlowCategory.java} | 4 +- .../workflow/domain/bo/CompleteTaskBo.java | 4 +- ...{WfCategoryBo.java => FlowCategoryBo.java} | 6 +- ...{WfCategoryVo.java => FlowCategoryVo.java} | 6 +- .../domain/vo/{WfCopy.java => FlowCopy.java} | 2 +- .../workflow/mapper/FlwCategoryMapper.java | 15 ++ .../workflow/mapper/WfCategoryMapper.java | 15 -- ...yService.java => IFlwCategoryService.java} | 14 +- ...vice.java => IFlwTaskAssigneeService.java} | 2 +- ...eImpl.java => FlwCategoryServiceImpl.java} | 36 ++--- .../service/impl/FlwInstanceServiceImpl.java | 2 +- ...l.java => FlwTaskAssigneeServiceImpl.java} | 11 +- .../service/impl/FlwTaskServiceImpl.java | 42 ++--- .../dromara/workflow/utils/WorkflowUtils.java | 25 ++- ...tegoryMapper.xml => FlwCategoryMapper.xml} | 2 +- script/sql/ry_workflow.sql | 149 +++++++----------- 18 files changed, 172 insertions(+), 199 deletions(-) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/{WfCategoryController.java => FlwCategoryController.java} (68%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/{WfCategory.java => FlowCategory.java} (90%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/{WfCategoryBo.java => FlowCategoryBo.java} (85%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/{WfCategoryVo.java => FlowCategoryVo.java} (85%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/{WfCopy.java => FlowCopy.java} (87%) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/{IWfCategoryService.java => IFlwCategoryService.java} (59%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/{IWfTaskAssigneeService.java => IFlwTaskAssigneeService.java} (92%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/{WfCategoryServiceImpl.java => FlwCategoryServiceImpl.java} (59%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/{WfTaskAssigneeServiceImpl.java => FlwTaskAssigneeServiceImpl.java} (95%) rename ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/{WfCategoryMapper.xml => FlwCategoryMapper.xml} (71%) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 7eb99eb59..c4cdda35a 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -63,7 +63,7 @@ public class GenTableServiceImpl implements IGenTableService { private final GenTableColumnMapper genTableColumnMapper; private final IdentifierGenerator identifierGenerator; - private static final String[] TABLE_IGNORE = new String[]{"sj_", "act_", "flw_", "gen_"}; + private static final String[] TABLE_IGNORE = new String[]{"sj_", "flow_", "gen_"}; /** * 查询业务字段列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java similarity index 68% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 8dced8929..c33ba952b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -13,9 +13,9 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.WfCategoryBo; -import org.dromara.workflow.domain.vo.WfCategoryVo; -import org.dromara.workflow.service.IWfCategoryService; +import org.dromara.workflow.domain.bo.FlowCategoryBo; +import org.dromara.workflow.domain.vo.FlowCategoryVo; +import org.dromara.workflow.service.IFlwCategoryService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,17 +31,17 @@ import java.util.List; @RequiredArgsConstructor @RestController @RequestMapping("/workflow/category") -public class WfCategoryController extends BaseController { +public class FlwCategoryController extends BaseController { - private final IWfCategoryService wfCategoryService; + private final IFlwCategoryService FlowCategoryService; /** * 查询流程分类列表 */ @SaCheckPermission("workflow:category:list") @GetMapping("/list") - public R> list(WfCategoryBo bo) { - List list = wfCategoryService.queryList(bo); + public R> list(FlowCategoryBo bo) { + List list = FlowCategoryService.queryList(bo); return R.ok(list); } @@ -52,9 +52,9 @@ public class WfCategoryController extends BaseController { @SaCheckPermission("workflow:category:export") @Log(title = "流程分类", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(WfCategoryBo bo, HttpServletResponse response) { - List list = wfCategoryService.queryList(bo); - ExcelUtil.exportExcel(list, "流程分类", WfCategoryVo.class, response); + public void export(FlowCategoryBo bo, HttpServletResponse response) { + List list = FlowCategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "流程分类", FlowCategoryVo.class, response); } /** @@ -64,9 +64,9 @@ public class WfCategoryController extends BaseController { */ @SaCheckPermission("workflow:category:query") @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { - return R.ok(wfCategoryService.queryById(id)); + return R.ok(FlowCategoryService.queryById(id)); } /** @@ -76,8 +76,8 @@ public class WfCategoryController extends BaseController { @Log(title = "流程分类", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody WfCategoryBo bo) { - return toAjax(wfCategoryService.insertByBo(bo)); + public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo bo) { + return toAjax(FlowCategoryService.insertByBo(bo)); } /** @@ -87,8 +87,8 @@ public class WfCategoryController extends BaseController { @Log(title = "流程分类", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody WfCategoryBo bo) { - return toAjax(wfCategoryService.updateByBo(bo)); + public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo bo) { + return toAjax(FlowCategoryService.updateByBo(bo)); } /** @@ -101,6 +101,6 @@ public class WfCategoryController extends BaseController { @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { - return toAjax(wfCategoryService.deleteWithValidByIds(List.of(ids), true)); + return toAjax(FlowCategoryService.deleteWithValidByIds(List.of(ids), true)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java similarity index 90% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java index 657ca7e89..84f804961 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java @@ -16,8 +16,8 @@ import java.io.Serial; */ @Data @EqualsAndHashCode(callSuper = true) -@TableName("wf_category") -public class WfCategory extends TenantEntity { +@TableName("flow_category") +public class FlowCategory extends TenantEntity { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 255ee54a0..59b6c36f1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -3,7 +3,7 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; -import org.dromara.workflow.domain.vo.WfCopy; +import org.dromara.workflow.domain.vo.FlowCopy; import java.io.Serial; import java.io.Serializable; @@ -37,7 +37,7 @@ public class CompleteTaskBo implements Serializable { /** * 抄送人员 */ - private List wfCopyList; + private List FlowCopyList; /** * 消息类型 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java similarity index 85% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java index a5d772f72..e22f93638 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.FlowCategory; /** * 流程分类业务对象 wf_category @@ -18,8 +18,8 @@ import org.dromara.workflow.domain.WfCategory; */ @Data @EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfCategory.class, reverseConvertGenerate = false) -public class WfCategoryBo extends BaseEntity { +@AutoMapper(target = FlowCategory.class, reverseConvertGenerate = false) +public class FlowCategoryBo extends BaseEntity { /** * 主键 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java similarity index 85% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index 9424a3620..63739ceab 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -4,7 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.FlowCategory; import java.io.Serial; import java.io.Serializable; @@ -18,8 +18,8 @@ import java.io.Serializable; */ @Data @ExcelIgnoreUnannotated -@AutoMapper(target = WfCategory.class) -public class WfCategoryVo implements Serializable { +@AutoMapper(target = FlowCategory.class) +public class FlowCategoryVo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java similarity index 87% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java index 560b81435..1fd4646e5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java @@ -12,7 +12,7 @@ import java.io.Serializable; * @author may */ @Data -public class WfCopy implements Serializable { +public class FlowCopy implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java new file mode 100644 index 000000000..8ef357e87 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.FlowCategory; +import org.dromara.workflow.domain.vo.FlowCategoryVo; + +/** + * 流程分类Mapper接口 + * + * @author may + * @date 2023-06-27 + */ +public interface FlwCategoryMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java deleted file mode 100644 index 98aea024e..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.vo.WfCategoryVo; - -/** - * 流程分类Mapper接口 - * - * @author may - * @date 2023-06-27 - */ -public interface WfCategoryMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java similarity index 59% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java index 82cde8e7c..c38266e53 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java @@ -1,7 +1,7 @@ package org.dromara.workflow.service; -import org.dromara.workflow.domain.bo.WfCategoryBo; -import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.workflow.domain.bo.FlowCategoryBo; +import org.dromara.workflow.domain.vo.FlowCategoryVo; import java.util.Collection; import java.util.List; @@ -12,28 +12,28 @@ import java.util.List; * @author may * @date 2023-06-28 */ -public interface IWfCategoryService { +public interface IFlwCategoryService { /** * 查询流程分类 */ - WfCategoryVo queryById(Long id); + FlowCategoryVo queryById(Long id); /** * 查询流程分类列表 */ - List queryList(WfCategoryBo bo); + List queryList(FlowCategoryBo bo); /** * 新增流程分类 */ - Boolean insertByBo(WfCategoryBo bo); + Boolean insertByBo(FlowCategoryBo bo); /** * 修改流程分类 */ - Boolean updateByBo(WfCategoryBo bo); + Boolean updateByBo(FlowCategoryBo bo); /** * 校验并批量删除流程分类信息 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java similarity index 92% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index 928c55c07..116cb74f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -9,7 +9,7 @@ import java.util.List; * * @author AprilWind */ -public interface IWfTaskAssigneeService { +public interface IFlwTaskAssigneeService { /** * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java similarity index 59% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 67f072c69..52e1c5203 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.bo.WfCategoryBo; -import org.dromara.workflow.domain.vo.WfCategoryVo; -import org.dromara.workflow.mapper.WfCategoryMapper; -import org.dromara.workflow.service.IWfCategoryService; +import org.dromara.workflow.domain.FlowCategory; +import org.dromara.workflow.domain.bo.FlowCategoryBo; +import org.dromara.workflow.domain.vo.FlowCategoryVo; +import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.service.IFlwCategoryService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,15 +24,15 @@ import java.util.List; */ @RequiredArgsConstructor @Service -public class WfCategoryServiceImpl implements IWfCategoryService { +public class FlwCategoryServiceImpl implements IFlwCategoryService { - private final WfCategoryMapper baseMapper; + private final FlwCategoryMapper baseMapper; /** * 查询流程分类 */ @Override - public WfCategoryVo queryById(Long id) { + public FlowCategoryVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -41,14 +41,14 @@ public class WfCategoryServiceImpl implements IWfCategoryService { * 查询流程分类列表 */ @Override - public List queryList(WfCategoryBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); + public List queryList(FlowCategoryBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } - private LambdaQueryWrapper buildQueryWrapper(WfCategoryBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), WfCategory::getCategoryName, bo.getCategoryName()); + private LambdaQueryWrapper buildQueryWrapper(FlowCategoryBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), FlowCategory::getCategoryName, bo.getCategoryName()); return lqw; } @@ -56,8 +56,8 @@ public class WfCategoryServiceImpl implements IWfCategoryService { * 新增流程分类 */ @Override - public Boolean insertByBo(WfCategoryBo bo) { - WfCategory add = MapstructUtils.convert(bo, WfCategory.class); + public Boolean insertByBo(FlowCategoryBo bo) { + FlowCategory add = MapstructUtils.convert(bo, FlowCategory.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { @@ -71,8 +71,8 @@ public class WfCategoryServiceImpl implements IWfCategoryService { */ @Override @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(WfCategoryBo bo) { - WfCategory update = MapstructUtils.convert(bo, WfCategory.class); + public Boolean updateByBo(FlowCategoryBo bo) { + FlowCategory update = MapstructUtils.convert(bo, FlowCategory.class); validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } @@ -80,7 +80,7 @@ public class WfCategoryServiceImpl implements IWfCategoryService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(WfCategory entity) { + private void validEntityBeforeSave(FlowCategory entity) { // 做一些数据校验,如唯一约束 } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index d86bf5624..ec8f25c0a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -213,7 +213,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (currentTaskList.size() > 1) { currentTaskList.remove(0); List taskIds = StreamUtils.toList(currentTaskList, Task::getId); - WorkflowUtils.userService.deleteByTaskIds(taskIds); + WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIds); flowTaskMapper.deleteByIds(taskIds); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java similarity index 95% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 77b82ebd0..28c1e8b04 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -9,9 +9,10 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.enums.FormatsType; -import org.dromara.common.core.service.*; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.service.TaskAssigneeService; +import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.ui.dto.HandlerFunDto; @@ -19,11 +20,11 @@ import org.dromara.warm.flow.ui.dto.HandlerQuery; import org.dromara.warm.flow.ui.dto.TreeFunDto; import org.dromara.warm.flow.ui.service.HandlerSelectService; import org.dromara.warm.flow.ui.vo.HandlerSelectVo; -import org.dromara.workflow.service.IWfTaskAssigneeService; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -35,7 +36,7 @@ import java.util.Optional; @Slf4j @RequiredArgsConstructor @Service -public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, HandlerSelectService { +public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, HandlerSelectService { private static final String DEFAULT_GROUP_NAME = "默认分组"; private final TaskAssigneeService taskAssigneeService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index e674b2c6e..5c30171bb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -39,7 +39,7 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; -import org.dromara.workflow.domain.vo.WfCopy; +import org.dromara.workflow.domain.vo.FlowCopy; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; @@ -135,7 +135,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List messageType = completeTaskBo.getMessageType(); String notice = completeTaskBo.getNotice(); // 获取抄送人 - List wfCopyList = completeTaskBo.getWfCopyList(); + List FlowCopyList = completeTaskBo.getFlowCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); // 获取流程定义信息 @@ -153,7 +153,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 - setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); + setHandler(taskService.skip(taskId, flowParams), flowTask, FlowCopyList); // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; @@ -168,32 +168,32 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * * @param instance 实例 * @param task (当前任务)未办理的任务 - * @param wfCopyList 抄送人 + * @param FlowCopyList 抄送人 */ - private void setHandler(Instance instance, FlowTask task, List wfCopyList) { + private void setHandler(Instance instance, FlowTask task, List FlowCopyList) { if (instance == null) { return; } //添加抄送人 - setCopy(task, wfCopyList); + setCopy(task, FlowCopyList); // 根据流程实例ID查询所有关联的任务 List flowTasks = selectByInstId(instance.getId()); List userList = new ArrayList<>(); // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { // 获取与当前任务关联的用户列表 - List associatedUsers = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(flowTask.getId())); + List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(flowTask.getId())); if (CollUtil.isNotEmpty(associatedUsers)) { userList.addAll(WorkflowUtils.buildUser(associatedUsers, flowTask.getId())); } } // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - WorkflowUtils.userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); } // 确保要保存的 userList 不为空 if (CollUtil.isNotEmpty(userList)) { - WorkflowUtils.userService.saveBatch(userList); + WorkflowUtils.getFlowUserService().saveBatch(userList); } } @@ -201,10 +201,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * 添加抄送人 * * @param task 任务信息 - * @param wfCopyList 抄送人 + * @param FlowCopyList 抄送人 */ - private void setCopy(FlowTask task, List wfCopyList) { - if (CollUtil.isEmpty(wfCopyList)) { + private void setCopy(FlowTask task, List FlowCopyList) { + if (CollUtil.isEmpty(FlowCopyList)) { return; } // 添加抄送人记录 @@ -220,21 +220,21 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = FlowParams.build(); flowParams.skipType(SkipType.NONE.getKey()); flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.message("【抄送给】" + StreamUtils.join(wfCopyList, WfCopy::getUserName)); + flowParams.message("【抄送给】" + StreamUtils.join(FlowCopyList, FlowCopy::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); hisTask.setUpdateTime(updateTime); hisTaskService.save(hisTask); - List userList = wfCopyList.stream() - .map(wfCopy -> { + List userList = FlowCopyList.stream() + .map(FlowCopy -> { FlowUser flowUser = new FlowUser(); flowUser.setType(TaskAssigneeType.COPY.getCode()); - flowUser.setProcessedBy(String.valueOf(wfCopy.getUserId())); + flowUser.setProcessedBy(String.valueOf(FlowCopy.getUserId())); flowUser.setAssociated(taskId); return flowUser; }).collect(Collectors.toList()); // 批量保存抄送人员 - WorkflowUtils.userService.saveBatch(userList); + WorkflowUtils.getFlowUserService().saveBatch(userList); } /** @@ -648,7 +648,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List flowTasks = selectByIdList(taskIdList); // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - WorkflowUtils.userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); List userList = flowTasks.stream() .map(flowTask -> { FlowUser flowUser = new FlowUser(); @@ -659,7 +659,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { }) .collect(Collectors.toList()); if (CollUtil.isNotEmpty(userList)) { - WorkflowUtils.userService.saveBatch(userList); + WorkflowUtils.getFlowUserService().saveBatch(userList); } } } catch (Exception e) { @@ -678,7 +678,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public Map> currentTaskAllUser(List taskIdList) { Map> map = new HashMap<>(); // 获取与当前任务关联的用户列表 - List associatedUsers = WorkflowUtils.userService.getByAssociateds(taskIdList); + List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); @@ -698,7 +698,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 - List userList = WorkflowUtils.userService.getByAssociateds(Collections.singletonList(taskId)); + List userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId)); if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index fa92c0259..9d17de346 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -17,10 +17,13 @@ import org.dromara.warm.flow.core.service.UserService; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; -import org.dromara.workflow.service.IWfTaskAssigneeService; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** @@ -30,9 +33,17 @@ import java.util.*; */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { - public static final IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); - public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class); - public static final UserService userService = SpringUtils.getBean(UserService.class); + + private static final IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); + private static final IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); + private static final UserService userService = SpringUtils.getBean(UserService.class); + + /** + * 获取工作流用户service + */ + public static UserService getFlowUserService() { + return userService; + } /** * 构建工作流用户 @@ -77,12 +88,12 @@ public class WorkflowUtils { */ public static void sendMessage(String flowName, Long instId, List messageType, String message) { List userList = new ArrayList<>(); - List list = iFlwTaskService.selectByInstId(instId); + List list = flwTaskService.selectByInstId(instId); if (StringUtils.isBlank(message)) { message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; } for (Task task : list) { - List users = iFlwTaskService.currentTaskAllUser(task.getId()); + List users = flwTaskService.currentTaskAllUser(task.getId()); if (CollUtil.isNotEmpty(users)) { userList.addAll(users); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml similarity index 71% rename from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml rename to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml index 4375cb2dd..10c948d85 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml @@ -2,6 +2,6 @@ - + diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 7882f24df..3e7f0295a 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -147,9 +147,9 @@ CREATE TABLE `flow_user` ) ENGINE=InnoDB COMMENT='流程用户表'; -- ---------------------------- --- 1、流程分类表 +-- 流程分类表 -- ---------------------------- -create table wf_category +create table flow_category ( id bigint(20) not null comment '流程分类ID', tenant_id varchar(20) default '000000' comment '租户编号', @@ -165,94 +165,11 @@ create table wf_category constraint uni_category_code unique (category_code), primary key (id) ) engine = innodb comment = '流程分类'; -INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, sysdate(), 1, sysdate()); + +INSERT INTO flow_category values (1, '000000', 'OA', 'OA', 0, 0, 103, 1, sysdate(), null, null); -- ---------------------------- --- 2、流程定义配置表 --- ---------------------------- -create table wf_definition_config -( - id bigint(20) not null comment '流程定义ID', - tenant_id varchar(20) default '000000' comment '租户编号', - table_name varchar(255) not null comment '表名', - definition_id varchar(255) not null comment '流程定义ID', - process_key varchar(255) not null comment '流程KEY', - version varchar(255) not null comment '流程版本', - create_dept bigint(20) null comment '创建部门', - create_by bigint(20) null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint(20) null comment '更新者', - update_time datetime null comment '更新时间', - remark varchar(500) default '' null comment '备注', - primary key (id), - constraint uni_definition_id unique (definition_id) -) engine = innodb comment '流程定义配置'; - -insert into sys_menu values ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(),NULL, NULL, ''); -insert into sys_menu values ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, - NULL, ''); -insert into sys_menu -values ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', - 'waiting', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', - 'finish', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', - '', 'my-copy', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', - '0', '0', '', 'process-definition', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', - '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', - 'workflow:category:list', 'category', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', - 'guide', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu -values ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), - NULL, NULL, ''); -insert into sys_menu -values ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', - '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); - --- 流程分类管理相关按钮 -insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1,sysdate(), null, null, ''); -insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1,sysdate(), null, null, ''); -insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1,sysdate(), null, null, ''); -insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103,1, sysdate(), null, null, ''); -insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103,1, sysdate(), null, null, ''); - -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by,update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, '2024-12-01 14:32:07', 1, '2024-12-13 17:53:59', '任务状态'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已撤销'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'待审核'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'已完成'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已作废'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已退回'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL,NULL, '已终止'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'自定义表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'动态表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:32:47', 1, '2024-12-01 14:32:55', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, '2024-12-01 14:33:07', 1, '2024-12-01 14:35:12', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:37:13', 1, '2024-12-01 14:37:13', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:37:52', 1, '2024-12-01 14:37:52', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:38:08', 1, '2024-12-01 14:38:08', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:38:24', 1, '2024-12-01 14:38:24', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:38:42', 1, '2024-12-01 14:38:42', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:13', 1, '2024-12-01 14:39:13', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:32', 1, '2024-12-01 14:39:37', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, '2024-12-01 14:39:55', 1, '2024-12-01 14:39:55', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:40:23', 1, '2024-12-01 14:40:23', ''); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, '2024-12-01 14:40:46', 1, '2024-12-01 14:40:46', ''); - --- ---------------------------- --- 6、请假单信息 +-- 请假单信息 -- ---------------------------- create table test_leave ( @@ -272,9 +189,53 @@ create table test_leave PRIMARY KEY (id) USING BTREE ) ENGINE = InnoDB COMMENT = '请假申请表'; -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103,1, sysdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate(),NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate(),NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(),NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate(),NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate(),NULL, NULL, ''); +insert into sys_menu values ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate(),NULL, NULL, ''); +insert into sys_menu values ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate(), NULL, NULL, ''); +-- 流程分类管理相关按钮 +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1,sysdate(), null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103,1, sysdate(), null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103,1, sysdate(), null, null, ''); +-- 请假测试相关按钮 +insert into sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +insert into sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); + +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, sysdate(), NULL, NULL, '任务状态'); +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate(), NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL,'已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate(), NULL,NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL,'自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL,'动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, sysdate(), NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, sysdate(), NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, sysdate(), NULL, NULL, '超时'); + From 1c2b492e56db796ec5396a342c037ac09d39f877 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 17:31:58 +0800 Subject: [PATCH 162/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index e674b2c6e..2f3555980 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -364,18 +364,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //申请人节点 String applyUserNodeCode = flowSkip.getNextNodeCode(); if (applyUserNodeCode.equals(bo.getNodeCode())) { - backApplyUser(message, inst, applyUserNodeCode); + backTask(message, inst, applyUserNodeCode, TaskStatusEnum.BACK.getStatus()); } else { - List list = taskService.list(FlowFactory.newTask().setInstanceId(inst.getId())); - for (Task task : list) { - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(bo.getNodeCode()); - flowParams.message(message); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); - flowParams.ignore(true); - taskService.skip(task.getId(), flowParams); - } + backTask(message, inst, bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus()); } Instance instance = insService.getById(inst.getId()); setHandler(instance, flowTasks.get(0), null); @@ -391,14 +382,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { /** * 退回 * - * @param message 审批已经 - * @param instance 流程实例 - * @param applyUserNodeCode 申请人节点 + * @param message 审批已经 + * @param instance 流程实例 + * @param targetNodeCode 驳回的节点 */ - private void backApplyUser(String message, Instance instance, String applyUserNodeCode) { + private void backTask(String message, Instance instance, String targetNodeCode, String status) { List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(list)) { - List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(applyUserNodeCode)); + List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); if (list.size() == tasks.size()) { return; } @@ -406,10 +397,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (Task task : list) { List userList = currentTaskAllUser(task.getId()); FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(applyUserNodeCode); + flowParams.nodeCode(targetNodeCode); flowParams.message(message); flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(BusinessStatusEnum.BACK.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); + flowParams.flowStatus(status).hisStatus(TaskStatusEnum.BACK.getStatus()); flowParams.ignore(true); //解决会签,或签撤销没权限问题 if (CollUtil.isNotEmpty(userList)) { @@ -418,7 +409,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { taskService.skip(task.getId(), flowParams); } //解决会签,或签多人审批问题 - backApplyUser(message, instance, applyUserNodeCode); + backTask(message, instance, targetNodeCode, status); } /** From 87afa637bab26418ac5cd2fb0635695c3d5191a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 15 Dec 2024 18:13:51 +0800 Subject: [PATCH 163/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=90=8D=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/CompleteTaskBo.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 59b6c36f1..e2182ca31 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -37,7 +37,7 @@ public class CompleteTaskBo implements Serializable { /** * 抄送人员 */ - private List FlowCopyList; + private List flowCopyList; /** * 消息类型 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 240ce4a37..a1f8cc8f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -135,7 +135,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List messageType = completeTaskBo.getMessageType(); String notice = completeTaskBo.getNotice(); // 获取抄送人 - List FlowCopyList = completeTaskBo.getFlowCopyList(); + List flowCopyList = completeTaskBo.getFlowCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); // 获取流程定义信息 @@ -153,7 +153,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 - setHandler(taskService.skip(taskId, flowParams), flowTask, FlowCopyList); + setHandler(taskService.skip(taskId, flowParams), flowTask, flowCopyList); // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; @@ -168,14 +168,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * * @param instance 实例 * @param task (当前任务)未办理的任务 - * @param FlowCopyList 抄送人 + * @param flowCopyList 抄送人 */ - private void setHandler(Instance instance, FlowTask task, List FlowCopyList) { + private void setHandler(Instance instance, FlowTask task, List flowCopyList) { if (instance == null) { return; } //添加抄送人 - setCopy(task, FlowCopyList); + setCopy(task, flowCopyList); // 根据流程实例ID查询所有关联的任务 List flowTasks = selectByInstId(instance.getId()); List userList = new ArrayList<>(); @@ -201,10 +201,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * 添加抄送人 * * @param task 任务信息 - * @param FlowCopyList 抄送人 + * @param flowCopyList 抄送人 */ - private void setCopy(FlowTask task, List FlowCopyList) { - if (CollUtil.isEmpty(FlowCopyList)) { + private void setCopy(FlowTask task, List flowCopyList) { + if (CollUtil.isEmpty(flowCopyList)) { return; } // 添加抄送人记录 @@ -220,16 +220,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = FlowParams.build(); flowParams.skipType(SkipType.NONE.getKey()); flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.message("【抄送给】" + StreamUtils.join(FlowCopyList, FlowCopy::getUserName)); + flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopy::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); hisTask.setUpdateTime(updateTime); hisTaskService.save(hisTask); - List userList = FlowCopyList.stream() - .map(FlowCopy -> { + List userList = flowCopyList.stream() + .map(flowCopy -> { FlowUser flowUser = new FlowUser(); flowUser.setType(TaskAssigneeType.COPY.getCode()); - flowUser.setProcessedBy(String.valueOf(FlowCopy.getUserId())); + flowUser.setProcessedBy(String.valueOf(flowCopy.getUserId())); flowUser.setAssociated(taskId); return flowUser; }).collect(Collectors.toList()); From bc61d90d515f36d183f11d225d8485ea5b9efe47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 15 Dec 2024 18:16:25 +0800 Subject: [PATCH 164/227] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E7=B1=BB?= =?UTF-8?q?=E5=88=AB=E6=9F=A5=E8=AF=A2=E6=9D=83=E9=99=90=20=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E6=9F=A5=E8=AF=A2=E4=B8=8D=E9=9C=80=E8=A6=81=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/controller/FlwCategoryController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index c33ba952b..95341a24d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -38,7 +38,6 @@ public class FlwCategoryController extends BaseController { /** * 查询流程分类列表 */ - @SaCheckPermission("workflow:category:list") @GetMapping("/list") public R> list(FlowCategoryBo bo) { List list = FlowCategoryService.queryList(bo); @@ -62,7 +61,6 @@ public class FlwCategoryController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("workflow:category:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { From 9221eae06d25464c66690409971a5cfb06525e52 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 15 Dec 2024 19:08:30 +0800 Subject: [PATCH 165/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E=20=E6=92=A4=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 36 +-------------- .../service/impl/FlwTaskServiceImpl.java | 44 +++---------------- .../dromara/workflow/utils/WorkflowUtils.java | 40 +++++++++++++++++ 3 files changed, 46 insertions(+), 74 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index ec8f25c0a..8c920bc9d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -23,7 +23,6 @@ import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; -import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.NodeService; @@ -206,7 +205,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); //撤销 - cancelTask(message, instance, nextNode); + WorkflowUtils.backTask(message, instance.getId(), nextNode.getNodeCode(), BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); //判断申请人节点是否有多个,只保留一个 List currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(currentTaskList)) { @@ -225,39 +224,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return true; } - /** - * 撤销流程 - * - * @param message 审批已经 - * @param instance 流程实例 - * @param nextNode 申请人节点 - */ - private void cancelTask(String message, Instance instance, Node nextNode) { - List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); - if (CollUtil.isNotEmpty(list)) { - List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(nextNode.getNodeCode())); - if (list.size() == tasks.size()) { - return; - } - } - for (Task task : list) { - List userList = flwTaskService.currentTaskAllUser(task.getId()); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(nextNode.getNodeCode()); - flowParams.message(message); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus()); - flowParams.ignore(true); - //解决会签,或签撤销没权限问题 - if (CollUtil.isNotEmpty(userList)) { - flowParams.handler(userList.get(0).getUserId().toString()); - } - taskService.skip(task.getId(), flowParams); - } - //解决会签,或签多人审批问题 - cancelTask(message, instance, nextNode); - } - /** * 获取当前登陆人发起的流程实例 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index a1f8cc8f3..a39455421 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -22,7 +22,6 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.FlowFactory; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; @@ -166,8 +165,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { /** * 设置办理人 * - * @param instance 实例 - * @param task (当前任务)未办理的任务 + * @param instance 实例 + * @param task (当前任务)未办理的任务 * @param flowCopyList 抄送人 */ private void setHandler(Instance instance, FlowTask task, List flowCopyList) { @@ -200,7 +199,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { /** * 添加抄送人 * - * @param task 任务信息 + * @param task 任务信息 * @param flowCopyList 抄送人 */ private void setCopy(FlowTask task, List flowCopyList) { @@ -364,9 +363,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //申请人节点 String applyUserNodeCode = flowSkip.getNextNodeCode(); if (applyUserNodeCode.equals(bo.getNodeCode())) { - backTask(message, inst, applyUserNodeCode, TaskStatusEnum.BACK.getStatus()); + WorkflowUtils.backTask(message, inst.getId(), applyUserNodeCode, TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus()); } else { - backTask(message, inst, bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus()); + WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus()); } Instance instance = insService.getById(inst.getId()); setHandler(instance, flowTasks.get(0), null); @@ -379,39 +378,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } - /** - * 退回 - * - * @param message 审批已经 - * @param instance 流程实例 - * @param targetNodeCode 驳回的节点 - */ - private void backTask(String message, Instance instance, String targetNodeCode, String status) { - List list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); - if (CollUtil.isNotEmpty(list)) { - List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); - if (list.size() == tasks.size()) { - return; - } - } - for (Task task : list) { - List userList = currentTaskAllUser(task.getId()); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(targetNodeCode); - flowParams.message(message); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(status).hisStatus(TaskStatusEnum.BACK.getStatus()); - flowParams.ignore(true); - //解决会签,或签撤销没权限问题 - if (CollUtil.isNotEmpty(userList)) { - flowParams.handler(userList.get(0).getUserId().toString()); - } - taskService.skip(task.getId(), flowParams); - } - //解决会签,或签多人审批问题 - backTask(message, instance, targetNodeCode, status); - } - /** * 获取可驳回节点 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 9d17de346..9d661ad70 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -11,8 +11,12 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.core.enums.SkipType; +import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.service.UserService; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; @@ -37,6 +41,7 @@ public class WorkflowUtils { private static final IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); private static final IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); private static final UserService userService = SpringUtils.getBean(UserService.class); + private static final TaskService taskService = SpringUtils.getBean(TaskService.class); /** * 获取工作流用户service @@ -123,4 +128,39 @@ public class WorkflowUtils { } } + /** + * 驳回 + * + * @param message 审批意见 + * @param instanceId 流程实例id + * @param targetNodeCode 目标节点 + * @param flowStatus 流程状态 + * @param flowHisStatus 节点操作状态 + */ + public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) { + List list = flwTaskService.selectByInstId(instanceId); + if (CollUtil.isNotEmpty(list)) { + List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); + if (list.size() == tasks.size()) { + return; + } + } + for (FlowTask task : list) { + List userList = flwTaskService.currentTaskAllUser(task.getId()); + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(targetNodeCode); + flowParams.message(message); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(flowStatus).hisStatus(flowHisStatus); + flowParams.ignore(true); + //解决会签,或签撤销没权限问题 + if (CollUtil.isNotEmpty(userList)) { + flowParams.handler(userList.get(0).getUserId().toString()); + } + taskService.skip(task.getId(), flowParams); + } + //解决会签,或签多人审批问题 + backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus); + } + } From b8f5a167c3cb896504c352d322972339a6231d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 16 Dec 2024 00:21:12 +0800 Subject: [PATCH 166/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E5=A4=A9=E6=95=B0=E4=B8=8D=E5=87=86=E7=A1=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/TestLeaveServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 23e9071e8..57fc81f63 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -16,7 +16,6 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.warm.flow.core.enums.FlowStatus; import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; @@ -85,7 +84,8 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @Override public TestLeaveVo insertByBo(TestLeaveBo bo) { long day = DateUtil.betweenDay(bo.getStartDate(), bo.getEndDate(), true); - bo.setLeaveDays((int) day); + // 截止日期也算一天 + bo.setLeaveDays((int) day + 1); TestLeave add = MapstructUtils.convert(bo, TestLeave.class); if (StringUtils.isBlank(add.getStatus())) { add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); From 6aefbac5202a1ecfc9eecba7b0667167c0ff13c5 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 09:34:20 +0800 Subject: [PATCH 167/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=B8=9A=E5=8A=A1=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index a39455421..34cfa9865 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; @@ -26,7 +27,6 @@ import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; -import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.service.*; import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; @@ -36,9 +36,9 @@ import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.FlowCopy; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; -import org.dromara.workflow.domain.vo.FlowCopy; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; @@ -97,7 +97,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { variables.put(BUSINESS_KEY, businessKey); FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) .eq(FlowInstance::getBusinessId, businessKey)); - if (flowInstance != null) { + if (ObjectUtil.isNotNull(flowInstance)) { BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); @@ -152,7 +152,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 - setHandler(taskService.skip(taskId, flowParams), flowTask, flowCopyList); + Instance instance = taskService.skip(taskId, flowParams); + this.setHandler(instance, flowTask, flowCopyList); // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; @@ -170,13 +171,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param flowCopyList 抄送人 */ private void setHandler(Instance instance, FlowTask task, List flowCopyList) { - if (instance == null) { + if (ObjectUtil.isNull(instance)) { return; } //添加抄送人 - setCopy(task, flowCopyList); + this.setCopy(task, flowCopyList); // 根据流程实例ID查询所有关联的任务 - List flowTasks = selectByInstId(instance.getId()); + List flowTasks = this.selectByInstId(instance.getId()); List userList = new ArrayList<>(); // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { @@ -368,7 +369,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus()); } Instance instance = insService.getById(inst.getId()); - setHandler(instance, flowTasks.get(0), null); + this.setHandler(instance, flowTasks.get(0), null); //消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; @@ -419,7 +420,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException("任务不存在!"); } Instance instance = insService.getById(task.getInstanceId()); - if (instance != null) { + if (ObjectUtil.isNotNull(instance)) { BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); } FlowParams flowParams = new FlowParams(); @@ -453,7 +454,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public FlowTaskVo selectById(Long taskId) { Task task = taskService.getById(taskId); - if (task == null) { + if (ObjectUtil.isNull(task)) { return null; } FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); @@ -602,14 +603,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return false; } try { - List flowTasks = selectByIdList(taskIdList); + List flowTasks = this.selectByIdList(taskIdList); // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); List userList = flowTasks.stream() .map(flowTask -> { FlowUser flowUser = new FlowUser(); - flowUser.setType(UserType.APPROVAL.getKey()); + flowUser.setType(TaskAssigneeType.APPROVER.getCode()); flowUser.setProcessedBy(userId); flowUser.setAssociated(flowTask.getId()); return flowUser; From c62df5cecfc49d81d7ad28350f64216022ba0984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 16 Dec 2024 10:44:27 +0800 Subject: [PATCH 168/227] =?UTF-8?q?update=20=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=9F=A5=E8=AF=A2=E8=BF=94=E5=9B=9E=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/workflow/FlwTaskMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index f0683680c..28537990f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -66,7 +66,7 @@ d.flow_name, d.flow_code, d.form_custom, - d.form_path, + COALESCE(t.form_path, d.form_path), d.version, uu.processed_by, uu.type, From 903b289591d93334a0b94ef22e4bb9cb5902bc57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 16 Dec 2024 10:51:11 +0800 Subject: [PATCH 169/227] =?UTF-8?q?update=20=E6=B5=81=E7=A8=8B=E6=A1=88?= =?UTF-8?q?=E4=BE=8B=20=E5=A2=9E=E5=8A=A0=E8=A1=A8=E5=8D=95=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/bpmn/leave1.xml | 2 +- script/bpmn/leave2.xml | 2 +- script/bpmn/leave3.xml | 2 +- script/bpmn/leave4.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/bpmn/leave1.xml b/script/bpmn/leave1.xml index 339e2b72b..1013eb24e 100644 --- a/script/bpmn/leave1.xml +++ b/script/bpmn/leave1.xml @@ -1,6 +1,6 @@ - + dd515cdd-59f6-446f-94ca-25ca062afb42 diff --git a/script/bpmn/leave2.xml b/script/bpmn/leave2.xml index bc0fdb2bb..38ec0a9d7 100644 --- a/script/bpmn/leave2.xml +++ b/script/bpmn/leave2.xml @@ -1,6 +1,6 @@ - + fdcae93b-b69c-498a-b231-09255e74bcbd diff --git a/script/bpmn/leave3.xml b/script/bpmn/leave3.xml index dcb385ee6..ffb8d9505 100644 --- a/script/bpmn/leave3.xml +++ b/script/bpmn/leave3.xml @@ -1,6 +1,6 @@ - + b7bbb571-06de-455c-8083-f83c07bf0b99 diff --git a/script/bpmn/leave4.xml b/script/bpmn/leave4.xml index f729e8c0c..9f46e0ce1 100644 --- a/script/bpmn/leave4.xml +++ b/script/bpmn/leave4.xml @@ -1,6 +1,6 @@ - + e90b98ef-35b4-410c-a663-bae8b7624b9f From 83334357704fa6e04328704ab481b561bd60570f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 16 Dec 2024 12:36:56 +0800 Subject: [PATCH 170/227] =?UTF-8?q?update=20=E5=AF=BC=E5=85=A5=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 4 ++-- .../service/IFlwDefinitionService.java | 2 +- .../service/impl/FlwDefinitionServiceImpl.java | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 2030f280c..dcda2ac54 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -143,8 +143,8 @@ public class FlwDefinitionController extends BaseController { @Log(title = "流程定义", businessType = BusinessType.IMPORT) @PostMapping("/importDef") @Transactional(rollbackFor = Exception.class) - public R importDef(MultipartFile file) { - return R.ok(iFlwDefinitionService.importXml(file)); + public R importDef(MultipartFile file, String category) { + return R.ok(iFlwDefinitionService.importXml(file, category)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 7386db256..9141bbfa1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -48,7 +48,7 @@ public interface IFlwDefinitionService { * @param file 文件 * @return 结果 */ - boolean importXml(MultipartFile file); + boolean importXml(MultipartFile file, String category); /** * 删除流程定义 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index eff1201d7..c2bcece55 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -15,9 +15,15 @@ import org.dom4j.io.XMLWriter; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.dto.FlowCombine; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Skip; import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.core.utils.FlowConfigUtil; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; @@ -85,9 +91,17 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { * @param file 文件 */ @Override - public boolean importXml(MultipartFile file) { + public boolean importXml(MultipartFile file, String category) { try { - defService.importXml(file.getInputStream()); + FlowCombine combine = FlowConfigUtil.readConfig(file.getInputStream()); + // 流程定义 + Definition definition = combine.getDefinition(); + definition.setCategory(category); + // 所有的流程节点 + List allNodes = combine.getAllNodes(); + // 所有的流程连线 + List allSkips = combine.getAllSkips(); + ReflectUtils.invoke(defService, "insertFlow", definition, allNodes, allSkips); } catch (Exception e) { log.error("导入流程定义错误: {}", e.getMessage(), e); throw new RuntimeException(e); From eba12bf2361562c32ba5f490a566f1580358579e Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 14:30:39 +0800 Subject: [PATCH 171/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=86=E7=B1=BB=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwCategoryController.java | 63 +++-- .../controller/FlwDefinitionController.java | 12 + .../controller/FlwTaskController.java | 1 - .../dromara/workflow/domain/FlowCategory.java | 43 ++- .../workflow/domain/bo/FlowCategoryBo.java | 36 ++- .../workflow/domain/vo/FlowCategoryVo.java | 58 +++- .../workflow/mapper/FlwCategoryMapper.java | 13 + .../workflow/service/IFlwCategoryService.java | 80 +++++- .../service/impl/FlwCategoryServiceImpl.java | 266 +++++++++++++++--- .../mapper/workflow/FlwCategoryMapper.xml | 4 + script/sql/ry_workflow.sql | 30 +- 11 files changed, 485 insertions(+), 121 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 95341a24d..4474ccd96 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -2,10 +2,11 @@ package org.dromara.workflow.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.excel.utils.ExcelUtil; @@ -25,7 +26,6 @@ import java.util.List; * 流程分类 * * @author may - * @date 2023-06-28 */ @Validated @RequiredArgsConstructor @@ -33,16 +33,16 @@ import java.util.List; @RequestMapping("/workflow/category") public class FlwCategoryController extends BaseController { - private final IFlwCategoryService FlowCategoryService; + private final IFlwCategoryService flwCategoryService; /** * 查询流程分类列表 */ + @SaCheckPermission("workflow:category:list") @GetMapping("/list") public R> list(FlowCategoryBo bo) { - List list = FlowCategoryService.queryList(bo); + List list = flwCategoryService.queryList(bo); return R.ok(list); - } /** @@ -52,19 +52,20 @@ public class FlwCategoryController extends BaseController { @Log(title = "流程分类", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(FlowCategoryBo bo, HttpServletResponse response) { - List list = FlowCategoryService.queryList(bo); + List list = flwCategoryService.queryList(bo); ExcelUtil.exportExcel(list, "流程分类", FlowCategoryVo.class, response); } /** * 获取流程分类详细信息 * - * @param id 主键 + * @param categoryId 主键 */ - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(FlowCategoryService.queryById(id)); + @SaCheckPermission("workflow:category:query") + @GetMapping("/{categoryId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long categoryId) { + flwCategoryService.checkCategoryDataScope(categoryId); + return R.ok(flwCategoryService.queryById(categoryId)); } /** @@ -74,8 +75,11 @@ public class FlwCategoryController extends BaseController { @Log(title = "流程分类", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo bo) { - return toAjax(FlowCategoryService.insertByBo(bo)); + public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo category) { + if (!flwCategoryService.checkCategoryNameUnique(category)) { + return R.fail("新增流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在"); + } + return toAjax(flwCategoryService.insertByBo(category)); } /** @@ -85,20 +89,39 @@ public class FlwCategoryController extends BaseController { @Log(title = "流程分类", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo bo) { - return toAjax(FlowCategoryService.updateByBo(bo)); + public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo category) { + Long categoryId = category.getCategoryId(); + flwCategoryService.checkCategoryDataScope(categoryId); + if (!flwCategoryService.checkCategoryNameUnique(category)) { + return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在"); + } else if (category.getParentId().equals(categoryId)) { + return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,上级流程分类不能是自己"); + } else if (StringUtils.equals(SystemConstants.DISABLE, category.getStatus())) { + if (flwCategoryService.selectNormalChildrenCategoryById(categoryId) > 0) { + return R.fail("该流程分类包含未停用的子流程分类!"); + } else if (flwCategoryService.checkCategoryExistDefinition(categoryId)) { + return R.fail("该部门下存在已分配流程定义,不能禁用!"); + } + } + return toAjax(flwCategoryService.updateByBo(category)); } /** * 删除流程分类 * - * @param ids 主键串 + * @param categoryId 主键 */ @SaCheckPermission("workflow:category:remove") @Log(title = "流程分类", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(FlowCategoryService.deleteWithValidByIds(List.of(ids), true)); + @DeleteMapping("/{categoryId}") + public R remove(@PathVariable Long categoryId) { + if (flwCategoryService.hasChildByCategoryId(categoryId)) { + return R.warn("存在下级流程分类,不允许删除"); + } + if (flwCategoryService.checkCategoryExistDefinition(categoryId)) { + return R.warn("流程分类存在流程定义,不允许删除"); + } + return toAjax(flwCategoryService.deleteWithValidById(categoryId)); } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index dcda2ac54..5e33f639b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -1,5 +1,6 @@ package org.dromara.workflow.controller; +import cn.hutool.core.lang.tree.Tree; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -11,7 +12,9 @@ import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.workflow.domain.bo.FlowCategoryBo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.service.IFlwCategoryService; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -32,6 +35,7 @@ import java.util.List; @RequestMapping("/workflow/definition") public class FlwDefinitionController extends BaseController { + private final IFlwCategoryService flwCategoryService; private final IFlwDefinitionService iFlwDefinitionService; private final DefService defService; @@ -45,6 +49,14 @@ public class FlwDefinitionController extends BaseController { return iFlwDefinitionService.page(flowDefinition, pageQuery); } + /** + * 获取流程分类树列表 + */ + @GetMapping("/categoryTree") + public R>> categoryTree(FlowCategoryBo dept) { + return R.ok(flwCategoryService.selectCategoryTreeList(dept)); + } + /** * 获取历史流程定义列表 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index ba4b3fc87..36c65ea77 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -99,7 +99,6 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ - @GetMapping("/pageByAllTaskFinish") public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java index 84f804961..d84f3b1ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java @@ -1,6 +1,7 @@ package org.dromara.workflow.domain; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,25 +24,45 @@ public class FlowCategory extends TenantEntity { private static final long serialVersionUID = 1L; /** - * 主键 + * 流程分类ID */ - @TableId(value = "id") - private Long id; + @TableId(value = "category_id") + private Long categoryId; /** - * 分类名称 - */ - private String categoryName; - - /** - * 父级id + * 父流程分类id */ private Long parentId; /** - * 排序 + * 祖级列表 */ - private Long sortNum; + private String ancestors; + /** + * 流程分类名称 + */ + private String categoryName; + + /** + * 流程分类编码 + */ + private String categoryCode; + + /** + * 显示顺序 + */ + private Long orderNum; + + /** + * 流程分类状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java index e22f93638..c1f62f93d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java @@ -22,26 +22,36 @@ import org.dromara.workflow.domain.FlowCategory; public class FlowCategoryBo extends BaseEntity { /** - * 主键 + * 流程分类ID */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; + @NotNull(message = "流程分类ID不能为空", groups = { EditGroup.class }) + private Long categoryId; /** - * 分类名称 + * 父流程分类id */ - @NotBlank(message = "分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String categoryName; - - /** - * 父级id - */ - @NotNull(message = "父级id不能为空", groups = {AddGroup.class, EditGroup.class}) + @NotNull(message = "父流程分类id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long parentId; /** - * 排序 + * 流程分类名称 */ - private Long sortNum; + @NotBlank(message = "流程分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String categoryName; + + /** + * 流程分类编码 + */ + private String categoryCode; + + /** + * 显示顺序 + */ + private Long orderNum; + + /** + * 流程分类状态(0正常 1停用) + */ + private String status; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index 63739ceab..45e29a985 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -4,10 +4,13 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.workflow.domain.FlowCategory; import java.io.Serial; import java.io.Serializable; +import java.util.Date; /** @@ -25,28 +28,55 @@ public class FlowCategoryVo implements Serializable { private static final long serialVersionUID = 1L; /** - * 主键 + * 流程分类ID */ - @ExcelProperty(value = "主键") - private Long id; + @ExcelProperty(value = "流程分类ID") + private Long categoryId; /** - * 分类名称 + * 父部门id */ - @ExcelProperty(value = "分类名称") - private String categoryName; - - /** - * 父级id - */ - @ExcelProperty(value = "父级id") private Long parentId; /** - * 排序 + * 父部门名称 */ - @ExcelProperty(value = "排序") - private Long sortNum; + private String parentName; + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 流程分类名称 + */ + @ExcelProperty(value = "流程分类名称") + private String categoryName; + + /** + * 流程分类编码 + */ + @ExcelProperty(value = "流程分类编码") + private String categoryCode; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "显示顺序") + private Long orderNum; + + /** + * 流程分类状态(0正常 1停用) + */ + @ExcelProperty(value = "流程分类状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java index 8ef357e87..bad2465ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -1,5 +1,7 @@ package org.dromara.workflow.mapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.vo.FlowCategoryVo; @@ -12,4 +14,15 @@ import org.dromara.workflow.domain.vo.FlowCategoryVo; */ public interface FlwCategoryMapper extends BaseMapperPlus { + /** + * 统计指定流程分类ID的分类数量 + * + * @param categoryId 流程分类ID + * @return 该流程分类ID的分类数量 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "createDept") + }) + long countCategoryById(Long categoryId); + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java index c38266e53..9bc97c0ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java @@ -1,42 +1,102 @@ package org.dromara.workflow.service; +import cn.hutool.core.lang.tree.Tree; import org.dromara.workflow.domain.bo.FlowCategoryBo; import org.dromara.workflow.domain.vo.FlowCategoryVo; -import java.util.Collection; import java.util.List; /** * 流程分类Service接口 * * @author may - * @date 2023-06-28 */ public interface IFlwCategoryService { /** * 查询流程分类 + * + * @param categoryId 主键 + * @return 流程分类 */ - FlowCategoryVo queryById(Long id); - + FlowCategoryVo queryById(Long categoryId); /** - * 查询流程分类列表 + * 查询符合条件的流程分类列表 + * + * @param bo 查询条件 + * @return 流程分类列表 */ List queryList(FlowCategoryBo bo); /** - * 新增流程分类 + * 查询流程分类树结构信息 + * + * @param category 流程分类信息 + * @return 流程分类树信息集合 */ - Boolean insertByBo(FlowCategoryBo bo); + List> selectCategoryTreeList(FlowCategoryBo category); + + /** + * 校验流程分类是否有数据权限 + * + * @param categoryId 流程分类ID + */ + void checkCategoryDataScope(Long categoryId); + + /** + * 校验流程分类名称是否唯一 + * + * @param category 流程分类信息 + * @return 结果 + */ + boolean checkCategoryNameUnique(FlowCategoryBo category); + + /** + * 根据ID查询所有子流程分类数(正常状态) + * + * @param categoryId 流程分类ID + * @return 子流程分类数 + */ + long selectNormalChildrenCategoryById(Long categoryId); + + /** + * 查询流程分类是否存在流程定义 + * + * @param categoryId 流程分类ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkCategoryExistDefinition(Long categoryId); + + /** + * 是否存在流程分类子节点 + * + * @param categoryId 流程分类ID + * @return 结果 + */ + boolean hasChildByCategoryId(Long categoryId); + + /** + * 新增流程分类 + * + * @param bo 流程分类 + * @return 是否新增成功 + */ + int insertByBo(FlowCategoryBo bo); /** * 修改流程分类 + * + * @param bo 流程分类 + * @return 是否修改成功 */ - Boolean updateByBo(FlowCategoryBo bo); + int updateByBo(FlowCategoryBo bo); /** - * 校验并批量删除流程分类信息 + * 删除流程分类信息 + * + * @param categoryId 主键 + * @return 是否删除成功 */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + int deleteWithValidById(Long categoryId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 52e1c5203..6bef2348a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -1,44 +1,66 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.*; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.bo.FlowCategoryBo; import org.dromara.workflow.domain.vo.FlowCategoryVo; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.service.IFlwCategoryService; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.Collection; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** * 流程分类Service业务层处理 * * @author may - * @date 2023-06-28 */ @RequiredArgsConstructor @Service public class FlwCategoryServiceImpl implements IFlwCategoryService { private final FlwCategoryMapper baseMapper; + private final DefService defService; /** * 查询流程分类 + * + * @param categoryId 主键 + * @return 流程分类 */ @Override - public FlowCategoryVo queryById(Long id) { - return baseMapper.selectVoById(id); + public FlowCategoryVo queryById(Long categoryId) { + FlowCategoryVo category = baseMapper.selectVoById(categoryId); + if (ObjectUtil.isNull(category)) { + return null; + } + FlowCategoryVo parentCategory = baseMapper.selectVoOne(new LambdaQueryWrapper() + .select(FlowCategory::getCategoryName).eq(FlowCategory::getCategoryId, category.getParentId())); + category.setParentName(ObjectUtils.notNullGetter(parentCategory, FlowCategoryVo::getCategoryName)); + return category; } - /** - * 查询流程分类列表 + * 查询符合条件的流程分类列表 + * + * @param bo 查询条件 + * @return 流程分类列表 */ @Override public List queryList(FlowCategoryBo bo) { @@ -46,52 +68,220 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { return baseMapper.selectVoList(lqw); } + /** + * 查询流程分类树结构信息 + * + * @param category 流程分类信息 + * @return 流程分类树信息集合 + */ + @Override + public List> selectCategoryTreeList(FlowCategoryBo category) { + LambdaQueryWrapper lqw = buildQueryWrapper(category); + List categorys = baseMapper.selectVoList(lqw); + if (CollUtil.isEmpty(categorys)) { + return CollUtil.newArrayList(); + } + // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 + List> treeList = CollUtil.newArrayList(); + for (FlowCategoryVo d : categorys) { + Long parentId = d.getParentId(); + FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().longValue() == parentId); + if (ObjectUtil.isNull(categoryVo)) { + List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> + tree.setId(dept.getCategoryId()) + .setParentId(dept.getParentId()) + .setName(dept.getCategoryName()) + .setWeight(dept.getOrderNum()) + .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()))); + Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getCategoryId()); + treeList.add(tree); + } + } + return treeList; + } + + /** + * 校验流程分类是否有数据权限 + * + * @param categoryId 流程分类ID + */ + @Override + public void checkCategoryDataScope(Long categoryId) { + if (ObjectUtil.isNull(categoryId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (baseMapper.countCategoryById(categoryId) == 0) { + throw new ServiceException("没有权限访问流程分类数据!"); + } + } + + /** + * 校验流程分类名称是否唯一 + * + * @param category 流程分类信息 + * @return 结果 + */ + @Override + public boolean checkCategoryNameUnique(FlowCategoryBo category) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(FlowCategory::getCategoryName, category.getCategoryName()) + .eq(FlowCategory::getParentId, category.getParentId()) + .ne(ObjectUtil.isNotNull(category.getCategoryId()), FlowCategory::getCategoryId, category.getCategoryId())); + return !exist; + } + + /** + * 根据ID查询所有子流程分类数(正常状态) + * + * @param categoryId 流程分类ID + * @return 子流程分类数 + */ + @Override + public long selectNormalChildrenCategoryById(Long categoryId) { + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(FlowCategory::getStatus, SystemConstants.NORMAL) + .apply(DataBaseHelper.findInSet(categoryId, "ancestors"))); + } + + /** + * 查询流程分类是否存在流程定义 + * + * @param categoryId 流程分类ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkCategoryExistDefinition(Long categoryId) { + FlowDefinition definition = new FlowDefinition(); + definition.setCategory(categoryId.toString()); + return defService.exists(definition); + } + + /** + * 是否存在流程分类子节点 + * + * @param categoryId 流程分类ID + * @return 结果 + */ + @Override + public boolean hasChildByCategoryId(Long categoryId) { + return baseMapper.exists(new LambdaQueryWrapper() + .eq(FlowCategory::getParentId, categoryId)); + } + private LambdaQueryWrapper buildQueryWrapper(FlowCategoryBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(FlowCategory::getDelFlag, SystemConstants.NORMAL); + lqw.eq(ObjectUtil.isNotNull(bo.getCategoryId()), FlowCategory::getCategoryId, bo.getCategoryId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), FlowCategory::getParentId, bo.getParentId()); lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), FlowCategory::getCategoryName, bo.getCategoryName()); + lqw.like(StringUtils.isNotBlank(bo.getCategoryCode()), FlowCategory::getCategoryCode, bo.getCategoryCode()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), FlowCategory::getStatus, bo.getStatus()); + lqw.orderByAsc(FlowCategory::getAncestors); + lqw.orderByAsc(FlowCategory::getParentId); + lqw.orderByAsc(FlowCategory::getOrderNum); + lqw.orderByAsc(FlowCategory::getCategoryId); return lqw; } /** * 新增流程分类 + * + * @param bo 流程分类 + * @return 是否新增成功 */ @Override - public Boolean insertByBo(FlowCategoryBo bo) { - FlowCategory add = MapstructUtils.convert(bo, FlowCategory.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); + public int insertByBo(FlowCategoryBo bo) { + FlowCategory info = baseMapper.selectById(bo.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!SystemConstants.NORMAL.equals(info.getStatus())) { + throw new ServiceException("流程分类停用,不允许新增"); } - return flag; + FlowCategory category = MapstructUtils.convert(bo, FlowCategory.class); + category.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + category.getParentId()); + return baseMapper.insert(category); } /** * 修改流程分类 + * + * @param bo 流程分类 + * @return 是否修改成功 */ @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(FlowCategoryBo bo) { - FlowCategory update = MapstructUtils.convert(bo, FlowCategory.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(FlowCategory entity) { - // 做一些数据校验,如唯一约束 - } - - /** - * 批量删除流程分类 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - // 做一些业务上的校验,判断是否需要校验 + public int updateByBo(FlowCategoryBo bo) { + FlowCategory category = MapstructUtils.convert(bo, FlowCategory.class); + FlowCategory oldCategory = baseMapper.selectById(category.getCategoryId()); + if (ObjectUtil.isNull(oldCategory)) { + throw new ServiceException("流程分类不存在,无法修改"); } - return baseMapper.deleteByIds(ids) > 0; + if (!oldCategory.getParentId().equals(category.getParentId())) { + // 如果是新父流程分类 则校验是否具有新父流程分类权限 避免越权 + this.checkCategoryDataScope(category.getParentId()); + FlowCategory newParentCategory = baseMapper.selectById(category.getParentId()); + if (ObjectUtil.isNotNull(newParentCategory)) { + String newAncestors = newParentCategory.getAncestors() + StringUtils.SEPARATOR + newParentCategory.getCategoryId(); + String oldAncestors = oldCategory.getAncestors(); + category.setAncestors(newAncestors); + updateCategoryChildren(category.getCategoryId(), newAncestors, oldAncestors); + } + } else { + category.setAncestors(oldCategory.getAncestors()); + } + int result = baseMapper.updateById(category); + if (SystemConstants.NORMAL.equals(category.getStatus()) && StringUtils.isNotEmpty(category.getAncestors()) + && !StringUtils.equals(SystemConstants.NORMAL, category.getAncestors())) { + // 如果该流程分类是启用状态,则启用该流程分类的所有上级流程分类 + updateParentCategoryStatusNormal(category); + } + return result; + } + + /** + * 修改子元素关系 + * + * @param categoryId 被修改的流程分类ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateCategoryChildren(Long categoryId, String newAncestors, String oldAncestors) { + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply(DataBaseHelper.findInSet(categoryId, "ancestors"))); + List list = new ArrayList<>(); + for (FlowCategory child : children) { + FlowCategory category = new FlowCategory(); + category.setCategoryId(child.getCategoryId()); + category.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(category); + } + if (CollUtil.isNotEmpty(list)) { + baseMapper.updateBatchById(list); + } + } + + /** + * 修改该流程分类的父级流程分类状态 + * + * @param category 当前流程分类 + */ + private void updateParentCategoryStatusNormal(FlowCategory category) { + String ancestors = category.getAncestors(); + Long[] categoryIds = Convert.toLongArray(ancestors); + baseMapper.update(null, new LambdaUpdateWrapper() + .set(FlowCategory::getStatus, SystemConstants.NORMAL) + .in(FlowCategory::getCategoryId, Arrays.asList(categoryIds))); + } + + /** + * 删除流程分类信息 + * + * @param categoryId 主键 + * @return 是否删除成功 + */ + @Override + public int deleteWithValidById(Long categoryId) { + return baseMapper.deleteById(categoryId); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml index 10c948d85..e9918f1f2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml @@ -4,4 +4,8 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 3e7f0295a..93ccecc09 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -151,22 +151,24 @@ CREATE TABLE `flow_user` -- ---------------------------- create table flow_category ( - id bigint(20) not null comment '流程分类ID', - tenant_id varchar(20) default '000000' comment '租户编号', - category_name varchar(255) null comment '分类名称', - category_code varchar(255) null comment '分类编码', - parent_id bigint null comment '父级id', - sort_num int(19) null comment '排序', - create_dept bigint(20) null comment '创建部门', - create_by bigint(20) null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint(20) null comment '更新者', - update_time datetime null comment '更新时间', - constraint uni_category_code unique (category_code), - primary key (id) + category_id bigint(20) not null comment '流程分类ID', + tenant_id varchar(20) default '000000' comment '租户编号', + parent_id bigint(20) default 0 comment '父流程分类id', + ancestors varchar(500) default '' comment '祖级列表', + category_name varchar(30) not null comment '流程分类名称', + category_code varchar(100) default '' comment '流程分类编码', + order_num int(4) default 0 comment '显示顺序', + status char(1) default '0' comment '流程分类状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) null comment '创建部门', + create_by bigint(20) null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint(20) null comment '更新者', + update_time datetime null comment '更新时间', + primary key (category_id) ) engine = innodb comment = '流程分类'; -INSERT INTO flow_category values (1, '000000', 'OA', 'OA', 0, 0, 103, 1, sysdate(), null, null); +INSERT INTO flow_category values (1, '000000', 0, '0', 'OA', 'OA', 0, '0', '0', 103, 1, sysdate(), null, null); -- ---------------------------- -- 请假单信息 From 568ba3dcfe57198a82709fcf59d9f24d309665f3 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 14:44:16 +0800 Subject: [PATCH 172/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=88=97=E8=A1=A8=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 16 ++++++++-------- .../dromara/workflow/mapper/FlwDefMapper.java | 2 +- .../workflow/service/IFlwDefinitionService.java | 5 +++-- .../service/impl/FlwDefinitionServiceImpl.java | 14 +++++++------- .../resources/mapper/workflow/FlwDefMapper.xml | 3 ++- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 5e33f639b..092eb0d5a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -36,17 +36,17 @@ import java.util.List; public class FlwDefinitionController extends BaseController { private final IFlwCategoryService flwCategoryService; - private final IFlwDefinitionService iFlwDefinitionService; + private final IFlwDefinitionService flwDefinitionService; private final DefService defService; /** - * 分页查询 + * 查询流程定义列表 * * @param flowDefinition 参数 */ @GetMapping("/list") - public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { - return iFlwDefinitionService.page(flowDefinition, pageQuery); + public TableDataInfo list(FlowDefinition flowDefinition, PageQuery pageQuery) { + return flwDefinitionService.queryList(flowDefinition, pageQuery); } /** @@ -64,7 +64,7 @@ public class FlwDefinitionController extends BaseController { */ @GetMapping("/getHisListByKey/{flowCode}") public R> getHisListByKey(@PathVariable String flowCode) { - return R.ok(iFlwDefinitionService.getHisListByKey(flowCode)); + return R.ok(flwDefinitionService.getHisListByKey(flowCode)); } /** @@ -132,7 +132,7 @@ public class FlwDefinitionController extends BaseController { @DeleteMapping("/{ids}") @Transactional(rollbackFor = Exception.class) public R remove(@PathVariable List ids) { - return toAjax(iFlwDefinitionService.removeDef(ids)); + return toAjax(flwDefinitionService.removeDef(ids)); } /** @@ -156,7 +156,7 @@ public class FlwDefinitionController extends BaseController { @PostMapping("/importDef") @Transactional(rollbackFor = Exception.class) public R importDef(MultipartFile file, String category) { - return R.ok(iFlwDefinitionService.importXml(file, category)); + return R.ok(flwDefinitionService.importXml(file, category)); } /** @@ -169,7 +169,7 @@ public class FlwDefinitionController extends BaseController { @Log(title = "流程定义", businessType = BusinessType.EXPORT) @PostMapping("/exportDef/{id}") public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException { - iFlwDefinitionService.exportDef(id, response); + flwDefinitionService.exportDef(id, response); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java index d3608bd41..9b9af2a2e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java @@ -21,6 +21,6 @@ public interface FlwDefMapper { * @param queryWrapper 条件 * @return 结果 */ - Page page(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectDefinitionList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 9141bbfa1..08d3aba92 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -16,14 +16,15 @@ import java.util.List; * @author may */ public interface IFlwDefinitionService { + /** - * 分页查询 + * 查询流程定义列表 * * @param flowDefinition 参数 * @param pageQuery 分页 * @return 返回分页列表 */ - TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery); + TableDataInfo queryList(FlowDefinition flowDefinition, PageQuery pageQuery); /** * 获取历史流程定义列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index c2bcece55..ce4fa621d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -53,19 +53,19 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowHisTaskMapper flowHisTaskMapper; /** - * 分页查询 + * 查询流程定义列表 * - * @param flowDefinition 参数 + * @param flowDefinition 流程定义信息 * @return 返回分页列表 */ @Override - public TableDataInfo page(FlowDefinition flowDefinition, PageQuery pageQuery) { + public TableDataInfo queryList(FlowDefinition flowDefinition, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()),"flow_code", flowDefinition.getFlowCode()); - queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()),"flow_Name", flowDefinition.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowDefinition.getCategory()),"category", flowDefinition.getCategory()); + queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()), "flow_code", flowDefinition.getFlowCode()); + queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()), "flow_Name", flowDefinition.getFlowName()); + queryWrapper.eq(StringUtils.isNotBlank(flowDefinition.getCategory()), "category", flowDefinition.getCategory()); queryWrapper.orderByDesc("create_time"); - Page page = flwDefMapper.page(pageQuery.build(), queryWrapper); + Page page = flwDefMapper.selectDefinitionList(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); build.setTotal(page.getTotal()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index b965b13ff..64c99b485 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -3,7 +3,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - select * from ( select a.* From 640981b6d62c9d147dfe3809faf088c8da1a4f65 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 15:51:45 +0800 Subject: [PATCH 173/227] =?UTF-8?q?update=20=E6=A0=B9=E6=8D=AE=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=AF=B9=E8=B1=A1=E6=9E=84=E5=BB=BA=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=95=B0=E6=8D=AE=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/TaskAssigneeService.java | 2 - .../controller/FlwInstanceController.java | 24 +++++----- .../dromara/workflow/mapper/FlwDefMapper.java | 3 +- .../workflow/mapper/FlwInstanceMapper.java | 2 +- .../workflow/service/IFlwInstanceService.java | 6 +-- .../impl/FlwDefinitionServiceImpl.java | 8 ++-- .../service/impl/FlwInstanceServiceImpl.java | 47 +++++++++---------- .../service/impl/FlwTaskServiceImpl.java | 2 +- .../mapper/workflow/FlwDefMapper.xml | 20 +++++++- .../mapper/workflow/FlwInstanceMapper.xml | 5 +- 10 files changed, 67 insertions(+), 52 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java index cc976393b..9af669111 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java @@ -18,7 +18,6 @@ public interface TaskAssigneeService { */ TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery); - /** * 查询岗位并返回任务指派的列表,支持分页 * @@ -27,7 +26,6 @@ public interface TaskAssigneeService { */ TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery); - /** * 查询部门并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 2f58baf1d..569a179b0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -34,25 +34,25 @@ public class FlwInstanceController extends BaseController { private final InsService insService; /** - * 分页查询正在运行的流程实例 + * 查询正在运行的流程实例列表 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 */ @GetMapping("/pageByRunning") - public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - return flwInstanceService.pageByRunning(flowInstanceBo, pageQuery); + public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectRunningInstanceList(flowInstanceBo, pageQuery); } /** - * 分页查询已结束的流程实例 + * 查询已结束的流程实例列表 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 */ @GetMapping("/pageByFinish") - public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - return flwInstanceService.pageByFinish(flowInstanceBo, pageQuery); + public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery); } /** @@ -103,8 +103,8 @@ public class FlwInstanceController extends BaseController { * @param pageQuery 分页 */ @GetMapping("/pageByCurrent") - public TableDataInfo pageByCurrent(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - return flwInstanceService.pageByCurrent(flowInstanceBo, pageQuery); + public TableDataInfo selectCurrentInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectCurrentInstanceList(flowInstanceBo, pageQuery); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java index 9b9af2a2e..ba027486e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwDefMapper.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; /** * 实例信息Mapper接口 @@ -21,6 +22,6 @@ public interface FlwDefMapper { * @param queryWrapper 条件 * @return 结果 */ - Page selectDefinitionList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectDefinitionList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index bf63475f7..92809c80f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -22,6 +22,6 @@ public interface FlwInstanceMapper { * @param queryWrapper 条件 * @return 结果 */ - Page page(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectInstanceList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 3297f48d6..81c244ab2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -25,7 +25,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); + TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); /** * 分页查询已结束的流程实例 @@ -34,7 +34,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); + TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); /** * 按照业务id查询流程实例 @@ -91,7 +91,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo pageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery); + TableDataInfo selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery); /** * 获取流程图,流程记录 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index ce4fa621d..d0073d5f4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -47,6 +47,7 @@ import java.util.List; @RequiredArgsConstructor @Service public class FlwDefinitionServiceImpl implements IFlwDefinitionService { + private final DefService defService; private final FlowDefinitionMapper flowDefinitionMapper; private final FlwDefMapper flwDefMapper; @@ -65,11 +66,8 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()), "flow_Name", flowDefinition.getFlowName()); queryWrapper.eq(StringUtils.isNotBlank(flowDefinition.getCategory()), "category", flowDefinition.getCategory()); queryWrapper.orderByDesc("create_time"); - Page page = flwDefMapper.selectDefinitionList(pageQuery.build(), queryWrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); - build.setTotal(page.getTotal()); - return build; + Page page = flwDefMapper.selectDefinitionList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 8c920bc9d..2d7140602 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -20,7 +20,10 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.FlowFactory; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; -import org.dromara.warm.flow.core.entity.*; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.DefService; @@ -28,7 +31,10 @@ import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.utils.AssertUtil; -import org.dromara.warm.flow.orm.entity.*; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; @@ -78,14 +84,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo pageByRunning(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); - Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); - build.setTotal(page.getTotal()); - return build; + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** @@ -95,14 +98,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo pageByFinish(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); - Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); - build.setTotal(page.getTotal()); - return build; + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** @@ -227,18 +227,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 获取当前登陆人发起的流程实例 * - * @param instanceBo 参数 + * @param instanceBo 流程实例 * @param pageQuery 分页 */ @Override - public TableDataInfo pageByCurrent(FlowInstanceBo instanceBo, PageQuery pageQuery) { + public TableDataInfo selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(instanceBo); queryWrapper.eq("fi.create_by", LoginHelper.getUserIdStr()); - Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); - build.setTotal(page.getTotal()); - return build; + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** @@ -249,7 +246,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public Map flowImage(String businessId) { Map map = new HashMap<>(16); - FlowInstance flowInstance = selectInstByBusinessId(businessId); + FlowInstance flowInstance = this.selectInstByBusinessId(businessId); if (flowInstance == null) { throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); } @@ -357,10 +354,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (task == null) { FlowHisTask flowHisTask = flwTaskService.selectHisTaskById(taskId); if (flowHisTask != null) { - return selectInstById(flowHisTask.getInstanceId()); + return this.selectInstById(flowHisTask.getInstanceId()); } } else { - return selectInstById(task.getInstanceId()); + return this.selectInstById(task.getInstanceId()); } return null; } @@ -385,7 +382,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { instanceIds.add(flowHisTask.getInstanceId()); } if (!instanceIds.isEmpty()) { - return selectInstListByIdList(new ArrayList<>(instanceIds)); + return this.selectInstListByIdList(new ArrayList<>(instanceIds)); } return Collections.emptyList(); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 34cfa9865..79334214e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -249,7 +249,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - Page page = getFlowTaskVoPage(pageQuery, queryWrapper); + Page page = this.getFlowTaskVoPage(pageQuery, queryWrapper); return TableDataInfo.build(page); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index 64c99b485..98511f187 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -3,8 +3,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + + + - select * from ( select a.* diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 51c78faa3..003823e8a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -24,7 +24,8 @@ - select fi.id, fi.create_time, fi.update_time, @@ -44,6 +45,8 @@ fd.flow_code, fd.version, fi.create_by, + fd.form_custom, + fd.form_path, fd.category from flow_instance fi left join flow_definition fd on fi.definition_id = fd.id From 3d5c00f03d073d5cb0c8ed4a647eed4e83cc252c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 16:29:36 +0800 Subject: [PATCH 174/227] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=A0=B9=E6=8D=AE=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB?= =?UTF-8?q?ID=E6=9F=A5=E8=AF=A2=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 10 ++++++ .../workflow/domain/vo/FlowDefinitionVo.java | 8 +++++ .../workflow/service/IFlwCategoryService.java | 8 +++++ .../workflow/service/IFlwTaskService.java | 3 +- .../impl/CategoryNameTranslationImpl.java | 31 +++++++++++++++++++ .../service/impl/FlwCategoryServiceImpl.java | 19 ++++++++++++ .../service/impl/FlwInstanceServiceImpl.java | 4 +-- 7 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 18cc90678..e7a0580ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -48,4 +48,14 @@ public interface FlowConstant { */ String REDUCTION_SIGNATURE = "reductionSignature"; + /** + * 流程分类Id转名称 + */ + String CATEGORY_ID_TO_NAME = "category_id_to_name"; + + /** + * 流程分类名称 + */ + String FLOW_CATEGORY_NAME = "flow_category_name#30d"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java index 7e9bec3bf..0878d1e45 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.vo; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; import java.io.Serializable; @@ -54,6 +56,12 @@ public class FlowDefinitionVo implements Serializable { */ private String category; + /** + * 流程分类名称 + */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "category") + private String categoryName; + /** * 流程版本 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java index 9bc97c0ee..21f82c79d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java @@ -21,6 +21,14 @@ public interface IFlwCategoryService { */ FlowCategoryVo queryById(Long categoryId); + /** + * 根据流程分类ID查询流程分类名称 + * + * @param categoryId 流程分类ID + * @return 流程分类名称 + */ + String selectCategoryNameById(String categoryId); + /** * 查询符合条件的流程分类列表 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 3f7a169c6..dc027865f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -18,6 +18,7 @@ import java.util.Map; * @author may */ public interface IFlwTaskService { + /** * 启动任务 * @@ -26,7 +27,6 @@ public interface IFlwTaskService { */ Map startWorkFlow(StartProcessBo startProcessBo); - /** * 办理任务 * @@ -53,7 +53,6 @@ public interface IFlwTaskService { */ TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); - /** * 查询待办任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java new file mode 100644 index 000000000..4adbadaf7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.core.TranslationInterface; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.service.IFlwCategoryService; +import org.springframework.stereotype.Service; + +/** + * 流程分类名称翻译实现 + * + * @author AprilWind + */ +@Slf4j +@RequiredArgsConstructor +@Service +@TranslationType(type = FlowConstant.CATEGORY_ID_TO_NAME) +public class CategoryNameTranslationImpl implements TranslationInterface { + + private final IFlwCategoryService flwCategoryService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String categoryId) { + return flwCategoryService.selectCategoryNameById(categoryId); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 6bef2348a..4d2c41749 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -15,11 +15,14 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.bo.FlowCategoryBo; import org.dromara.workflow.domain.vo.FlowCategoryVo; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.service.IFlwCategoryService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,6 +59,20 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { return category; } + /** + * 根据流程分类ID查询流程分类名称 + * + * @param categoryId 流程分类ID + * @return 流程分类名称 + */ + @Cacheable(cacheNames = FlowConstant.FLOW_CATEGORY_NAME, key = "#categoryId") + @Override + public String selectCategoryNameById(String categoryId) { + FlowCategory category = baseMapper.selectOne(new LambdaQueryWrapper() + .select(FlowCategory::getCategoryName).eq(FlowCategory::getCategoryId, categoryId)); + return ObjectUtils.notNullGetter(category, FlowCategory::getCategoryName); + } + /** * 查询符合条件的流程分类列表 * @@ -210,6 +227,7 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { * @param bo 流程分类 * @return 是否修改成功 */ + @CacheEvict(cacheNames = FlowConstant.FLOW_CATEGORY_NAME, key = "#bo.categoryId") @Override public int updateByBo(FlowCategoryBo bo) { FlowCategory category = MapstructUtils.convert(bo, FlowCategory.class); @@ -280,6 +298,7 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { * @param categoryId 主键 * @return 是否删除成功 */ + @CacheEvict(cacheNames = FlowConstant.FLOW_CATEGORY_NAME, key = "#categoryId") @Override public int deleteWithValidById(Long categoryId) { return baseMapper.deleteById(categoryId); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 2d7140602..b1af57ba8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -80,7 +80,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询正在运行的流程实例 * - * @param flowInstanceBo 参数 + * @param flowInstanceBo 流程实例 * @param pageQuery 分页 */ @Override @@ -94,7 +94,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { /** * 分页查询已结束的流程实例 * - * @param flowInstanceBo 参数 + * @param flowInstanceBo 流程实例 * @param pageQuery 分页 */ @Override From 0d0725d53e33657d53f7d6236d98df40c3a7b859 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Dec 2024 17:08:11 +0800 Subject: [PATCH 175/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=A2=9E=E5=8A=A0=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E6=A0=91=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/mapper/FlwCategoryMapper.java | 16 ++++++++++++++++ .../service/impl/FlwDefinitionServiceImpl.java | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java index bad2465ac..91d455b18 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -1,11 +1,15 @@ package org.dromara.workflow.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.vo.FlowCategoryVo; +import java.util.List; + /** * 流程分类Mapper接口 * @@ -25,4 +29,16 @@ public interface FlwCategoryMapper extends BaseMapperPlus selectListByParentId(Long parentId) { + return this.selectList(new LambdaQueryWrapper() + .select(FlowCategory::getCategoryId) + .apply(DataBaseHelper.findInSet(parentId, "ancestors"))); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index d0073d5f4..42a4c3919 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -28,7 +29,9 @@ import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwDefMapper; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.stereotype.Service; @@ -37,6 +40,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; /** * 流程定义 服务层实现 @@ -52,6 +56,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowDefinitionMapper flowDefinitionMapper; private final FlwDefMapper flwDefMapper; private final FlowHisTaskMapper flowHisTaskMapper; + private final FlwCategoryMapper flwCategoryMapper; /** * 查询流程定义列表 @@ -64,7 +69,15 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()), "flow_code", flowDefinition.getFlowCode()); queryWrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()), "flow_Name", flowDefinition.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowDefinition.getCategory()), "category", flowDefinition.getCategory()); + if (StringUtils.isNotBlank(flowDefinition.getCategory())) { + Long categoryId = Convert.toLong(flowDefinition.getCategory()); + List categoryIds = flwCategoryMapper.selectListByParentId(categoryId) + .stream() + .map(FlowCategory::getCategoryId) + .collect(Collectors.toList()); + categoryIds.add(categoryId); + queryWrapper.in("category", categoryIds); + } queryWrapper.orderByDesc("create_time"); Page page = flwDefMapper.selectDefinitionList(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); From 1885b1445c5ef2f3345367eb4d0162198da8f349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 16 Dec 2024 17:22:16 +0800 Subject: [PATCH 176/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwDefinitionController.java | 6 ++- .../dromara/workflow/domain/FlowCategory.java | 5 --- .../workflow/domain/bo/FlowCategoryBo.java | 5 --- .../workflow/domain/vo/FlowCategoryVo.java | 10 +---- .../service/impl/FlwCategoryServiceImpl.java | 1 - .../mapper/workflow/FlwDefMapper.xml | 16 ------- .../mapper/workflow/FlwInstanceMapper.xml | 19 -------- .../mapper/workflow/FlwTaskMapper.xml | 43 +------------------ script/sql/ry_workflow.sql | 3 +- 9 files changed, 8 insertions(+), 100 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 092eb0d5a..d43fcefa7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -51,10 +51,12 @@ public class FlwDefinitionController extends BaseController { /** * 获取流程分类树列表 + * + * @param categoryBo 参数 */ @GetMapping("/categoryTree") - public R>> categoryTree(FlowCategoryBo dept) { - return R.ok(flwCategoryService.selectCategoryTreeList(dept)); + public R>> categoryTree(FlowCategoryBo categoryBo) { + return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java index d84f3b1ae..50c5049c4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java @@ -44,11 +44,6 @@ public class FlowCategory extends TenantEntity { */ private String categoryName; - /** - * 流程分类编码 - */ - private String categoryCode; - /** * 显示顺序 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java index c1f62f93d..97d221651 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java @@ -39,11 +39,6 @@ public class FlowCategoryBo extends BaseEntity { @NotBlank(message = "流程分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String categoryName; - /** - * 流程分类编码 - */ - private String categoryCode; - /** * 显示顺序 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index 45e29a985..120f4cc02 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -34,12 +34,12 @@ public class FlowCategoryVo implements Serializable { private Long categoryId; /** - * 父部门id + * 父级id */ private Long parentId; /** - * 父部门名称 + * 父类别名称 */ private String parentName; @@ -54,12 +54,6 @@ public class FlowCategoryVo implements Serializable { @ExcelProperty(value = "流程分类名称") private String categoryName; - /** - * 流程分类编码 - */ - @ExcelProperty(value = "流程分类编码") - private String categoryCode; - /** * 显示顺序 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 4d2c41749..7333d486d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -194,7 +194,6 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { lqw.eq(ObjectUtil.isNotNull(bo.getCategoryId()), FlowCategory::getCategoryId, bo.getCategoryId()); lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), FlowCategory::getParentId, bo.getParentId()); lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), FlowCategory::getCategoryName, bo.getCategoryName()); - lqw.like(StringUtils.isNotBlank(bo.getCategoryCode()), FlowCategory::getCategoryCode, bo.getCategoryCode()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), FlowCategory::getStatus, bo.getStatus()); lqw.orderByAsc(FlowCategory::getAncestors); lqw.orderByAsc(FlowCategory::getParentId); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml index 98511f187..d5204717c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwDefMapper.xml @@ -4,22 +4,6 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 28537990f..55e84a823 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -4,49 +4,8 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - select * from ( select a.id, diff --git a/script/bpmn/leave5.xml b/script/bpmn/leave5.xml new file mode 100644 index 000000000..049937bae --- /dev/null +++ b/script/bpmn/leave5.xml @@ -0,0 +1,27 @@ + + + + + e1b04e96-dc81-4858-a309-2fe945d2f374 + + + 3e743f4f-51ca-41d4-8e94-21f5dd9b59c9 + + + c80f273e-1f17-4bd8-9ad1-04a4a94ea862 + 1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4 + + + 1a20169e-3d82-4926-a151-e2daad28de1b + + + 7a8f0473-e409-442e-a843-5c2b813d00e9 + + + 03c4d2bc-58b5-4408-a2e4-65afb046f169 + + + + 1a20169e-3d82-4926-a151-e2daad28de1b + + From e745ccc0cb460dfb32ae54db7d0ae48b048583f3 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 17 Dec 2024 17:02:13 +0800 Subject: [PATCH 184/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwCategoryServiceImpl.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 42f1c5555..9aaccd698 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -192,13 +192,9 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { */ @Override public int insertByBo(FlowCategoryBo bo) { + FlowCategory info = baseMapper.selectById(bo.getParentId()); FlowCategory category = MapstructUtils.convert(bo, FlowCategory.class); - if(bo.getParentId().intValue()==0) { - category.setAncestors(SystemConstants.NORMAL); - }else{ - FlowCategory info = baseMapper.selectById(bo.getParentId()); - category.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + category.getParentId()); - } + category.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + category.getParentId()); return baseMapper.insert(category); } From 25aac02e2bca586833bb05e042cdd71d8fefac2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 17 Dec 2024 17:06:36 +0800 Subject: [PATCH 185/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 17c2771d4..28cf157a5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -44,7 +44,6 @@ import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.utils.WorkflowUtils; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -156,7 +155,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); // 消息通知 - sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -175,7 +174,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNull(instance)) { return; } - //添加抄送人 + // 添加抄送人 this.setCopy(task, flowCopyList); // 根据流程实例ID查询所有关联的任务 List flowTasks = this.selectByInstId(instance.getId()); @@ -204,7 +203,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param task 任务信息 * @param flowCopyList 抄送人 */ - @Async public void setCopy(FlowTask task, List flowCopyList) { if (CollUtil.isEmpty(flowCopyList)) { return; @@ -399,8 +397,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } this.setHandler(instance, task, null); - //消息通知 - sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + // 消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -408,18 +406,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } - /** - * 发送消息 - * - * @param flowName 流程定义名称 - * @param messageType 消息类型 - * @param notice 消息内容,为空则发送默认配置的消息内容 - */ - @Async - public void sendMessage(String flowName, Long instId, List messageType, String notice) { - WorkflowUtils.sendMessage(flowName, instId, messageType, notice); - } - /** * 获取可驳回节点 * From 00523af5bbcb7daa79b1dcb5e3260186bab5f44b Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 17 Dec 2024 18:04:28 +0800 Subject: [PATCH 186/227] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1id=E9=80=9A=E7=94=A8=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwInstanceServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b273a038f..b971842ce 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -107,6 +107,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getCategory()), "fd.category", flowInstanceBo.getCategory()); + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessKey()), "fi.business_id", flowInstanceBo.getBusinessKey()); queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); queryWrapper.eq("fi.del_flag", "0"); queryWrapper.orderByDesc("fi.create_time"); From f10ba97c7a21a8d12dd6758ef72e15d2b1a7bc78 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 17 Dec 2024 18:55:23 +0800 Subject: [PATCH 187/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/WorkflowServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index d460a5ed6..1e8773a46 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; @@ -39,7 +40,8 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatusByTaskId(Long taskId) { - return ObjectUtil.isNotNull(flwInstanceService.selectByTaskId(taskId)) ? flwInstanceService.selectByTaskId(taskId).getFlowStatus() : StringUtils.EMPTY; + FlowInstance flowInstance = flwInstanceService.selectByTaskId(taskId); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getFlowStatus() : StringUtils.EMPTY; } /** @@ -49,7 +51,8 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public String getBusinessStatus(String businessKey) { - return ObjectUtil.isNotNull(flwInstanceService.selectInstByBusinessId(businessKey)) ? flwInstanceService.selectInstByBusinessId(businessKey).getFlowStatus() : StringUtils.EMPTY; + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessKey); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getFlowStatus() : StringUtils.EMPTY; } /** @@ -71,6 +74,7 @@ public class WorkflowServiceImpl implements WorkflowService { */ @Override public Long getInstanceIdByBusinessKey(String businessKey) { - return ObjectUtil.isNotNull(flwInstanceService.selectInstByBusinessId(businessKey)) ? flwInstanceService.selectInstByBusinessId(businessKey).getId() : null; + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessKey); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getId() : null; } } From e9ed89a367bbb37484ca947a4b25f4ae9e65e1b9 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 17 Dec 2024 18:58:52 +0800 Subject: [PATCH 188/227] =?UTF-8?q?update=20=E7=BB=9F=E4=B8=80=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1id=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/event/ProcessEvent.java | 2 +- .../core/domain/event/ProcessTaskEvent.java | 2 +- .../common/core/service/WorkflowService.java | 8 ++++---- .../workflow/common/constant/FlowConstant.java | 2 +- .../workflow/domain/bo/FlowInstanceBo.java | 2 +- .../workflow/domain/bo/StartProcessBo.java | 2 +- .../handler/FlowProcessEventHandler.java | 16 ++++++++-------- .../service/impl/FlwInstanceServiceImpl.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 10 +++++----- .../service/impl/TestLeaveServiceImpl.java | 4 ++-- .../service/impl/WorkflowServiceImpl.java | 12 ++++++------ 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index df9eebcac..08b14cfe0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -25,7 +25,7 @@ public class ProcessEvent implements Serializable { /** * 业务id */ - private String businessKey; + private String businessId; /** * 状态 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java index d751bd0ae..dc7719239 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -35,6 +35,6 @@ public class ProcessTaskEvent implements Serializable { /** * 业务id */ - private String businessKey; + private String businessId; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 52d4877b7..5c30cf99f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -28,9 +28,9 @@ public interface WorkflowService { /** * 获取当前流程状态 * - * @param businessKey 业务id + * @param businessId 业务id */ - String getBusinessStatus(String businessKey); + String getBusinessStatus(String businessId); /** * 设置流程变量 @@ -43,8 +43,8 @@ public interface WorkflowService { /** * 按照业务id查询流程实例id * - * @param businessKey 业务id + * @param businessId 业务id * @return 结果 */ - Long getInstanceIdByBusinessKey(String businessKey); + Long getInstanceIdByBusinessKey(String businessId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index e7a0580ac..c747e23bf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -21,7 +21,7 @@ public interface FlowConstant { /** * 业务id */ - String BUSINESS_KEY = "businessKey"; + String BUSINESS_KEY = "businessId"; /** * 任务id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index 682eefc97..107b9a9ed 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -35,7 +35,7 @@ public class FlowInstanceBo implements Serializable { /** * 业务id */ - private String businessKey; + private String businessId; /** * 模型分类 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index 452354760..ea21a81e7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -26,7 +26,7 @@ public class StartProcessBo implements Serializable { * 业务唯一值id */ @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class}) - private String businessKey; + private String businessId; /** * 流程定义编码 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index f0ae46d20..78d8775ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -20,15 +20,15 @@ public class FlowProcessEventHandler { * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) * * @param flowCode 流程定义编码 - * @param businessKey 业务id + * @param businessId 业务id * @param status 状态 * @param submit 当为true时为申请人节点办理 */ - public void processHandler(String flowCode, String businessKey, String status, boolean submit) { - log.info("发布流程事件,流程状态: {}, 流程编码: {}, 业务ID: {}", status, flowCode, businessKey); + public void processHandler(String flowCode, String businessId, String status, boolean submit) { + log.info("发布流程事件,流程状态: {}, 流程编码: {}, 业务ID: {}", status, flowCode, businessId); ProcessEvent processEvent = new ProcessEvent(); processEvent.setFlowCode(flowCode); - processEvent.setBusinessKey(businessKey); + processEvent.setBusinessId(businessId); processEvent.setStatus(status); processEvent.setSubmit(submit); SpringUtils.context().publishEvent(processEvent); @@ -40,15 +40,15 @@ public class FlowProcessEventHandler { * @param flowCode 流程定义编码 * @param nodeCode 审批节点编码 * @param taskId 任务id - * @param businessKey 业务id + * @param businessId 业务id */ - public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) { - log.info("发布流程任务事件, 流程编码: {}, 业务ID: {}", flowCode, businessKey); + public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { + log.info("发布流程任务事件, 流程编码: {}, 业务ID: {}", flowCode, businessId); ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); processTaskEvent.setFlowCode(flowCode); processTaskEvent.setNodeCode(nodeCode); processTaskEvent.setTaskId(taskId); - processTaskEvent.setBusinessKey(businessKey); + processTaskEvent.setBusinessId(businessId); SpringUtils.context().publishEvent(processTaskEvent); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b971842ce..73fffb17c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -107,7 +107,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getCategory()), "fd.category", flowInstanceBo.getCategory()); - queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessKey()), "fi.business_id", flowInstanceBo.getBusinessKey()); + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessId()), "fi.business_id", flowInstanceBo.getBusinessId()); queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); queryWrapper.eq("fi.del_flag", "0"); queryWrapper.orderByDesc("fi.create_time"); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 28cf157a5..5e4368b4e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -85,8 +85,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override @Transactional(rollbackFor = Exception.class) public Map startWorkFlow(StartProcessBo startProcessBo) { - String businessKey = startProcessBo.getBusinessKey(); - if (StringUtils.isBlank(businessKey)) { + String businessId = startProcessBo.getBusinessId(); + if (StringUtils.isBlank(businessId)) { throw new ServiceException("启动工作流时必须包含业务ID"); } // 启动流程实例(提交申请) @@ -94,9 +94,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 流程发起人 variables.put(INITIATOR, LoginHelper.getUserIdStr()); // 业务id - variables.put(BUSINESS_KEY, businessKey); + variables.put(BUSINESS_KEY, businessId); FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) - .eq(FlowInstance::getBusinessId, businessKey)); + .eq(FlowInstance::getBusinessId, businessId)); if (ObjectUtil.isNotNull(flowInstance)) { BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); @@ -108,7 +108,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { - instance = insService.start(businessKey, flowParams); + instance = insService.start(businessId, flowParams); } catch (Exception e) { throw new ServiceException(e.getMessage()); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 57fc81f63..060f5d792 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -128,7 +128,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @EventListener(condition = "#processEvent.flowCode.startsWith('leave')") public void processHandler(ProcessEvent processEvent) { log.info("当前任务执行了{}", processEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey())); + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessId())); testLeave.setStatus(processEvent.getStatus()); if (processEvent.isSubmit()) { testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); @@ -149,7 +149,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @EventListener(condition = "#processTaskEvent.flowCode=='leave'") public void processTaskHandler(ProcessTaskEvent processTaskEvent) { log.info("当前任务执行了{}", processTaskEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessId())); testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); baseMapper.updateById(testLeave); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 1e8773a46..51cd6f15a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -47,11 +47,11 @@ public class WorkflowServiceImpl implements WorkflowService { /** * 获取当前流程状态 * - * @param businessKey 业务id + * @param businessId 业务id */ @Override - public String getBusinessStatus(String businessKey) { - FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessKey); + public String getBusinessStatus(String businessId) { + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessId); return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getFlowStatus() : StringUtils.EMPTY; } @@ -69,12 +69,12 @@ public class WorkflowServiceImpl implements WorkflowService { /** * 按照业务id查询流程实例id * - * @param businessKey 业务id + * @param businessId 业务id * @return 结果 */ @Override - public Long getInstanceIdByBusinessKey(String businessKey) { - FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessKey); + public Long getInstanceIdByBusinessKey(String businessId) { + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessId); return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getId() : null; } } From bb33a29fb37819d57487950a80565d8d45628ffb Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 17 Dec 2024 19:20:02 +0800 Subject: [PATCH 189/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwCategoryController.java | 15 +++++++++++++-- .../controller/FlwDefinitionController.java | 15 --------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 9783279c1..3f9da6349 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -1,12 +1,11 @@ package org.dromara.workflow.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.excel.utils.ExcelUtil; @@ -118,4 +117,16 @@ public class FlwCategoryController extends BaseController { return toAjax(flwCategoryService.deleteWithValidById(categoryId)); } + + + /** + * 获取流程分类树列表 + * + * @param categoryBo 参数 + */ + @GetMapping("/categoryTree") + public R>> categoryTree(FlowCategoryBo categoryBo) { + return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index b6a2dd171..9ed9f9b55 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -1,6 +1,5 @@ package org.dromara.workflow.controller; -import cn.hutool.core.lang.tree.Tree; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -13,9 +12,7 @@ import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; -import org.dromara.workflow.domain.bo.FlowCategoryBo; import org.dromara.workflow.domain.vo.FlowDefinitionVo; -import org.dromara.workflow.service.IFlwCategoryService; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -35,8 +32,6 @@ import java.util.List; @RestController @RequestMapping("/workflow/definition") public class FlwDefinitionController extends BaseController { - - private final IFlwCategoryService flwCategoryService; private final IFlwDefinitionService flwDefinitionService; private final DefService defService; @@ -50,16 +45,6 @@ public class FlwDefinitionController extends BaseController { return flwDefinitionService.queryList(flowDefinition, pageQuery); } - /** - * 获取流程分类树列表 - * - * @param categoryBo 参数 - */ - @GetMapping("/categoryTree") - public R>> categoryTree(FlowCategoryBo categoryBo) { - return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo)); - } - /** * 获取历史流程定义列表 * From ab8cd1098358ded4a93185fcea70dd85ec5db0dd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 17 Dec 2024 20:04:45 +0800 Subject: [PATCH 190/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/common/constant/FlowConstant.java | 2 +- .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index c747e23bf..1e75643f1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -21,7 +21,7 @@ public interface FlowConstant { /** * 业务id */ - String BUSINESS_KEY = "businessId"; + String BUSINESS_ID = "businessId"; /** * 任务id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 5e4368b4e..fdee39f22 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -94,7 +94,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 流程发起人 variables.put(INITIATOR, LoginHelper.getUserIdStr()); // 业务id - variables.put(BUSINESS_KEY, businessId); + variables.put(BUSINESS_ID, businessId); FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) .eq(FlowInstance::getBusinessId, businessId)); if (ObjectUtil.isNotNull(flowInstance)) { From d9c0d420a7a3e7bf4d43d6d49935c87953b635b6 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 18 Dec 2024 09:25:46 +0800 Subject: [PATCH 191/227] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E4=B8=9A=E5=8A=A1id=E6=9F=A5=E8=AF=A2=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E8=AF=A6=E7=BB=86=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwCategoryController.java | 4 +--- .../controller/FlwInstanceController.java | 10 ++++++++++ .../workflow/service/IFlwInstanceService.java | 20 +++++++++++++------ .../service/impl/FlwInstanceServiceImpl.java | 20 +++++++++++++++++++ .../mapper/workflow/FlwInstanceMapper.xml | 1 - 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 3f9da6349..99fa064df 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -117,12 +117,10 @@ public class FlwCategoryController extends BaseController { return toAjax(flwCategoryService.deleteWithValidById(categoryId)); } - - /** * 获取流程分类树列表 * - * @param categoryBo 参数 + * @param categoryBo 流程分类 */ @GetMapping("/categoryTree") public R>> categoryTree(FlowCategoryBo categoryBo) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index aeb4f20f3..2da037378 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -55,6 +55,16 @@ public class FlwInstanceController extends BaseController { return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery); } + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + */ + @GetMapping("/getInfo/{businessId}") + public R getInfo(@PathVariable Long businessId) { + return R.ok(flwInstanceService.queryByBusinessId(businessId)); + } + /** * 按照业务id删除流程实例 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 81c244ab2..97d84a280 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -21,8 +21,8 @@ public interface IFlwInstanceService { /** * 分页查询正在运行的流程实例 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 * @return 结果 */ TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); @@ -30,12 +30,20 @@ public interface IFlwInstanceService { /** * 分页查询已结束的流程实例 * - * @param flowInstanceBo 参数 - * @param pageQuery 分页 + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 * @return 结果 */ TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + * @return 结果 + */ + FlowInstanceVo queryByBusinessId(Long businessId); + /** * 按照业务id查询流程实例 * @@ -87,7 +95,7 @@ public interface IFlwInstanceService { /** * 获取当前登陆人发起的流程实例 * - * @param instanceBo 参数 + * @param instanceBo 流程实例 * @param pageQuery 分页 * @return 结果 */ @@ -144,7 +152,7 @@ public interface IFlwInstanceService { /** * 作废流程 * - * @param bo 参数 + * @param bo 流程实例 * @return 结果 */ boolean processInvalid(FlowInvalidBo bo); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 73fffb17c..5d20b05b1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -95,6 +95,26 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { return TableDataInfo.build(page); } + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + * @return 结果 + */ + @Override + public FlowInstanceVo queryByBusinessId(Long businessId) { + FlowInstance instance = this.selectInstByBusinessId(String.valueOf(businessId)); + FlowInstanceVo instanceVo = BeanUtil.toBean(instance, FlowInstanceVo.class); + Definition definition = defService.getById(instanceVo.getDefinitionId()); + instanceVo.setFlowName(definition.getFlowName()); + instanceVo.setFlowCode(definition.getFlowCode()); + instanceVo.setVersion(definition.getVersion()); + instanceVo.setFormCustom(definition.getFormCustom()); + instanceVo.setFormPath(definition.getFormPath()); + instanceVo.setCategory(definition.getCategory()); + return instanceVo; + } + /** * 通用查询条件 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index dc6d57ed2..30e2267dc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -25,7 +25,6 @@ fd.flow_name, fd.flow_code, fd.version, - fi.create_by, fd.form_custom, fd.form_path, fd.category From 4d07a35b1fd122f7b77a0751b295b98be2834515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 18 Dec 2024 10:12:29 +0800 Subject: [PATCH 192/227] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=8A=84?= =?UTF-8?q?=E9=80=81=E7=BC=BA=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E4=B8=8E=20=E5=B7=B2=E5=AE=8C=E6=88=90=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8F=96=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/workflow/FlwTaskMapper.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 754a8677f..45d2ccded 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -64,7 +64,8 @@ a.update_time, a.tenant_id, b.business_id, - c.form_path, + a.form_custom, + a.form_path, c.flow_name, c.flow_code, c.version, @@ -86,6 +87,8 @@ b.id , a.processed_by, c.flow_status, + b.form_custom, + b.form_path, c.business_id, a.create_time, b.node_name, From e26624a35165790cd2c9cbf37644abaa6bcee41e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 18 Dec 2024 10:27:56 +0800 Subject: [PATCH 193/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4sql=E4=B9=A6?= =?UTF-8?q?=E5=86=99=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/workflow/FlwTaskMapper.xml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 45d2ccded..18fd42d43 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -22,14 +22,14 @@ t.tenant_id, i.business_id, i.flow_status, + i.create_by, d.flow_name, d.flow_code, d.form_custom, COALESCE(t.form_path, d.form_path) as form_path, d.version, uu.processed_by, - uu.type, - i.create_by + uu.type from flow_task as t left join flow_user uu on uu.associated = t.id left join flow_definition d on t.definition_id = d.id @@ -57,19 +57,19 @@ a.definition_id, a.instance_id, a.flow_status flow_task_status, - b.flow_status, a.message, a.ext, a.create_time, a.update_time, a.tenant_id, - b.business_id, a.form_custom, a.form_path, + b.flow_status, + b.business_id, + b.create_by, c.flow_name, c.flow_code, - c.version, - b.create_by + c.version from flow_his_task a left join flow_instance b on a.instance_id = b.id left join flow_definition c on a.definition_id = c.id @@ -84,13 +84,13 @@ - select * - from ( - select a.* - from flow_definition a - join ( - select flow_code, - coalesce( - max(case when is_publish = 1 then version end), - max(version) - ) as version - from flow_definition where del_flag = '0' - group by flow_code - ) b on (a.flow_code = b.flow_code and a.version = b.version) - where a.del_flag = '0' - ) t - ${ew.getCustomSqlSegment} - - - From 07bc56baf7606e8405a42193c013a2cc0570f99c Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 5 Jan 2025 11:30:31 +0800 Subject: [PATCH 217/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=A7=9F=E6=88=B7=E5=90=8C=E6=AD=A5=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/WorkflowService.java | 7 ++ .../service/impl/SysTenantServiceImpl.java | 12 ++- .../controller/FlwDefinitionController.java | 5 +- .../service/IFlwDefinitionService.java | 19 +++- .../impl/FlwDefinitionServiceImpl.java | 91 +++++++++++++++++++ .../service/impl/WorkflowServiceImpl.java | 12 +++ 6 files changed, 141 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 0c036f3d7..d4592126a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -47,4 +47,11 @@ public interface WorkflowService { * @return 结果 */ Long getInstanceIdByBusinessId(String businessId); + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + void syncDef(String tenantId); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 7bfe989b9..856dabba5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -15,6 +15,7 @@ import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; @@ -56,6 +57,7 @@ public class SysTenantServiceImpl implements ISysTenantService { private final SysDictTypeMapper dictTypeMapper; private final SysDictDataMapper dictDataMapper; private final SysConfigMapper configMapper; + private final WorkflowService workflowService; /** * 查询租户 @@ -121,7 +123,9 @@ public class SysTenantServiceImpl implements ISysTenantService { // 获取所有租户编号 List tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); + new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> { + return Convert.toStr(x); + }); String tenantId = generateTenantId(tenantIds); add.setTenantId(tenantId); boolean flag = baseMapper.insert(add) > 0; @@ -191,6 +195,8 @@ public class SysTenantServiceImpl implements ISysTenantService { config.setTenantId(tenantId); } configMapper.insertBatch(sysConfigList); + //新增租户流程定义 + workflowService.syncDef(tenantId); return true; } @@ -399,7 +405,9 @@ public class SysTenantServiceImpl implements ISysTenantService { // 获取所有租户编号 List tenantIds = baseMapper.selectObjs( new LambdaQueryWrapper().select(SysTenant::getTenantId) - .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> {return Convert.toStr(x);}); + .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { + return Convert.toStr(x); + }); List saveTypeList = new ArrayList<>(); List saveDataList = new ArrayList<>(); Set set = new HashSet<>(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 6eb1df7b6..b125f0f28 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -104,7 +104,7 @@ public class FlwDefinitionController extends BaseController { @RepeatSubmit() @Transactional(rollbackFor = Exception.class) public R publish(@PathVariable Long id) { - return R.ok(defService.publish(id)); + return R.ok(flwDefinitionService.publish(id)); } /** @@ -146,7 +146,8 @@ public class FlwDefinitionController extends BaseController { /** * 导入流程定义 * - * @param file 文件 + * @param file 文件 + * @param category 分类 */ @Log(title = "流程定义", businessType = BusinessType.IMPORT) @PostMapping("/importDef") diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 85f23af00..6b5ca594a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -35,6 +35,15 @@ public interface IFlwDefinitionService { */ TableDataInfo unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery); + + /** + * 发布流程定义 + * + * @param id 流程定义id + * @return 结果 + */ + boolean publish(Long id); + /** * 导出流程定义 * @@ -47,7 +56,8 @@ public interface IFlwDefinitionService { /** * 导入流程定义 * - * @param file 文件 + * @param file 文件 + * @param category 分类 * @return 结果 */ boolean importXml(MultipartFile file, String category); @@ -59,4 +69,11 @@ public interface IFlwDefinitionService { * @return 结果 */ boolean removeDef(List ids); + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + void syncDef(String tenantId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index ed56ea1f3..0af0bbe41 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -19,23 +19,32 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.dto.FlowCombine; import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.PublishStatus; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.orm.entity.FlowSkip; import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.service.IFlwDefinitionService; +import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static org.dromara.common.core.constant.TenantConstants.DEFAULT_TENANT_ID; + /** * 流程定义 服务层实现 * @@ -51,6 +60,9 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowHisTaskMapper flowHisTaskMapper; private final FlwCategoryMapper flwCategoryMapper; + private final FlowNodeMapper flowNodeMapper; + private final FlowSkipMapper flowSkipMapper; + /** * 查询流程定义列表 * @@ -99,6 +111,29 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { return wrapper; } + /** + * 发布流程定义 + * + * @param id 流程定义id + */ + @Override + public boolean publish(Long id) { + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, id)); + List errorMsg = new ArrayList<>(); + if (CollUtil.isNotEmpty(flowNodes)) { + for (FlowNode flowNode : flowNodes) { + String applyNodeCode = WorkflowUtils.applyNodeCode(id); + if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) { + errorMsg.add(flowNode.getNodeName()); + } + } + if (CollUtil.isNotEmpty(errorMsg)) { + throw new ServiceException("节点【" + StringUtils.join(errorMsg, ",") + "】未配置办理人!"); + } + } + return defService.publish(id); + } + /** * 导入流程定义 * @@ -175,4 +210,60 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { } return true; } + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void syncDef(String tenantId) { + List flowDefinitions = flowDefinitionMapper.selectList(new LambdaQueryWrapper().eq(FlowDefinition::getTenantId, DEFAULT_TENANT_ID)); + if (CollUtil.isEmpty(flowDefinitions)) { + return; + } + List defIds = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().in(FlowNode::getDefinitionId, defIds)); + List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper().in(FlowSkip::getDefinitionId, defIds)); + for (FlowDefinition definition : flowDefinitions) { + FlowDefinition flowDefinition = BeanUtil.toBean(definition, FlowDefinition.class); + flowDefinition.setId(null); + flowDefinition.setTenantId(tenantId); + flowDefinition.setIsPublish(0); + flowDefinition.setCategory(null); + int insert = flowDefinitionMapper.insert(flowDefinition); + if (insert <= 0) { + log.info("同步流程定义【{}】失败!", definition.getFlowCode()); + continue; + } + log.info("同步流程定义【{}】成功!", definition.getFlowCode()); + Long definitionId = flowDefinition.getId(); + if (CollUtil.isNotEmpty(flowNodes)) { + List nodes = StreamUtils.filter(flowNodes, node -> node.getDefinitionId().equals(definition.getId())); + if (CollUtil.isNotEmpty(nodes)) { + List flowNodeList = BeanUtil.copyToList(nodes, FlowNode.class); + flowNodeList.forEach(e -> { + e.setId(null); + e.setDefinitionId(definitionId); + e.setTenantId(tenantId); + e.setPermissionFlag(null); + }); + flowNodeMapper.insertOrUpdate(flowNodeList); + } + } + if (CollUtil.isNotEmpty(flowSkips)) { + List skips = StreamUtils.filter(flowSkips, skip -> skip.getDefinitionId().equals(definition.getId())); + if (CollUtil.isNotEmpty(skips)) { + List flowSkipList = BeanUtil.copyToList(skips, FlowSkip.class); + flowSkipList.forEach(e -> { + e.setId(null); + e.setDefinitionId(definitionId); + e.setTenantId(tenantId); + }); + flowSkipMapper.insertOrUpdate(flowSkipList); + } + } + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index d08f7448b..7740fe679 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.workflow.service.IFlwDefinitionService; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.stereotype.Service; @@ -21,6 +22,7 @@ import java.util.Map; public class WorkflowServiceImpl implements WorkflowService { private final IFlwInstanceService flwInstanceService; + private final IFlwDefinitionService flwDefinitionService; /** * 删除流程实例 @@ -77,4 +79,14 @@ public class WorkflowServiceImpl implements WorkflowService { FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessId); return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getId() : null; } + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + @Override + public void syncDef(String tenantId) { + flwDefinitionService.syncDef(tenantId); + } } From ed192329c247e17e1254c72d21b769288a9e4713 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 7 Jan 2025 16:21:45 +0800 Subject: [PATCH 218/227] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9Eworkflow?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84sql=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_workflow.sql | 876 +++++++++++++----- script/sql/postgres/postgres_ry_workflow.sql | 660 +++++++------ .../sql/sqlserver/sqlserver_ry_workflow.sql | 729 ++++++--------- 3 files changed, 1316 insertions(+), 949 deletions(-) diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index 65474f45f..dd76fe801 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -1,261 +1,677 @@ -insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'model', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, sysdate, NULL, NULL, ''); - - --- 流程分类管理相关按钮 -insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate, null, null, ''); - --- 请假单信息 -create table TEST_LEAVE +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/oracle/oracle-wram-flow-all.sql +-- ---------------------------- +create table FLOW_DEFINITION ( - ID NUMBER(20) not null - constraint PK_TEST_LEAVE + ID NUMBER (20) not null + constraint FLOW_DEFINITION_PK primary key, - LEAVE_TYPE VARCHAR2(255), - START_DATE DATE, - END_DATE DATE, - LEAVE_DAYS NUMBER(10), - REMARK VARCHAR2(255), - STATUS VARCHAR2(255), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), + FLOW_CODE VARCHAR2 (40) not null, + FLOW_NAME VARCHAR2 (100) not null, + CATEGORY VARCHAR2 (100), + VERSION VARCHAR2 (20) not null, + IS_PUBLISH NUMBER (1) default 0 not null, + FORM_CUSTOM VARCHAR2 (1) default 'N', + FORM_PATH VARCHAR2 (100), + ACTIVITY_STATUS NUMBER (1) default 1, + LISTENER_TYPE VARCHAR2 (100), + LISTENER_PATH VARCHAR2 (500), + EXT VARCHAR2 (500), CREATE_TIME DATE, - UPDATE_BY NUMBER(20), UPDATE_TIME DATE, - TENANT_ID VARCHAR2(20) -); + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) +) / -comment on table TEST_LEAVE is '请假申请表'; -comment on column TEST_LEAVE.ID is '主键'; -comment on column TEST_LEAVE.LEAVE_TYPE is '请假类型'; -comment on column TEST_LEAVE.START_DATE is '开始时间'; -comment on column TEST_LEAVE.END_DATE is '结束时间'; -comment on column TEST_LEAVE.LEAVE_DAYS is '请假天数'; -comment on column TEST_LEAVE.REMARK is '请假原因'; -comment on column TEST_LEAVE.STATUS is '状态'; -comment on column TEST_LEAVE.CREATE_DEPT is '创建部门'; -comment on column TEST_LEAVE.CREATE_BY is '创建者'; -comment on column TEST_LEAVE.CREATE_TIME is '创建时间'; -comment on column TEST_LEAVE.UPDATE_BY is '更新者'; -comment on column TEST_LEAVE.UPDATE_TIME is '更新时间'; -comment on column TEST_LEAVE.TENANT_ID is '租户编号'; +comment on table FLOW_DEFINITION is '流程定义表' +/ --- 流程分类信息表 -create table WF_CATEGORY +comment on column FLOW_DEFINITION.ID is '主键id' +/ + +comment on column FLOW_DEFINITION.FLOW_CODE is '流程编码' +/ + +comment on column FLOW_DEFINITION.FLOW_NAME is '流程名称' +/ + +comment on column FLOW_DEFINITION.CATEGORY is '流程类别' +/ + +comment on column FLOW_DEFINITION.VERSION is '流程版本' +/ + +comment on column FLOW_DEFINITION.IS_PUBLISH is '是否发布 (0未发布 1已发布 9失效)' +/ + +comment on column FLOW_DEFINITION.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' +/ + +comment on column FLOW_DEFINITION.FORM_PATH is '审批表单路径' +/ + +comment on column FLOW_DEFINITION.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)' +/ + +comment on column FLOW_DEFINITION.LISTENER_TYPE is '监听器类型' +/ + +comment on column FLOW_DEFINITION.LISTENER_PATH is '监听器路径' +/ + +comment on column FLOW_DEFINITION.EXT is '扩展字段,预留给业务系统使用' +/ + +comment on column FLOW_DEFINITION.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_DEFINITION.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_DEFINITION.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_DEFINITION.TENANT_ID is '租户id' +/ + +create table FLOW_NODE ( - ID NUMBER(20) not null - constraint PK_WF_CATEGORY + ID NUMBER (20) not null + constraint FLOW_NODE_PK primary key, - CATEGORY_NAME VARCHAR2(255), - CATEGORY_CODE VARCHAR2(255) - constraint UNI_CATEGORY_CODE - unique, - PARENT_ID NUMBER(20), - SORT_NUM NUMBER(10), - TENANT_ID VARCHAR2(20), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), - CREATE_TIME DATE, - UPDATE_BY NUMBER(20), - UPDATE_TIME DATE -); + NODE_TYPE NUMBER (1) not null, + DEFINITION_ID NUMBER (20) not null, + NODE_CODE VARCHAR2 (100) not null, + NODE_NAME VARCHAR2 (100), + NODE_RATIO NUMBER (6,3), + COORDINATE VARCHAR2 (100), + SKIP_ANY_NODE VARCHAR2 (100) default 'N', + ANY_NODE_SKIP VARCHAR2 (100), + LISTENER_TYPE VARCHAR2 (100), + LISTENER_PATH VARCHAR2 (500), + HANDLER_TYPE VARCHAR2 (100), + HANDLER_PATH VARCHAR2 (400), + FORM_CUSTOM VARCHAR2 (1) default 'N', + FORM_PATH VARCHAR2 (100), + VERSION VARCHAR2 (20), + CREATE_TIME DATE, + UPDATE_TIME DATE, + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40), + PERMISSION_FLAG VARCHAR2 (200) +) / -comment on table WF_CATEGORY is '流程分类'; -comment on column WF_CATEGORY.ID is '主键'; -comment on column WF_CATEGORY.CATEGORY_NAME is '分类名称'; -comment on column WF_CATEGORY.CATEGORY_CODE is '分类编码'; -comment on column WF_CATEGORY.PARENT_ID is '父级id'; -comment on column WF_CATEGORY.SORT_NUM is '排序'; -comment on column WF_CATEGORY.TENANT_ID is '租户编号'; -comment on column WF_CATEGORY.CREATE_DEPT is '创建部门'; -comment on column WF_CATEGORY.CREATE_BY is '创建者'; -comment on column WF_CATEGORY.CREATE_TIME is '创建时间'; -comment on column WF_CATEGORY.UPDATE_BY is '更新者'; -comment on column WF_CATEGORY.UPDATE_TIME is '更新时间'; -INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, sysdate, 1, sysdate); +comment on table FLOW_NODE is '流程节点表' +/ -create table WF_TASK_BACK_NODE +comment on column FLOW_NODE.ID is '主键id' +/ + +comment on column FLOW_NODE.NODE_TYPE is '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_NODE.DEFINITION_ID is '对应flow_definition表的id' +/ + +comment on column FLOW_NODE.NODE_CODE is '流程节点编码' +/ + +comment on column FLOW_NODE.NODE_NAME is '流程节点名称' +/ + +comment on column FLOW_NODE.NODE_RATIO is '流程签署比例值' +/ + +comment on column FLOW_NODE.COORDINATE is '坐标' +/ + +comment on column FLOW_NODE.SKIP_ANY_NODE is '是否可以退回任意节点(Y是 N否)即将删除' +/ + +comment on column FLOW_NODE.ANY_NODE_SKIP is '任意结点跳转' +/ + +comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型' +/ + +comment on column FLOW_NODE.LISTENER_PATH is '监听器路径' +/ + +comment on column FLOW_NODE.HANDLER_TYPE is '处理器类型' +/ + +comment on column FLOW_NODE.HANDLER_PATH is '处理器路径' +/ + +comment on column FLOW_NODE.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' +/ + +comment on column FLOW_NODE.FORM_PATH is '审批表单路径' +/ + +comment on column FLOW_NODE.VERSION is '版本' +/ + +comment on column FLOW_NODE.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_NODE.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_NODE.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_NODE.TENANT_ID is '租户id' +/ + +comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)' +/ + +create table FLOW_SKIP ( - ID NUMBER(20) not null - constraint PK_WF_TASK_BACK_NODE + ID NUMBER (20) not null + constraint FLOW_SKIP_PK primary key, - NODE_ID VARCHAR2(255) not null, - NODE_NAME VARCHAR2(255) not null, - ORDER_NO NUMBER(20) not null, - INSTANCE_ID VARCHAR2(255) not null, - TASK_TYPE VARCHAR2(255) not null, - ASSIGNEE VARCHAR2(2000) not null, - TENANT_ID VARCHAR2(20), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), - CREATE_TIME DATE, - UPDATE_BY NUMBER(20), - UPDATE_TIME DATE -); -comment on table WF_TASK_BACK_NODE is '节点审批记录'; -comment on column WF_TASK_BACK_NODE.ID is '主键'; -comment on column WF_TASK_BACK_NODE.NODE_ID is '节点id'; -comment on column WF_TASK_BACK_NODE.NODE_NAME is '节点名称'; -comment on column WF_TASK_BACK_NODE.ORDER_NO is '排序'; -comment on column WF_TASK_BACK_NODE.INSTANCE_ID is '流程实例id'; -comment on column WF_TASK_BACK_NODE.TASK_TYPE is '节点类型'; -comment on column WF_TASK_BACK_NODE.ASSIGNEE is '审批人'; -comment on column WF_TASK_BACK_NODE.TENANT_ID is '租户编号'; -comment on column WF_TASK_BACK_NODE.CREATE_DEPT is '创建部门'; -comment on column WF_TASK_BACK_NODE.CREATE_BY is '创建者'; -comment on column WF_TASK_BACK_NODE.CREATE_TIME is '创建时间'; -comment on column WF_TASK_BACK_NODE.UPDATE_BY is '更新者'; -comment on column WF_TASK_BACK_NODE.UPDATE_TIME is '更新时间'; + DEFINITION_ID NUMBER (20) not null, + NOW_NODE_CODE VARCHAR2 (100) not null, + NOW_NODE_TYPE NUMBER (1), + NEXT_NODE_CODE VARCHAR2 (100) not null, + NEXT_NODE_TYPE NUMBER (1), + SKIP_NAME VARCHAR2 (100), + SKIP_TYPE VARCHAR2 (40), + SKIP_CONDITION VARCHAR2 (200), + COORDINATE VARCHAR2 (100), + CREATE_TIME DATE, + UPDATE_TIME DATE, + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) +) / -create table WF_DEFINITION_CONFIG +comment on table FLOW_SKIP is '节点跳转关联表' +/ + +comment on column FLOW_SKIP.ID is '主键id' +/ + +comment on column FLOW_SKIP.DEFINITION_ID is '流程定义id' +/ + +comment on column FLOW_SKIP.NOW_NODE_CODE is '当前流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_SKIP.NOW_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_SKIP.NEXT_NODE_CODE is '下一个流程节点编码' +/ + +comment on column FLOW_SKIP.NEXT_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_SKIP.SKIP_NAME is '跳转名称' +/ + +comment on column FLOW_SKIP.SKIP_TYPE is '跳转类型 (PASS审批通过 REJECT退回)' +/ + +comment on column FLOW_SKIP.SKIP_CONDITION is '跳转条件' +/ + +comment on column FLOW_SKIP.COORDINATE is '坐标' +/ + +comment on column FLOW_SKIP.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_SKIP.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_SKIP.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_SKIP.TENANT_ID is '租户id' +/ + +create table FLOW_INSTANCE ( - ID NUMBER(20) NOT NULL - CONSTRAINT PK_WF_DEFINITION_CONFIG - PRIMARY KEY, - TABLE_NAME VARCHAR2(255) NOT NULL, - DEFINITION_ID VARCHAR2(255) NOT NULL, - PROCESS_KEY VARCHAR2(255) NOT NULL, - VERSION NUMBER(10) NOT NULL, - REMARK VARCHAR2(500), - TENANT_ID VARCHAR2(20), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), - CREATE_TIME DATE, - UPDATE_BY NUMBER(20), - UPDATE_TIME DATE, - constraint uni_definition_id - unique (definition_id) -); -comment on table WF_DEFINITION_CONFIG is '流程定义配置'; -comment on column WF_DEFINITION_CONFIG.ID is '主键'; -comment on column WF_DEFINITION_CONFIG.TABLE_NAME is '表名'; -comment on column WF_DEFINITION_CONFIG.DEFINITION_ID is '流程定义ID'; -comment on column WF_DEFINITION_CONFIG.PROCESS_KEY is '流程KEY'; -comment on column WF_DEFINITION_CONFIG.VERSION is '流程版本'; -comment on column WF_DEFINITION_CONFIG.TENANT_ID is '租户编号'; -comment on column WF_DEFINITION_CONFIG.REMARK is '备注'; -comment on column WF_DEFINITION_CONFIG.CREATE_DEPT is '创建部门'; -comment on column WF_DEFINITION_CONFIG.CREATE_BY is '创建者'; -comment on column WF_DEFINITION_CONFIG.CREATE_TIME is '创建时间'; -comment on column WF_DEFINITION_CONFIG.UPDATE_BY is '更新者'; -comment on column WF_DEFINITION_CONFIG.UPDATE_TIME is '更新时间'; + ID NUMBER not null + constraint FLOW_INSTANCE_PK + primary key, + DEFINITION_ID NUMBER not null, + BUSINESS_ID VARCHAR2 (40) not null, + NODE_TYPE NUMBER (1), + NODE_CODE VARCHAR2 (100), + NODE_NAME VARCHAR2 (100), + VARIABLE CLOB, + FLOW_STATUS VARCHAR2 (20), + ACTIVITY_STATUS NUMBER (1) default 1, + CREATE_BY VARCHAR2 (64) default '', + CREATE_TIME DATE, + UPDATE_TIME DATE, + EXT VARCHAR2 (500), + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) +) / -create table WF_FORM_MANAGE +comment on table FLOW_INSTANCE is '流程实例表' +/ + +comment on column FLOW_INSTANCE.ID is '主键id' +/ + +comment on column FLOW_INSTANCE.DEFINITION_ID is '对应flow_definition表的id' +/ + +comment on column FLOW_INSTANCE.BUSINESS_ID is '业务id' +/ + +comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码' +/ + +comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称' +/ + +comment on column FLOW_INSTANCE.VARIABLE is '任务变量' +/ + +comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)' +/ + +comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)' +/ + +comment on column FLOW_INSTANCE.CREATE_BY is '创建者' +/ + +comment on column FLOW_INSTANCE.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_INSTANCE.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_INSTANCE.EXT is '扩展字段,预留给业务系统使用' +/ + +comment on column FLOW_INSTANCE.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_INSTANCE.TENANT_ID is '租户id' +/ + + +create table FLOW_TASK ( - ID NUMBER(20) NOT NULL - CONSTRAINT PK_WF_FORM_MANAGE - PRIMARY KEY, - FORM_NAME VARCHAR2(255) NOT NULL, - FORM_TYPE VARCHAR2(255) NOT NULL, - ROUTER VARCHAR2(255) NOT NULL, - REMARK VARCHAR2(500), - TENANT_ID VARCHAR2(20), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), - CREATE_TIME DATE, - UPDATE_BY NUMBER(20), - UPDATE_TIME DATE -); + ID NUMBER (20) not null + constraint FLOW_TASK_PK + primary key, + DEFINITION_ID NUMBER (20) not null, + INSTANCE_ID NUMBER (20) not null, + NODE_CODE VARCHAR2 (100), + NODE_NAME VARCHAR2 (100), + NODE_TYPE NUMBER (1), + FORM_CUSTOM VARCHAR2 (1) default 'N', + FORM_PATH VARCHAR2 (100), + CREATE_TIME DATE, + UPDATE_TIME DATE, + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) +) / -comment on table WF_FORM_MANAGE is '表单管理'; -comment on column WF_FORM_MANAGE.ID is '主键'; -comment on column WF_FORM_MANAGE.FORM_NAME is '表单名称'; -comment on column WF_FORM_MANAGE.FORM_TYPE is '表单类型'; -comment on column WF_FORM_MANAGE.ROUTER is '路由地址/表单ID'; -comment on column WF_FORM_MANAGE.REMARK is '备注'; -comment on column WF_FORM_MANAGE.TENANT_ID is '租户编号'; -comment on column WF_FORM_MANAGE.CREATE_DEPT is '创建部门'; -comment on column WF_FORM_MANAGE.CREATE_BY is '创建者'; -comment on column WF_FORM_MANAGE.CREATE_TIME is '创建时间'; -comment on column WF_FORM_MANAGE.UPDATE_BY is '更新者'; -comment on column WF_FORM_MANAGE.UPDATE_TIME is '更新时间'; +comment on table FLOW_TASK is '待办任务表' +/ -insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate, 1, sysdate); +comment on column FLOW_TASK.ID is '主键id' +/ -create table WF_NODE_CONFIG +comment on column FLOW_TASK.DEFINITION_ID is '对应flow_definition表的id' +/ + +comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id' +/ + +comment on column FLOW_TASK.NODE_CODE is '节点编码' +/ + +comment on column FLOW_TASK.NODE_NAME is '节点名称' +/ + +comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' +/ + +comment on column FLOW_TASK.FORM_PATH is '审批表单路径' +/ + +comment on column FLOW_TASK.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_TASK.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_TASK.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_TASK.TENANT_ID is '租户id' +/ + +create table FLOW_HIS_TASK ( - ID NUMBER(20) NOT NULL - CONSTRAINT PK_WF_NODE_CONFIG - PRIMARY KEY, - FORM_ID NUMBER(20), - FORM_TYPE VARCHAR2(255), - NODE_NAME VARCHAR2(255) NOT NULL, - NODE_ID VARCHAR2(255) NOT NULL, - DEFINITION_ID VARCHAR2(255) NOT NULL, - APPLY_USER_TASK CHAR(1) DEFAULT '0', - TENANT_ID VARCHAR2(20), - CREATE_DEPT NUMBER(20), - CREATE_BY NUMBER(20), - CREATE_TIME DATE, - UPDATE_BY NUMBER(20), - UPDATE_TIME DATE + ID NUMBER (20) not null, + DEFINITION_ID NUMBER (20) not null, + INSTANCE_ID NUMBER (20) not null, + TASK_ID NUMBER (20) not null, + NODE_CODE VARCHAR2 (100), + NODE_NAME VARCHAR2 (100), + NODE_TYPE NUMBER (1), + TARGET_NODE_CODE VARCHAR2 (100), + TARGET_NODE_NAME VARCHAR2 (100), + APPROVER VARCHAR2 (40), + COOPERATE_TYPE NUMBER (1) default 0, + COLLABORATOR VARCHAR2 (40), + SKIP_TYPE VARCHAR2 (10), + FLOW_STATUS VARCHAR2 (20), + FORM_CUSTOM VARCHAR2 (1) default 'N', + FORM_PATH VARCHAR2 (100), + MESSAGE VARCHAR2 (500), + EXT VARCHAR2 (500), + CREATE_TIME DATE, + UPDATE_TIME DATE, + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) + +) / + +comment on table FLOW_HIS_TASK is '历史任务记录表' +/ + +comment on column FLOW_HIS_TASK.ID is '主键id' +/ + +comment on column FLOW_HIS_TASK.DEFINITION_ID is '对应flow_definition表的id' +/ + +comment on column FLOW_HIS_TASK.INSTANCE_ID is '对应flow_instance表的id' +/ + +comment on column FLOW_HIS_TASK.TASK_ID is '对应flow_task表的id' +/ + +comment on column FLOW_HIS_TASK.NODE_CODE is '开始节点编码' +/ + +comment on column FLOW_HIS_TASK.NODE_NAME is '开始节点名称' +/ + +comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' +/ + +comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码' +/ + +comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称' +/ + +comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)' +/ + +comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(1审批中 2 审批通过 9已退回 10失效)' +/ + +comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' +/ + +comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径' +/ + +comment on column FLOW_HIS_TASK.MESSAGE is '审批意见' +/ + +comment on column FLOW_HIS_TASK.EXT is '扩展字段,预留给业务系统使用' +/ + +comment on column FLOW_HIS_TASK.CREATE_TIME is '任务开始时间' +/ + +comment on column FLOW_HIS_TASK.UPDATE_TIME is '审批完成时间' +/ + +comment on column FLOW_HIS_TASK.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_HIS_TASK.TENANT_ID is '租户id' +/ + +comment on column FLOW_HIS_TASK.APPROVER is '审批者' +/ + +comment on column FLOW_HIS_TASK.COOPERATE_TYPE is '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)' +/ + +comment on column FLOW_HIS_TASK.COLLABORATOR is '协作人' +/ + +create table FLOW_USER +( + ID NUMBER (20) not null + constraint FLOW_USER_PK + primary key, + TYPE VARCHAR2 (1) not null, + PROCESSED_BY VARCHAR2 (80), + ASSOCIATED NUMBER (20) not null, + CREATE_TIME DATE, + CREATE_BY VARCHAR2 (80), + UPDATE_TIME DATE, + DEL_FLAG VARCHAR2 (1) default '0', + TENANT_ID VARCHAR2 (40) +) / + +comment on table FLOW_USER is '待办任务表' +/ + +comment on column FLOW_USER.ID is '主键id' +/ + +comment on column FLOW_USER.TYPE is '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)' +/ + +comment on column FLOW_USER.PROCESSED_BY is '权限人)' +/ + +comment on column FLOW_USER.ASSOCIATED is '任务表id' +/ + +comment on column FLOW_USER.CREATE_TIME is '创建时间' +/ + +comment on column FLOW_USER.CREATE_BY is '节点名称' +/ + +comment on column FLOW_USER.UPDATE_TIME is '更新时间' +/ + +comment on column FLOW_USER.DEL_FLAG is '删除标志' +/ + +comment on column FLOW_USER.TENANT_ID is '租户id' +/ + +create index USER_PROCESSED_TYPE + on FLOW_USER (PROCESSED_BY, TYPE) + / + + +-- ---------------------------- +-- 流程分类表 +-- ---------------------------- +CREATE TABLE flow_category +( + category_id NUMBER (20) NOT NULL, + tenant_id VARCHAR2 (20) DEFAULT '000000', + parent_id NUMBER (20) DEFAULT 0, + ancestors VARCHAR2 (500) DEFAULT '', + category_name VARCHAR2 (30) NOT NULL, + order_num NUMBER (4) DEFAULT 0, + del_flag CHAR(1) DEFAULT '0', + create_dept NUMBER (20), + create_by NUMBER (20), + create_time DATE, + update_by NUMBER (20), + update_time DATE, + CONSTRAINT pk_flow_category PRIMARY KEY (category_id) ); -comment on table WF_NODE_CONFIG is '节点配置'; -comment on column WF_NODE_CONFIG.ID is '主键'; -comment on column WF_NODE_CONFIG.FORM_ID is '表单id'; -comment on column WF_NODE_CONFIG.FORM_TYPE is '表单类型'; -comment on column WF_NODE_CONFIG.NODE_ID is '节点id'; -comment on column WF_NODE_CONFIG.NODE_NAME is '节点名称'; -comment on column WF_NODE_CONFIG.DEFINITION_ID is '流程定义id'; -comment on column WF_NODE_CONFIG.APPLY_USER_TASK is '是否为申请人节点 (0是 1否)'; -comment on column WF_NODE_CONFIG.TENANT_ID is '租户编号'; -comment on column WF_NODE_CONFIG.CREATE_DEPT is '创建部门'; -comment on column WF_NODE_CONFIG.CREATE_BY is '创建者'; -comment on column WF_NODE_CONFIG.CREATE_TIME is '创建时间'; -comment on column WF_NODE_CONFIG.UPDATE_BY is '更新者'; -comment on column WF_NODE_CONFIG.UPDATE_TIME is '更新时间'; +COMMENT ON TABLE flow_category IS '流程分类'; +COMMENT ON COLUMN flow_category.category_id IS '流程分类ID'; +COMMENT ON COLUMN flow_category.tenant_id IS '租户编号'; +COMMENT ON COLUMN flow_category.parent_id IS '父流程分类id'; +COMMENT ON COLUMN flow_category.ancestors IS '祖级列表'; +COMMENT ON COLUMN flow_category.category_name IS '流程分类名称'; +COMMENT ON COLUMN flow_category.order_num IS '显示顺序'; +COMMENT ON COLUMN flow_category.del_flag IS '删除标志(0代表存在 2代表删除)'; +COMMENT ON COLUMN flow_category.create_dept IS '创建部门'; +COMMENT ON COLUMN flow_category.create_by IS '创建者'; +COMMENT ON COLUMN flow_category.create_time IS '创建时间'; +COMMENT ON COLUMN flow_category.update_by IS '更新者'; +COMMENT ON COLUMN flow_category.update_time IS '更新时间'; -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, sysdate, NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate, NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate, NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate, NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate, NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate, NULL, NULL, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, SYSDATE, NULL, NULL); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate, NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate, NULL, NULL, '表单类型列表'); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate, NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, sysdate, NULL, NULL, '草稿'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1,sysdate, NULL, NULL, '待审核'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, sysdate, NULL, NULL, '已完成'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate, NULL, NULL, '已作废'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, sysdate, NULL, NULL, '已退回'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1,sysdate, NULL, NULL, '已终止'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, sysdate, NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, sysdate, NULL, NULL, '动态表单'); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); --- 表单管理 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0', 'workflow:formManage:list', 'tree-table', 103, 1, sysdate, null, null, '表单管理菜单'); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, SYSDATE, NULL, NULL); --- 表单管理按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1, sysdate, null, null, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, SYSDATE, NULL, NULL); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1, sysdate, null, null, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, SYSDATE, NULL, NULL); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1, sysdate, null, null, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, SYSDATE, NULL, NULL); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1, sysdate, null, null, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, SYSDATE, NULL, NULL); -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table', 103, 1, sysdate, null, null, ''); +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, SYSDATE, NULL, NULL); + +INSERT INTO flow_category +(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, SYSDATE, NULL, NULL); + + +-- ---------------------------- +-- 请假单信息 +-- ---------------------------- +CREATE TABLE test_leave +( + id NUMBER (20) NOT NULL, + tenant_id VARCHAR2 (20) DEFAULT '000000', + leave_type VARCHAR2 (255) NOT NULL, + start_date DATE NOT NULL, + end_date DATE NOT NULL, + leave_days NUMBER (10) NOT NULL, + remark VARCHAR2 (255), + status VARCHAR2 (255), + create_dept NUMBER (20), + create_by NUMBER (20), + create_time DATE, + update_by NUMBER (20), + update_time DATE, + CONSTRAINT pk_test_leave PRIMARY KEY (id) +); + +COMMENT ON TABLE test_leave IS '请假申请表'; +COMMENT ON COLUMN test_leave.id IS 'ID'; +COMMENT ON COLUMN test_leave.tenant_id IS '租户编号'; +COMMENT ON COLUMN test_leave.leave_type IS '请假类型'; +COMMENT ON COLUMN test_leave.start_date IS '开始时间'; +COMMENT ON COLUMN test_leave.end_date IS '结束时间'; +COMMENT ON COLUMN test_leave.leave_days IS '请假天数'; +COMMENT ON COLUMN test_leave.remark IS '请假原因'; +COMMENT ON COLUMN test_leave.status IS '状态'; +COMMENT ON COLUMN test_leave.create_dept IS '创建部门'; +COMMENT ON COLUMN test_leave.create_by IS '创建者'; +COMMENT ON COLUMN test_leave.create_time IS '创建时间'; +COMMENT ON COLUMN test_leave.update_by IS '更新者'; +COMMENT ON COLUMN test_leave.update_time IS '更新时间'; + +INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE(), NULL, NULL, ''); + +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, SYSDATE(), NULL, NULL, ''); + +INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, SYSDATE(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, SYSDATE(), NULL, NULL, ''); + +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, SYSDATE(), NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, SYSDATE(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, SYSDATE(), NULL, NULL, '任务状态'); +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, SYSDATE(), NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '超时'); diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index 8a6078d07..cdae13866 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -1,275 +1,403 @@ -insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'model', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/postgresql/postgresql-warm-flow-all.sql +-- ---------------------------- +CREATE TABLE flow_definition +( + id int8 NOT NULL, -- 主键id + flow_code varchar(40) NOT NULL, -- 流程编码 + flow_name varchar(100) NOT NULL, -- 流程名称 + category varchar(100) NULL, -- 流程类别 + "version" varchar(20) NOT NULL, -- 流程版本 + is_publish int2 NOT NULL DEFAULT 0, -- 是否发布(0未发布 1已发布 9失效) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + activity_status int2 NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) + listener_type varchar(100) NULL, -- 监听器类型 + listener_path varchar(400) NULL, -- 监听器路径 + ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_definition_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_definition IS '流程定义表'; + +COMMENT ON COLUMN flow_definition.id IS '主键id'; +COMMENT ON COLUMN flow_definition.flow_code IS '流程编码'; +COMMENT ON COLUMN flow_definition.flow_name IS '流程名称'; +COMMENT ON COLUMN flow_definition.category IS '流程类别'; +COMMENT ON COLUMN flow_definition."version" IS '流程版本'; +COMMENT ON COLUMN flow_definition.is_publish IS '是否发布(0未发布 1已发布 9失效)'; +COMMENT ON COLUMN flow_definition.form_custom IS '审批表单是否自定义(Y是 N否)'; +COMMENT ON COLUMN flow_definition.form_path IS '审批表单路径'; +COMMENT ON COLUMN flow_definition.activity_status IS '流程激活状态(0挂起 1激活)'; +COMMENT ON COLUMN flow_definition.listener_type IS '监听器类型'; +COMMENT ON COLUMN flow_definition.listener_path IS '监听器路径'; +COMMENT ON COLUMN flow_definition.ext IS '扩展字段,预留给业务系统使用'; +COMMENT ON COLUMN flow_definition.create_time IS '创建时间'; +COMMENT ON COLUMN flow_definition.update_time IS '更新时间'; +COMMENT ON COLUMN flow_definition.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_definition.tenant_id IS '租户id'; + +CREATE TABLE flow_node +( + id int8 NOT NULL, -- 主键id + node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + definition_id int8 NOT NULL, -- 流程定义id + node_code varchar(100) NOT NULL, -- 流程节点编码 + node_name varchar(100) NULL, -- 流程节点名称 + permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) + node_ratio numeric(6, 3) NULL, -- 流程签署比例值 + coordinate varchar(100) NULL, -- 坐标 + skip_any_node varchar(100) NULL DEFAULT 'N':: character varying, -- 是否可以退回任意节点(Y是 N否)即将删除 + any_node_skip varchar(100) NULL, -- 任意结点跳转 + listener_type varchar(100) NULL, -- 监听器类型 + listener_path varchar(400) NULL, -- 监听器路径 + handler_type varchar(100) NULL, -- 处理器类型 + handler_path varchar(400) NULL, -- 处理器路径 + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + "version" varchar(20) NOT NULL, -- 版本 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_node_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_node IS '流程节点表'; + +COMMENT ON COLUMN flow_node.id IS '主键id'; +COMMENT ON COLUMN flow_node.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_node.definition_id IS '流程定义id'; +COMMENT ON COLUMN flow_node.node_code IS '流程节点编码'; +COMMENT ON COLUMN flow_node.node_name IS '流程节点名称'; +COMMENT ON COLUMN flow_node.permission_flag IS '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; +COMMENT ON COLUMN flow_node.node_ratio IS '流程签署比例值'; +COMMENT ON COLUMN flow_node.coordinate IS '坐标'; +COMMENT ON COLUMN flow_node.skip_any_node IS '是否可以退回任意节点(Y是 N否)即将删除'; +COMMENT ON COLUMN flow_node.any_node_skip IS '任意结点跳转'; +COMMENT ON COLUMN flow_node.listener_type IS '监听器类型'; +COMMENT ON COLUMN flow_node.listener_path IS '监听器路径'; +COMMENT ON COLUMN flow_node.handler_type IS '处理器类型'; +COMMENT ON COLUMN flow_node.handler_path IS '处理器路径'; +COMMENT ON COLUMN flow_node.form_custom IS '审批表单是否自定义(Y是 N否)'; +COMMENT ON COLUMN flow_node.form_path IS '审批表单路径'; +COMMENT ON COLUMN flow_node."version" IS '版本'; +COMMENT ON COLUMN flow_node.create_time IS '创建时间'; +COMMENT ON COLUMN flow_node.update_time IS '更新时间'; +COMMENT ON COLUMN flow_node.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_node.tenant_id IS '租户id'; --- 流程分类管理相关按钮 -insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, now(), null, null, ''); +CREATE TABLE flow_skip +( + id int8 NOT NULL, -- 主键id + definition_id int8 NOT NULL, -- 流程定义id + now_node_code varchar(100) NOT NULL, -- 当前流程节点的编码 + now_node_type int2 NULL, -- 当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + next_node_code varchar(100) NOT NULL, -- 下一个流程节点的编码 + next_node_type int2 NULL, -- 下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + skip_name varchar(100) NULL, -- 跳转名称 + skip_type varchar(40) NULL, -- 跳转类型(PASS审批通过 REJECT退回) + skip_condition varchar(200) NULL, -- 跳转条件 + coordinate varchar(100) NULL, -- 坐标 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_skip_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_skip IS '节点跳转关联表'; + +COMMENT ON COLUMN flow_skip.id IS '主键id'; +COMMENT ON COLUMN flow_skip.definition_id IS '流程定义id'; +COMMENT ON COLUMN flow_skip.now_node_code IS '当前流程节点的编码'; +COMMENT ON COLUMN flow_skip.now_node_type IS '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_skip.next_node_code IS '下一个流程节点的编码'; +COMMENT ON COLUMN flow_skip.next_node_type IS '下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_skip.skip_name IS '跳转名称'; +COMMENT ON COLUMN flow_skip.skip_type IS '跳转类型(PASS审批通过 REJECT退回)'; +COMMENT ON COLUMN flow_skip.skip_condition IS '跳转条件'; +COMMENT ON COLUMN flow_skip.coordinate IS '坐标'; +COMMENT ON COLUMN flow_skip.create_time IS '创建时间'; +COMMENT ON COLUMN flow_skip.update_time IS '更新时间'; +COMMENT ON COLUMN flow_skip.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_skip.tenant_id IS '租户id'; + +CREATE TABLE flow_instance +( + id int8 NOT NULL, -- 主键id + definition_id int8 NOT NULL, -- 对应flow_definition表的id + business_id varchar(40) NOT NULL, -- 业务id + node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + node_code varchar(40) NOT NULL, -- 流程节点编码 + node_name varchar(100) NULL, -- 流程节点名称 + variable text NULL, -- 任务变量 + flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) + activity_status int2 NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) + create_by varchar(64) NULL DEFAULT '':: character varying, -- 创建者 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_instance_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_instance IS '流程实例表'; + +COMMENT ON COLUMN flow_instance.id IS '主键id'; +COMMENT ON COLUMN flow_instance.definition_id IS '对应flow_definition表的id'; +COMMENT ON COLUMN flow_instance.business_id IS '业务id'; +COMMENT ON COLUMN flow_instance.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_instance.node_code IS '流程节点编码'; +COMMENT ON COLUMN flow_instance.node_name IS '流程节点名称'; +COMMENT ON COLUMN flow_instance.variable IS '任务变量'; +COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)'; +COMMENT ON COLUMN flow_instance.activity_status IS '流程激活状态(0挂起 1激活)'; +COMMENT ON COLUMN flow_instance.create_by IS '创建者'; +COMMENT ON COLUMN flow_instance.create_time IS '创建时间'; +COMMENT ON COLUMN flow_instance.update_time IS '更新时间'; +COMMENT ON COLUMN flow_instance.ext IS '扩展字段,预留给业务系统使用'; +COMMENT ON COLUMN flow_instance.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_instance.tenant_id IS '租户id'; + +CREATE TABLE flow_task +( + id int8 NOT NULL, -- 主键id + definition_id int8 NOT NULL, -- 对应flow_definition表的id + instance_id int8 NOT NULL, -- 对应flow_instance表的id + node_code varchar(100) NOT NULL, -- 节点编码 + node_name varchar(100) NULL, -- 节点名称 + node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_task_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_task IS '待办任务表'; + +COMMENT ON COLUMN flow_task.id IS '主键id'; +COMMENT ON COLUMN flow_task.definition_id IS '对应flow_definition表的id'; +COMMENT ON COLUMN flow_task.instance_id IS '对应flow_instance表的id'; +COMMENT ON COLUMN flow_task.node_code IS '节点编码'; +COMMENT ON COLUMN flow_task.node_name IS '节点名称'; +COMMENT ON COLUMN flow_task.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_task.form_custom IS '审批表单是否自定义(Y是 N否)'; +COMMENT ON COLUMN flow_task.form_path IS '审批表单路径'; +COMMENT ON COLUMN flow_task.create_time IS '创建时间'; +COMMENT ON COLUMN flow_task.update_time IS '更新时间'; +COMMENT ON COLUMN flow_task.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_task.tenant_id IS '租户id'; + +CREATE TABLE flow_his_task +( + id int8 NOT NULL, -- 主键id + definition_id int8 NOT NULL, -- 对应flow_definition表的id + instance_id int8 NOT NULL, -- 对应flow_instance表的id + task_id int8 NOT NULL, -- 对应flow_task表的id + node_code varchar(100) NULL, -- 开始节点编码 + node_name varchar(100) NULL, -- 开始节点名称 + node_type int2 NULL, -- 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + target_node_code varchar(100) NULL, -- 目标节点编码 + target_node_name varchar(100) NULL, -- 结束节点名称 + approver varchar(40) NULL, -- 审批者 + cooperate_type int2 NOT NULL DEFAULT 0, -- 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + collaborator varchar(40) NULL, -- 协作人(只有转办、会签、票签、委派) + skip_type varchar(10) NULL, -- 流转类型(PASS通过 REJECT退回 NONE无动作) + flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + message varchar(500) NULL, -- 审批意见 + create_time timestamp NULL, -- 创建时间 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_his_task_pkey PRIMARY KEY (id) +); +COMMENT ON TABLE flow_his_task IS '历史任务记录表'; + +COMMENT ON COLUMN flow_his_task.id IS '主键id'; +COMMENT ON COLUMN flow_his_task.definition_id IS '对应flow_definition表的id'; +COMMENT ON COLUMN flow_his_task.instance_id IS '对应flow_instance表的id'; +COMMENT ON COLUMN flow_his_task.task_id IS '对应flow_task表的id'; +COMMENT ON COLUMN flow_his_task.node_code IS '开始节点编码'; +COMMENT ON COLUMN flow_his_task.node_name IS '开始节点名称'; +COMMENT ON COLUMN flow_his_task.node_type IS '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_his_task.target_node_code IS '目标节点编码'; +COMMENT ON COLUMN flow_his_task.target_node_name IS '结束节点名称'; +COMMENT ON COLUMN flow_his_task.approver IS '审批者'; +COMMENT ON COLUMN flow_his_task.cooperate_type IS '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)'; +COMMENT ON COLUMN flow_his_task.collaborator IS '协作人'; +COMMENT ON COLUMN flow_his_task.skip_type IS '流转类型(PASS通过 REJECT退回 NONE无动作)'; +COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(1审批中 2 审批通过 9已退回 10失效)'; +COMMENT ON COLUMN flow_his_task.form_custom IS '审批表单是否自定义(Y是 N否)'; +COMMENT ON COLUMN flow_his_task.form_path IS '审批表单路径'; +COMMENT ON COLUMN flow_his_task.message IS '审批意见'; +COMMENT ON COLUMN flow_his_task.ext IS '扩展字段,预留给业务系统使用'; +COMMENT ON COLUMN flow_his_task.create_time IS '任务开始时间'; +COMMENT ON COLUMN flow_his_task.update_time IS '审批完成时间'; +COMMENT ON COLUMN flow_his_task.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_his_task.tenant_id IS '租户id'; + +CREATE TABLE flow_user +( + id int8 NOT NULL, -- 主键id + "type" bpchar(1) NOT NULL, -- 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3流程实例的抄送人权限 4待办任务的委托人权限) + processed_by varchar(80) NULL, -- 权限人 + associated int8 NOT NULL, -- 任务表id + create_time timestamp NULL, -- 创建时间 + create_by varchar(80) NULL, -- 创建人 + update_time timestamp NULL, -- 更新时间 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT flow_user_pk PRIMARY KEY (id) +); +CREATE INDEX user_processed_type ON flow_user USING btree (processed_by, type); +COMMENT ON TABLE flow_user IS '流程用户表'; + +COMMENT ON COLUMN flow_user.id IS '主键id'; +COMMENT ON COLUMN flow_user."type" IS '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)'; +COMMENT ON COLUMN flow_user.processed_by IS '权限人'; +COMMENT ON COLUMN flow_user.associated IS '任务表id'; +COMMENT ON COLUMN flow_user.create_time IS '创建时间'; +COMMENT ON COLUMN flow_user.create_by IS '创建人'; +COMMENT ON COLUMN flow_user.update_time IS '更新时间'; +COMMENT ON COLUMN flow_user.del_flag IS '删除标志'; +COMMENT ON COLUMN flow_user.tenant_id IS '租户id'; + +-- ---------------------------- +-- 流程分类表 +-- ---------------------------- +CREATE TABLE flow_category +( + category_id BIGINT NOT NULL COMMENT '流程分类ID', + tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户编号', + parent_id BIGINT DEFAULT 0 COMMENT '父流程分类id', + ancestors VARCHAR(500) DEFAULT '' COMMENT '祖级列表', + category_name VARCHAR(30) NOT NULL COMMENT '流程分类名称', + order_num INT DEFAULT 0 COMMENT '显示顺序', + del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + create_dept BIGINT COMMENT '创建部门', + create_by BIGINT COMMENT '创建者', + create_time TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新者', + update_time TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (category_id) +); + +COMMENT ON TABLE flow_category IS '流程分类'; +COMMENT ON COLUMN flow_category.category_id IS '流程分类ID'; +COMMENT ON COLUMN flow_category.tenant_id IS '租户编号'; +COMMENT ON COLUMN flow_category.parent_id IS '父流程分类id'; +COMMENT ON COLUMN flow_category.ancestors IS '祖级列表'; +COMMENT ON COLUMN flow_category.category_name IS '流程分类名称'; +COMMENT ON COLUMN flow_category.order_num IS '显示顺序'; +COMMENT ON COLUMN flow_category.del_flag IS '删除标志(0代表存在 2代表删除)'; +COMMENT ON COLUMN flow_category.create_dept IS '创建部门'; +COMMENT ON COLUMN flow_category.create_by IS '创建者'; +COMMENT ON COLUMN flow_category.create_time IS '创建时间'; +COMMENT ON COLUMN flow_category.update_by IS '更新者'; +COMMENT ON COLUMN flow_category.update_time IS '更新时间'; + +INSERT INTO flow_category (category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, + create_dept, create_by, create_time, update_by, update_time) +VALUES (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), + (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL); + +-- ---------------------------- -- 请假单信息 -create table test_leave +-- ---------------------------- +CREATE TABLE test_leave ( - id bigint not null - constraint test_leave_pk - primary key, - leave_type varchar(255), - start_date timestamp, - end_date timestamp, - leave_days bigint, - remark varchar(255), - status varchar(255), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp, - tenant_id varchar(20) + id BIGINT NOT NULL COMMENT 'id', + tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户编号', + leave_type VARCHAR(255) NOT NULL COMMENT '请假类型', + start_date TIMESTAMP NOT NULL COMMENT '开始时间', + end_date TIMESTAMP NOT NULL COMMENT '结束时间', + leave_days INT NOT NULL COMMENT '请假天数', + remark VARCHAR(255) COMMENT '请假原因', + status VARCHAR(255) COMMENT '状态', + create_dept BIGINT COMMENT '创建部门', + create_by BIGINT COMMENT '创建者', + create_time TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新者', + update_time TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (id) ); -comment on table test_leave is '请假申请表'; -comment on column test_leave.id is '主键'; -comment on column test_leave.leave_type is '请假类型'; -comment on column test_leave.start_date is '开始时间'; -comment on column test_leave.end_date is '结束时间'; -comment on column test_leave.remark is '请假原因'; -comment on column test_leave.status is '状态'; -comment on column test_leave.create_dept is '创建部门'; -comment on column test_leave.create_by is '创建者'; -comment on column test_leave.create_time is '创建时间'; -comment on column test_leave.update_by is '更新者'; -comment on column test_leave.update_time is '更新时间'; -comment on column test_leave.tenant_id is '租户编码'; +COMMENT ON TABLE test_leave IS '请假申请表'; +COMMENT ON COLUMN test_leave.id IS 'id'; +COMMENT ON COLUMN test_leave.tenant_id IS '租户编号'; +COMMENT ON COLUMN test_leave.leave_type IS '请假类型'; +COMMENT ON COLUMN test_leave.start_date IS '开始时间'; +COMMENT ON COLUMN test_leave.end_date IS '结束时间'; +COMMENT ON COLUMN test_leave.leave_days IS '请假天数'; +COMMENT ON COLUMN test_leave.remark IS '请假原因'; +COMMENT ON COLUMN test_leave.status IS '状态'; +COMMENT ON COLUMN test_leave.create_dept IS '创建部门'; +COMMENT ON COLUMN test_leave.create_by IS '创建者'; +COMMENT ON COLUMN test_leave.create_time IS '创建时间'; +COMMENT ON COLUMN test_leave.update_by IS '更新者'; +COMMENT ON COLUMN test_leave.update_time IS '更新时间'; -alter table test_leave - owner to postgres; +INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, current_timestamp, NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, current_timestamp, NULL, NULL, ''); --- 流程分类信息表 -create table wf_category -( - id bigint not null - constraint wf_category_pk - primary key, - category_name varchar(255), - category_code varchar(255), - parent_id bigint, - sort_num bigint, - tenant_id varchar(20), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp -); +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, current_timestamp, NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, current_timestamp, NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, current_timestamp, NULL, NULL, '任务状态'); +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, current_timestamp, NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '超时'); -comment on table wf_category is '流程分类'; -comment on column wf_category.id is '主键'; -comment on column wf_category.category_name is '分类名称'; -comment on column wf_category.category_code is '分类编码'; -comment on column wf_category.parent_id is '父级id'; -comment on column wf_category.sort_num is '排序'; -comment on column wf_category.tenant_id is '租户id'; -comment on column wf_category.create_dept is '创建部门'; -comment on column wf_category.create_by is '创建者'; -comment on column wf_category.create_time is '创建时间'; -comment on column wf_category.update_by is '修改者'; -comment on column wf_category.update_time is '修改时间'; - -alter table wf_category - owner to postgres; - -create unique index uni_category_code - on wf_category (category_code); - -INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, now(), 1, now()); - -create table wf_task_back_node -( - id bigint not null - constraint pk_wf_task_back_node - primary key, - node_id varchar(255) not null, - node_name varchar(255) not null, - order_no bigint not null, - instance_id varchar(255) not null, - task_type varchar(255) not null, - assignee varchar(2000) not null, - tenant_id varchar(20), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp -); - -comment on table wf_task_back_node is '节点审批记录'; -comment on column wf_task_back_node.id is '主键'; -comment on column wf_task_back_node.node_id is '节点id'; -comment on column wf_task_back_node.node_name is '节点名称'; -comment on column wf_task_back_node.order_no is '排序'; -comment on column wf_task_back_node.instance_id is '流程实例id'; -comment on column wf_task_back_node.task_type is '节点类型'; -comment on column wf_task_back_node.assignee is '审批人'; -comment on column wf_task_back_node.tenant_id is '租户id'; -comment on column wf_task_back_node.create_dept is '创建部门'; -comment on column wf_task_back_node.create_by is '创建者'; -comment on column wf_task_back_node.create_time is '创建时间'; -comment on column wf_task_back_node.update_by is '修改者'; -comment on column wf_task_back_node.update_time is '修改时间'; - -alter table wf_task_back_node - owner to postgres; - -create table wf_definition_config -( - id bigint not null - constraint pk_wf_definition_config - primary key, - table_name varchar(255) not null, - definition_id varchar(255) not null, - process_key varchar(255) not null, - version bigint not null, - tenant_id varchar(20), - remark varchar(500), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp -); - -comment on table wf_definition_config is '流程定义配置'; -comment on column wf_definition_config.id is '主键'; -comment on column wf_definition_config.table_name is '表名'; -comment on column wf_definition_config.definition_id is '流程定义ID'; -comment on column wf_definition_config.process_key is '流程KEY'; -comment on column wf_definition_config.version is '流程版本'; -comment on column wf_definition_config.tenant_id is '租户id'; -comment on column wf_definition_config.remark is '备注'; -comment on column wf_definition_config.create_dept is '创建部门'; -comment on column wf_definition_config.create_by is '创建者'; -comment on column wf_definition_config.create_time is '创建时间'; -comment on column wf_definition_config.update_by is '修改者'; -comment on column wf_definition_config.update_time is '修改时间'; - -alter table wf_definition_config - owner to postgres; -create unique index uni_definition_id - on wf_definition_config (definition_id); - -create table wf_form_manage -( - id bigint not null - constraint pk_wf_form_manage - primary key, - form_name varchar(255) not null, - form_type varchar(255) not null, - router varchar(255) not null, - remark varchar(500), - tenant_id varchar(20), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp -); - -comment on table wf_form_manage is '表单管理'; -comment on column wf_form_manage.id is '主键'; -comment on column wf_form_manage.form_name is '表单名称'; -comment on column wf_form_manage.form_type is '表单类型'; -comment on column wf_form_manage.router is '路由地址/表单ID'; -comment on column wf_form_manage.remark is '备注'; -comment on column wf_form_manage.tenant_id is '租户id'; -comment on column wf_form_manage.create_dept is '创建部门'; -comment on column wf_form_manage.create_by is '创建者'; -comment on column wf_form_manage.create_time is '创建时间'; -comment on column wf_form_manage.update_by is '修改者'; -comment on column wf_form_manage.update_time is '修改时间'; - -insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, now(), 1, now()); - -create table wf_node_config -( - id bigint not null - constraint pk_wf_node_config - primary key, - form_id bigint, - form_type varchar(255), - node_name varchar(255) not null, - node_id varchar(255) not null, - definition_id varchar(255) not null, - apply_user_task char(1) default '0', - tenant_id varchar(20), - create_dept bigint, - create_by bigint, - create_time timestamp, - update_by bigint, - update_time timestamp -); - -comment on table wf_node_config is '节点配置'; -comment on column wf_node_config.id is '主键'; -comment on column wf_node_config.form_id is '表单id'; -comment on column wf_node_config.form_type is '表单类型'; -comment on column wf_node_config.node_id is '节点id'; -comment on column wf_node_config.node_name is '节点名称'; -comment on column wf_node_config.definition_id is '流程定义id'; -comment on column wf_node_config.apply_user_task is '是否为申请人节点 (0是 1否)'; -comment on column wf_node_config.tenant_id is '租户id'; -comment on column wf_node_config.create_dept is '创建部门'; -comment on column wf_node_config.create_by is '创建者'; -comment on column wf_node_config.create_time is '创建时间'; -comment on column wf_node_config.update_by is '修改者'; -comment on column wf_node_config.update_time is '修改时间'; - -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, now(), NULL, NULL, ''); - -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, now(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, now(), NULL, NULL, '表单类型列表'); - -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, now(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1,now(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, now(), NULL, NULL, '已完成'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已作废'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已退回'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1,now(), NULL, NULL, '已终止'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, now(), NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '动态表单'); - --- 表单管理 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0', 'workflow:formManage:list', 'tree-table', 103, 1, now(), null, null, '表单管理菜单'); - --- 表单管理按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1, now(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1, now(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1, now(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1, now(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table', 103, 1, now(), null, null, ''); diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index 2397c35f2..88def62bb 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql @@ -1,456 +1,279 @@ -insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'model', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, getdate(), NULL, NULL, ''); +-- Create table for flow_definition +CREATE TABLE dbo.flow_definition +( + id bigint NOT NULL, -- 主键id + flow_code varchar(40) NOT NULL, -- 流程编码 + flow_name varchar(100) NOT NULL, -- 流程名称 + category varchar(100) NULL, -- 流程类别 + version varchar(20) NOT NULL, -- 流程版本 + is_publish tinyint NOT NULL DEFAULT 0, -- 是否发布(0未发布 1已发布 9失效) + form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + activity_status tinyint NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) + listener_type varchar(100) NULL, -- 监听器类型 + listener_path varchar(400) NULL, -- 监听器路径 + ext varchar(500) NULL, -- 业务详情 存业务表对象json字符串 + create_time datetime NULL, -- 创建时间 + update_time datetime NULL, -- 更新时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_definition PRIMARY KEY (id) -- 主键 +); +-- Add table comment (SQL Server doesn't support table comments directly) +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'流程定义表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_definition'; +-- Create table for flow_node +CREATE TABLE dbo.flow_node +( + id bigint NOT NULL, -- 主键id + node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + definition_id bigint NOT NULL, -- 流程定义id + node_code varchar(100) NOT NULL, -- 流程节点编码 + node_name varchar(100) NULL, -- 流程节点名称 + permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) + node_ratio decimal(6,3) NULL, -- 流程签署比例值 + coordinate varchar(100) NULL, -- 坐标 + skip_any_node char(1) NOT NULL DEFAULT 'N', -- 是否可以退回任意节点(Y是 N否)即将删除 + any_node_skip varchar(100) NULL, -- 任意结点跳转 + listener_type varchar(100) NULL, -- 监听器类型 + listener_path varchar(400) NULL, -- 监听器路径 + handler_type varchar(100) NULL, -- 处理器类型 + handler_path varchar(400) NULL, -- 处理器路径 + form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + version varchar(20) NOT NULL, -- 版本 + create_time datetime NULL, -- 创建时间 + update_time datetime NULL, -- 更新时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_node PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'流程节点表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_node'; + +-- Create table for flow_skip +CREATE TABLE dbo.flow_skip +( + id bigint NOT NULL, -- 主键id + definition_id bigint NOT NULL, -- 流程定义id + now_node_code varchar(100) NOT NULL, -- 当前流程节点的编码 + now_node_type tinyint NULL, -- 当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + next_node_code varchar(100) NOT NULL, -- 下一个流程节点的编码 + next_node_type tinyint NULL, -- 下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + skip_name varchar(100) NULL, -- 跳转名称 + skip_type varchar(40) NULL, -- 跳转类型(PASS审批通过 REJECT退回) + skip_condition varchar(200) NULL, -- 跳转条件 + coordinate varchar(100) NULL, -- 坐标 + create_time datetime NULL, -- 创建时间 + update_time datetime NULL, -- 更新时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_skip PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'节点跳转关联表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_skip'; + +-- Create table for flow_instance +CREATE TABLE dbo.flow_instance +( + id bigint NOT NULL, -- 主键id + definition_id bigint NOT NULL, -- 对应flow_definition表的id + business_id varchar(40) NOT NULL, -- 业务id + node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + node_code varchar(40) NOT NULL, -- 流程节点编码 + node_name varchar(100) NULL, -- 流程节点名称 + variable text NULL, -- 任务变量 + flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效) + activity_status tinyint NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) + create_by varchar(64) NOT NULL, -- 创建者 + create_time datetime NULL, -- 创建时间 + update_time datetime NULL, -- 更新时间 + ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_instance PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'流程实例表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_instance'; + +-- Create table for flow_task +CREATE TABLE dbo.flow_task +( + id bigint NOT NULL, -- 主键id + definition_id bigint NOT NULL, -- 对应flow_definition表的id + instance_id bigint NOT NULL, -- 对应flow_instance表的id + node_code varchar(100) NOT NULL, -- 节点编码 + node_name varchar(100) NULL, -- 节点名称 + node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + create_time datetime NULL, -- 创建时间 + update_time datetime NULL, -- 更新时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_task PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'待办任务表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_task'; + +-- Create table for flow_his_task +CREATE TABLE dbo.flow_his_task +( + id bigint NOT NULL, -- 主键id + definition_id bigint NOT NULL, -- 对应flow_definition表的id + instance_id bigint NOT NULL, -- 对应flow_instance表的id + task_id bigint NOT NULL, -- 对应flow_task表的id + node_code varchar(100) NULL, -- 开始节点编码 + node_name varchar(100) NULL, -- 开始节点名称 + node_type tinyint NULL, -- 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + target_node_code varchar(100) NULL, -- 目标节点编码 + target_node_name varchar(100) NULL, -- 结束节点名称 + approver varchar(40) NULL, -- 审批者 + cooperate_type tinyint NOT NULL DEFAULT 0, -- 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + collaborator varchar(40) NULL, -- 协作人 + skip_type varchar(10) NOT NULL, -- 流转类型(PASS通过 REJECT退回 NONE无动作) + flow_status varchar(20) NOT NULL, -- 流程状态(1审批中 2 审批通过 9已退回 10失效) + form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) + form_path varchar(100) NULL, -- 审批表单路径 + message varchar(500) NULL, -- 审批意见 + ext varchar(500) NULL, -- 业务详情 存业务表对象json字符串 + create_time datetime NULL, -- 任务开始时间 + update_time datetime NULL, -- 审批完成时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_his_task PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'历史任务记录表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_his_task'; + +-- Create table for flow_user +CREATE TABLE dbo.flow_user +( + id bigint NOT NULL, -- 主键id + type char(1) NOT NULL, -- 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限) + processed_by varchar(80) NULL, -- 权限人 + associated bigint NOT NULL, -- 任务表id + create_time datetime NULL, -- 创建时间 + create_by varchar(80) NULL, -- 创建人 + update_time datetime NULL, -- 更新时间 + del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 + tenant_id varchar(40) NULL, -- 租户id + CONSTRAINT PK_flow_user PRIMARY KEY (id) -- 主键 +); +EXEC sp_addextendedproperty + @name = N'MS_Description', @value = N'流程用户表', + @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_user'; + +-- ---------------------------- +-- 流程分类表 +-- ---------------------------- +CREATE TABLE flow_category +( + category_id BIGINT NOT NULL, -- 流程分类ID + tenant_id VARCHAR(20) DEFAULT '000000', -- 租户编号 + parent_id BIGINT DEFAULT 0, -- 父流程分类id + ancestors VARCHAR(500) DEFAULT '', -- 祖级列表 + category_name VARCHAR(30) NOT NULL, -- 流程分类名称 + order_num INT DEFAULT 0, -- 显示顺序 + del_flag CHAR(1) DEFAULT '0', -- 删除标志(0代表存在 2代表删除) + create_dept BIGINT NULL, -- 创建部门 + create_by BIGINT NULL, -- 创建者 + create_time DATETIME NULL, -- 创建时间 + update_by BIGINT NULL, -- 更新者 + update_time DATETIME NULL, -- 更新时间 + CONSTRAINT PK_flow_category PRIMARY KEY (category_id) -- 主键 +); + +INSERT INTO flow_category (category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) +VALUES + (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, GETDATE(), NULL, NULL), + (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, GETDATE(), NULL, NULL), + (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, GETDATE(), NULL, NULL), + (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, GETDATE(), NULL, NULL), + (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, GETDATE(), NULL, NULL), + (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, GETDATE(), NULL, NULL), + (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, GETDATE(), NULL, NULL), + (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, GETDATE(), NULL, NULL), + (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, GETDATE(), NULL, NULL), + (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, GETDATE(), NULL, NULL); + +-- ---------------------------- +-- 请假单信息 +-- ---------------------------- +CREATE TABLE test_leave +( + id BIGINT NOT NULL, -- id + tenant_id VARCHAR(20) DEFAULT '000000', -- 租户编号 + leave_type VARCHAR(255) NOT NULL, -- 请假类型 + start_date DATETIME NOT NULL, -- 开始时间 + end_date DATETIME NOT NULL, -- 结束时间 + leave_days INT NOT NULL, -- 请假天数 + remark VARCHAR(255) NULL, -- 请假原因 + status VARCHAR(255) NULL, -- 状态 + create_dept BIGINT NULL, -- 创建部门 + create_by BIGINT NULL, -- 创建者 + create_time DATETIME NULL, -- 创建时间 + update_by BIGINT NULL, -- 更新者 + update_time DATETIME NULL, -- 更新时间 + CONSTRAINT PK_test_leave PRIMARY KEY (id) -- 主键 +); + +INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, GETDATE(), NULL, NULL, ''); -- 流程分类管理相关按钮 -insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, getdate(), null, null, ''); --- 请假单信息 -create table test_leave -( - id bigint not null - primary key, - leave_type nvarchar(255) not null, - start_date datetime2 not null, - end_date datetime2 not null, - leave_days int not null, - remark nvarchar(255), - status nvarchar(255), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2, - tenant_id nvarchar(20) -) -go - -exec sp_addextendedproperty 'MS_Description', N'请假申请表', 'SCHEMA', 'dbo', 'TABLE', 'test_leave' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'请假类型', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'leave_type' -go - -exec sp_addextendedproperty 'MS_Description', N'开始时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'start_date' -go - -exec sp_addextendedproperty 'MS_Description', N'结束时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'end_date' -go - -exec sp_addextendedproperty 'MS_Description', N'请假天数', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'leave_days' -go - -exec sp_addextendedproperty 'MS_Description', N'请假原因', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'remark' -go - -exec sp_addextendedproperty 'MS_Description', N'状态', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'status' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', - 'update_time' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'tenant_id' -go - --- 流程分类信息表 -create table wf_category -( - id bigint not null - primary key, - category_name nvarchar(255), - category_code nvarchar(255) - constraint uni_category_code - unique, - parent_id bigint, - sort_num int, - tenant_id nvarchar(20), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2 -) -go - -exec sp_addextendedproperty 'MS_Description', N'流程分类', 'SCHEMA', 'dbo', 'TABLE', 'wf_category' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'分类名称', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'category_name' -go - -exec sp_addextendedproperty 'MS_Description', N'分类编码', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'category_code' -go - -exec sp_addextendedproperty 'MS_Description', N'父级id', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'parent_id' -go - -exec sp_addextendedproperty 'MS_Description', N'排序', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'sort_num' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'tenant_id' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', - 'update_time' -go - -INSERT INTO wf_category values (1, 'OA', 'OA', 0, 0, '000000', 103, 1, getdate(), 1, getdate()); - -create table wf_task_back_node -( - id bigint not null primary key, - node_id nvarchar(255) not null, - node_name nvarchar(255) not null, - order_no int not null, - instance_id nvarchar(255) not null, - task_type nvarchar(255) not null, - assignee nvarchar(2000) not null, - tenant_id nvarchar(20), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2 -) - -go -exec sp_addextendedproperty 'MS_Description', N'节点审批记录', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'节点id', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'node_id' -go - -exec sp_addextendedproperty 'MS_Description', N'节点名称', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'node_name' -go - -exec sp_addextendedproperty 'MS_Description', N'排序', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'order_no' -go - -exec sp_addextendedproperty 'MS_Description', N'流程实例id', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'instance_id' -go - -exec sp_addextendedproperty 'MS_Description', N'节点类型', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'task_type' -go - -exec sp_addextendedproperty 'MS_Description', N'审批人', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'assignee' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'tenant_id' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_task_back_node', 'COLUMN', - 'update_time' -go - -create table wf_definition_config -( - id bigint not null primary key, - table_name nvarchar(255) not null, - definition_id nvarchar(255) not null - constraint uni_definition_id - unique, - process_key nvarchar(255) not null, - version bigint not null, - remark nvarchar(500) DEFAULT ('') null, - tenant_id nvarchar(20), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2 -) - -go -exec sp_addextendedproperty 'MS_Description', N'流程定义配置', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'表名', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'table_name' -go - -exec sp_addextendedproperty 'MS_Description', N'流程定义ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'definition_id' -go - -exec sp_addextendedproperty 'MS_Description', N'流程KEY', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'process_key' -go - -exec sp_addextendedproperty 'MS_Description', N'流程版本', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'version' -go - -exec sp_addextendedproperty 'MS_Description', N'备注', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'remark' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'tenant_id' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', - 'update_time' -go - -create table wf_form_manage -( - id bigint not null primary key, - form_name nvarchar(255) not null, - form_type nvarchar(255) not null, - router nvarchar(255) not null, - remark nvarchar(500) null, - tenant_id nvarchar(20), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2 -) - -go -exec sp_addextendedproperty 'MS_Description', N'表单管理', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'表单名称', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'form_name' -go - -exec sp_addextendedproperty 'MS_Description', N'表单类型', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'form_type' -go - -exec sp_addextendedproperty 'MS_Description', N'路由地址/表单ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'router' -go - -exec sp_addextendedproperty 'MS_Description', N'备注', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'remark' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'tenant_id' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_manage', 'COLUMN', - 'update_time' -go - -insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, getdate(), 1, getdate()); - -create table wf_node_config -( - id bigint not null primary key, - form_id bigint, - form_type nvarchar(255) , - node_name nvarchar(255) not null, - node_id nvarchar(255) not null, - definition_id nvarchar(255) not null, - apply_user_task nchar default ('0') null, - tenant_id nvarchar(20), - create_dept bigint, - create_by bigint, - create_time datetime2, - update_by bigint, - update_time datetime2 -) - -go -exec sp_addextendedproperty 'MS_Description', N'节点配置', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config' -go - -exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', 'id' -go - -exec sp_addextendedproperty 'MS_Description', N'表单id', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'form_id' -go - -exec sp_addextendedproperty 'MS_Description', N'表单类型', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'form_type' -go - -exec sp_addextendedproperty 'MS_Description', N'节点名称', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'node_name' -go - -exec sp_addextendedproperty 'MS_Description', N'节点id', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'node_id' -go - -exec sp_addextendedproperty 'MS_Description', N'流程定义id', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'definition_id' -go - -exec sp_addextendedproperty 'MS_Description', N'是否为申请人节点 (0是 1否)', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'apply_user_task' -go - -exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'tenant_id' -go - -exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'create_dept' -go - -exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', 'create_by' -go - -exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'create_time' -go - -exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', 'update_by' -go - -exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_node_config', 'COLUMN', - 'update_time' -go - -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, getdate(), NULL, NULL, ''); - -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, getdate(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, getdate(), NULL, NULL, '表单类型列表'); - -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, getdate(), NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, getdate(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1,getdate(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, getdate(), NULL, NULL, '已完成'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, getdate(), NULL, NULL, '已作废'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, getdate(), NULL, NULL, '已退回'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1,getdate(), NULL, NULL, '已终止'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, getdate(), NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, getdate(), NULL, NULL, '动态表单'); - --- 表单管理 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11628, '表单管理', '11616', '5', 'formManage', 'workflow/formManage/index', 1, 0, 'C', '0', '0', 'workflow:formManage:list', 'tree-table', 103, 1, getdate(), null, null, '表单管理菜单'); - --- 表单管理按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11644, '表单管理查询', 11628, '1', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:query', '', 103, 1, getdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11645, '表单管理新增', 11628, '2', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:add', '', 103, 1, getdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11646, '表单管理修改', 11628, '3', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:edit', '', 103, 1, getdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11647, '表单管理删除', 11628, '4', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:remove', '', 103, 1, getdate(), null, null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) -values(11648, '表单管理导出', 11628, '5', '#', '', 1, 0, 'F', '0', '0', 'workflow:formManage:export', 'tree-table', 103, 1, getdate(), null, null, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, GETDATE(), NULL, NULL, ''); + +-- 请假测试相关按钮 +INSERT INTO sys_menu VALUES ('11638', '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, GETDATE(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES ('11639', '请假申请查询', '11638', 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11640', '请假申请新增', '11638', 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11641', '请假申请修改', '11638', 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11642', '请假申请删除', '11638', 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11643', '请假申请导出', '11638', 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, GETDATE(), NULL, NULL, ''); + +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, GETDATE(), NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, GETDATE(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, GETDATE(), NULL, NULL, '任务状态'); + +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, GETDATE(), NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '超时'); From cb6bb3b136a26851ccf5e937917713095206ea22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 7 Jan 2025 17:50:11 +0800 Subject: [PATCH 219/227] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=20warmflow?= =?UTF-8?q?=20oracle=20pg=20sqlserver=20sql=E8=84=9A=E6=9C=AC=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_workflow.sql | 151 +- script/sql/postgres/postgres_ry_workflow.sql | 114 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 6 +- .../sql/sqlserver/sqlserver_ry_workflow.sql | 1553 ++++++++++++++--- 4 files changed, 1414 insertions(+), 410 deletions(-) diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index dd76fe801..730b7ea27 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -539,55 +539,16 @@ COMMENT ON COLUMN flow_category.create_time IS '创建时间'; COMMENT ON COLUMN flow_category.update_by IS '更新者'; COMMENT ON COLUMN flow_category.update_time IS '更新时间'; -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, SYSDATE, NULL, NULL); - -INSERT INTO flow_category -(category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, SYSDATE, NULL, NULL); +INSERT INTO flow_category VALUES (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, SYSDATE, NULL, NULL); -- ---------------------------- @@ -626,52 +587,52 @@ COMMENT ON COLUMN test_leave.create_time IS '创建时间'; COMMENT ON COLUMN test_leave.update_by IS '更新者'; COMMENT ON COLUMN test_leave.update_time IS '更新时间'; -INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, SYSDATE(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, SYSDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, SYSDATE(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, SYSDATE, NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, SYSDATE(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, SYSDATE(), NULL, NULL, '表单类型列表'); -INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, SYSDATE(), NULL, NULL, '任务状态'); -INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, SYSDATE(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '已完成'); -INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已作废'); -INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已退回'); -INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '已终止'); -INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '动态表单'); -INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '撤销'); -INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, SYSDATE(), NULL, NULL, '通过'); -INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '作废'); -INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '退回'); -INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '终止'); -INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '转办'); -INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '委托'); -INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '抄送'); -INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE(), NULL, NULL, '加签'); -INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '减签'); -INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE(), NULL, NULL, '超时'); +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, SYSDATE, NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, SYSDATE, NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, SYSDATE, NULL, NULL, '任务状态'); +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, SYSDATE, NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, SYSDATE, NULL, NULL, '已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, SYSDATE, NULL, NULL, '自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, SYSDATE, NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, SYSDATE, NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, SYSDATE, NULL, NULL, '超时'); diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index cdae13866..a84873285 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -304,18 +304,16 @@ COMMENT ON COLUMN flow_category.create_time IS '创建时间'; COMMENT ON COLUMN flow_category.update_by IS '更新者'; COMMENT ON COLUMN flow_category.update_time IS '更新时间'; -INSERT INTO flow_category (category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, - create_dept, create_by, create_time, update_by, update_time) -VALUES (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL), - (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, CURRENT_TIMESTAMP, NULL, NULL); +INSERT INTO flow_category VALUES (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, now(), NULL, NULL); +INSERT INTO flow_category VALUES (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, now(), NULL, NULL); -- ---------------------------- -- 请假单信息 @@ -353,51 +351,51 @@ COMMENT ON COLUMN test_leave.create_time IS '创建时间'; COMMENT ON COLUMN test_leave.update_by IS '更新者'; COMMENT ON COLUMN test_leave.update_time IS '更新时间'; -INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, current_timestamp, NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, current_timestamp, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, current_timestamp, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11638', '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES ('11639', '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11640', '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11641', '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11642', '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11643', '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, current_timestamp, NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, current_timestamp, NULL, NULL, '表单类型列表'); -INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, current_timestamp, NULL, NULL, '任务状态'); -INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, current_timestamp, NULL, NULL, '草稿'); -INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '已完成'); -INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已作废'); -INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已退回'); -INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '已终止'); -INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '动态表单'); -INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '撤销'); -INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, current_timestamp, NULL, NULL, '通过'); -INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '作废'); -INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '退回'); -INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '终止'); -INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '转办'); -INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '委托'); -INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '抄送'); -INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, current_timestamp, NULL, NULL, '加签'); -INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '减签'); -INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, current_timestamp, NULL, NULL, '超时'); +INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, now(), NULL, NULL, '业务状态列表'); +INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, now(), NULL, NULL, '表单类型列表'); +INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, now(), NULL, NULL, '任务状态'); +INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已撤销'); +INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, now(), NULL, NULL, '草稿'); +INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, now(), NULL, NULL, '已完成'); +INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已作废'); +INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已退回'); +INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '已终止'); +INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, now(), NULL, NULL, '自定义表单'); +INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '动态表单'); +INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '撤销'); +INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, now(), NULL, NULL, '通过'); +INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '待审核'); +INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '作废'); +INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '退回'); +INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '终止'); +INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '转办'); +INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '委托'); +INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '抄送'); +INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, now(), NULL, NULL, '加签'); +INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '减签'); +INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, now(), NULL, NULL, '超时'); diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index bf8661514..bc0da269a 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -210,7 +210,11 @@ EXEC sys.sp_addextendedproperty 'TABLE', N'sys_social', 'COLUMN', N'update_time' GO - +EXEC sp_addextendedproperty + 'MS_Description', N'社会化关系表', + 'SCHEMA', N'dbo', + 'TABLE', N'sys_social' +GO CREATE TABLE sys_tenant ( diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index 88def62bb..dc5c6b210 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql @@ -1,279 +1,1320 @@ --- Create table for flow_definition -CREATE TABLE dbo.flow_definition -( - id bigint NOT NULL, -- 主键id - flow_code varchar(40) NOT NULL, -- 流程编码 - flow_name varchar(100) NOT NULL, -- 流程名称 - category varchar(100) NULL, -- 流程类别 - version varchar(20) NOT NULL, -- 流程版本 - is_publish tinyint NOT NULL DEFAULT 0, -- 是否发布(0未发布 1已发布 9失效) - form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) - form_path varchar(100) NULL, -- 审批表单路径 - activity_status tinyint NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) - listener_type varchar(100) NULL, -- 监听器类型 - listener_path varchar(400) NULL, -- 监听器路径 - ext varchar(500) NULL, -- 业务详情 存业务表对象json字符串 - create_time datetime NULL, -- 创建时间 - update_time datetime NULL, -- 更新时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_definition PRIMARY KEY (id) -- 主键 -); --- Add table comment (SQL Server doesn't support table comments directly) +CREATE TABLE flow_definition ( + id bigint NOT NULL, + flow_code nvarchar(40) NOT NULL, + flow_name nvarchar(100) NOT NULL, + category nvarchar(100) NULL, + version nvarchar(20) NOT NULL, + is_publish tinyint DEFAULT('0') NULL, + form_custom nchar(1) DEFAULT('N') NULL, + form_path nvarchar(100) NULL, + activity_status tinyint DEFAULT('1') NULL, + listener_type nvarchar(100) NULL, + listener_path nvarchar(400) NULL, + ext nvarchar(500) NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_def__3213E83FEE39AE33 PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'流程定义表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_definition'; +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'id' +GO --- Create table for flow_node -CREATE TABLE dbo.flow_node -( - id bigint NOT NULL, -- 主键id - node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - definition_id bigint NOT NULL, -- 流程定义id - node_code varchar(100) NOT NULL, -- 流程节点编码 - node_name varchar(100) NULL, -- 流程节点名称 - permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) - node_ratio decimal(6,3) NULL, -- 流程签署比例值 - coordinate varchar(100) NULL, -- 坐标 - skip_any_node char(1) NOT NULL DEFAULT 'N', -- 是否可以退回任意节点(Y是 N否)即将删除 - any_node_skip varchar(100) NULL, -- 任意结点跳转 - listener_type varchar(100) NULL, -- 监听器类型 - listener_path varchar(400) NULL, -- 监听器路径 - handler_type varchar(100) NULL, -- 处理器类型 - handler_path varchar(400) NULL, -- 处理器路径 - form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) - form_path varchar(100) NULL, -- 审批表单路径 - version varchar(20) NOT NULL, -- 版本 - create_time datetime NULL, -- 创建时间 - update_time datetime NULL, -- 更新时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_node PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'流程节点表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_node'; +'MS_Description', N'流程编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'flow_code' +GO --- Create table for flow_skip -CREATE TABLE dbo.flow_skip -( - id bigint NOT NULL, -- 主键id - definition_id bigint NOT NULL, -- 流程定义id - now_node_code varchar(100) NOT NULL, -- 当前流程节点的编码 - now_node_type tinyint NULL, -- 当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - next_node_code varchar(100) NOT NULL, -- 下一个流程节点的编码 - next_node_type tinyint NULL, -- 下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - skip_name varchar(100) NULL, -- 跳转名称 - skip_type varchar(40) NULL, -- 跳转类型(PASS审批通过 REJECT退回) - skip_condition varchar(200) NULL, -- 跳转条件 - coordinate varchar(100) NULL, -- 坐标 - create_time datetime NULL, -- 创建时间 - update_time datetime NULL, -- 更新时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_skip PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'节点跳转关联表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_skip'; +'MS_Description', N'流程名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'flow_name' +GO --- Create table for flow_instance -CREATE TABLE dbo.flow_instance -( - id bigint NOT NULL, -- 主键id - definition_id bigint NOT NULL, -- 对应flow_definition表的id - business_id varchar(40) NOT NULL, -- 业务id - node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - node_code varchar(40) NOT NULL, -- 流程节点编码 - node_name varchar(100) NULL, -- 流程节点名称 - variable text NULL, -- 任务变量 - flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效) - activity_status tinyint NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) - create_by varchar(64) NOT NULL, -- 创建者 - create_time datetime NULL, -- 创建时间 - update_time datetime NULL, -- 更新时间 - ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_instance PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'流程实例表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_instance'; +'MS_Description', N'流程类别', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'category' +GO --- Create table for flow_task -CREATE TABLE dbo.flow_task -( - id bigint NOT NULL, -- 主键id - definition_id bigint NOT NULL, -- 对应flow_definition表的id - instance_id bigint NOT NULL, -- 对应flow_instance表的id - node_code varchar(100) NOT NULL, -- 节点编码 - node_name varchar(100) NULL, -- 节点名称 - node_type tinyint NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) - form_path varchar(100) NULL, -- 审批表单路径 - create_time datetime NULL, -- 创建时间 - update_time datetime NULL, -- 更新时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_task PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'待办任务表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_task'; +'MS_Description', N'流程版本', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'version' +GO --- Create table for flow_his_task -CREATE TABLE dbo.flow_his_task -( - id bigint NOT NULL, -- 主键id - definition_id bigint NOT NULL, -- 对应flow_definition表的id - instance_id bigint NOT NULL, -- 对应flow_instance表的id - task_id bigint NOT NULL, -- 对应flow_task表的id - node_code varchar(100) NULL, -- 开始节点编码 - node_name varchar(100) NULL, -- 开始节点名称 - node_type tinyint NULL, -- 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - target_node_code varchar(100) NULL, -- 目标节点编码 - target_node_name varchar(100) NULL, -- 结束节点名称 - approver varchar(40) NULL, -- 审批者 - cooperate_type tinyint NOT NULL DEFAULT 0, -- 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) - collaborator varchar(40) NULL, -- 协作人 - skip_type varchar(10) NOT NULL, -- 流转类型(PASS通过 REJECT退回 NONE无动作) - flow_status varchar(20) NOT NULL, -- 流程状态(1审批中 2 审批通过 9已退回 10失效) - form_custom char(1) NOT NULL DEFAULT 'N', -- 审批表单是否自定义(Y是 N否) - form_path varchar(100) NULL, -- 审批表单路径 - message varchar(500) NULL, -- 审批意见 - ext varchar(500) NULL, -- 业务详情 存业务表对象json字符串 - create_time datetime NULL, -- 任务开始时间 - update_time datetime NULL, -- 审批完成时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_his_task PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'历史任务记录表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_his_task'; +'MS_Description', N'是否发布(0未发布 1已发布 9失效)', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'is_publish' +GO --- Create table for flow_user -CREATE TABLE dbo.flow_user -( - id bigint NOT NULL, -- 主键id - type char(1) NOT NULL, -- 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限) - processed_by varchar(80) NULL, -- 权限人 - associated bigint NOT NULL, -- 任务表id - create_time datetime NULL, -- 创建时间 - create_by varchar(80) NULL, -- 创建人 - update_time datetime NULL, -- 更新时间 - del_flag char(1) NOT NULL DEFAULT '0', -- 删除标志 - tenant_id varchar(40) NULL, -- 租户id - CONSTRAINT PK_flow_user PRIMARY KEY (id) -- 主键 -); EXEC sp_addextendedproperty - @name = N'MS_Description', @value = N'流程用户表', - @level0type = N'SCHEMA', @level0name = 'dbo', @level1type = N'TABLE', @level1name = 'flow_user'; +'MS_Description', N'审批表单是否自定义(Y是 N否)', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'form_custom' +GO --- ---------------------------- --- 流程分类表 --- ---------------------------- -CREATE TABLE flow_category -( - category_id BIGINT NOT NULL, -- 流程分类ID - tenant_id VARCHAR(20) DEFAULT '000000', -- 租户编号 - parent_id BIGINT DEFAULT 0, -- 父流程分类id - ancestors VARCHAR(500) DEFAULT '', -- 祖级列表 - category_name VARCHAR(30) NOT NULL, -- 流程分类名称 - order_num INT DEFAULT 0, -- 显示顺序 - del_flag CHAR(1) DEFAULT '0', -- 删除标志(0代表存在 2代表删除) - create_dept BIGINT NULL, -- 创建部门 - create_by BIGINT NULL, -- 创建者 - create_time DATETIME NULL, -- 创建时间 - update_by BIGINT NULL, -- 更新者 - update_time DATETIME NULL, -- 更新时间 - CONSTRAINT PK_flow_category PRIMARY KEY (category_id) -- 主键 -); +EXEC sp_addextendedproperty +'MS_Description', N'审批表单路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'form_path' +GO -INSERT INTO flow_category (category_id, tenant_id, parent_id, ancestors, category_name, order_num, del_flag, create_dept, create_by, create_time, update_by, update_time) -VALUES - (100, '000000', 0, '0', 'OA审批', 0, '0', 103, 1, GETDATE(), NULL, NULL), - (101, '000000', 100, '0,100', '假勤管理', 0, '0', 103, 1, GETDATE(), NULL, NULL), - (102, '000000', 100, '0,100', '人事管理', 0, '0', 103, 1, GETDATE(), NULL, NULL), - (103, '000000', 101, '0,100,101', '请假', 0, '0', 103, 1, GETDATE(), NULL, NULL), - (104, '000000', 101, '0,100,101', '出差', 1, '0', 103, 1, GETDATE(), NULL, NULL), - (105, '000000', 101, '0,100,101', '加班', 2, '0', 103, 1, GETDATE(), NULL, NULL), - (106, '000000', 101, '0,100,101', '换班', 3, '0', 103, 1, GETDATE(), NULL, NULL), - (107, '000000', 101, '0,100,101', '外出', 4, '0', 103, 1, GETDATE(), NULL, NULL), - (108, '000000', 102, '0,100,102', '转正', 1, '0', 103, 1, GETDATE(), NULL, NULL), - (109, '000000', 102, '0,100,102', '离职', 2, '0', 103, 1, GETDATE(), NULL, NULL); +EXEC sp_addextendedproperty +'MS_Description', N'流程激活状态(0挂起 1激活)', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'activity_status' +GO --- ---------------------------- --- 请假单信息 --- ---------------------------- -CREATE TABLE test_leave -( - id BIGINT NOT NULL, -- id - tenant_id VARCHAR(20) DEFAULT '000000', -- 租户编号 - leave_type VARCHAR(255) NOT NULL, -- 请假类型 - start_date DATETIME NOT NULL, -- 开始时间 - end_date DATETIME NOT NULL, -- 结束时间 - leave_days INT NOT NULL, -- 请假天数 - remark VARCHAR(255) NULL, -- 请假原因 - status VARCHAR(255) NULL, -- 状态 - create_dept BIGINT NULL, -- 创建部门 - create_by BIGINT NULL, -- 创建者 - create_time DATETIME NULL, -- 创建时间 - update_by BIGINT NULL, -- 更新者 - update_time DATETIME NULL, -- 更新时间 - CONSTRAINT PK_test_leave PRIMARY KEY (id) -- 主键 -); +EXEC sp_addextendedproperty +'MS_Description', N'监听器类型', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'listener_type' +GO -INSERT INTO sys_menu VALUES ('11616', '工作流', '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'workflow', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'my-task', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'finish', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'my-copy', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'process-definition', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'category', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, GETDATE(), NULL, NULL, ''); +EXEC sp_addextendedproperty +'MS_Description', N'监听器路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'listener_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务详情 存业务表对象json字符串', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'ext' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义表', +'SCHEMA', N'dbo', +'TABLE', N'flow_definition' +GO + +CREATE TABLE flow_node ( + id bigint NOT NULL, + node_type tinyint NOT NULL, + definition_id bigint NOT NULL, + node_code nvarchar(100) NOT NULL, + node_name nvarchar(100) NULL, + permission_flag nvarchar(200) NULL, + node_ratio decimal(6,3) NULL, + coordinate nvarchar(100) NULL, + skip_any_node nvarchar(100) DEFAULT('N') NULL, + any_node_skip nvarchar(100) NULL, + listener_type nvarchar(100) NULL, + listener_path nvarchar(400) NULL, + handler_type nvarchar(100) NULL, + handler_path nvarchar(400) NULL, + form_custom nchar(1) DEFAULT('N') NULL, + form_path nvarchar(100) NULL, + version nvarchar(20) NOT NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_nod__3213E83F372470DE PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义id', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程节点编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程节点名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'node_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限标识(权限类型:权限标识,可以多个,用逗号隔开)', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'permission_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程签署比例值', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'node_ratio' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'坐标', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'coordinate' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否可以退回任意节点(Y是 N否)即将删除', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'skip_any_node' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任意结点跳转', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'any_node_skip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'监听器类型', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'listener_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'监听器路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'listener_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器类型', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'handler_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'handler_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单是否自定义(Y是 N否)', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'form_custom' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'form_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'版本', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'version' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程节点表', +'SCHEMA', N'dbo', +'TABLE', N'flow_node' +GO + +CREATE TABLE flow_skip ( + id bigint NOT NULL, + definition_id bigint NOT NULL, + now_node_code nvarchar(100) NOT NULL, + now_node_type tinyint NULL, + next_node_code nvarchar(100) NOT NULL, + next_node_type tinyint NULL, + skip_name nvarchar(100) NULL, + skip_type nvarchar(40) NULL, + skip_condition nvarchar(200) NULL, + coordinate nvarchar(100) NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_ski__3213E83F073FEE6E PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义id', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'当前流程节点的编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'now_node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'now_node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'下一个流程节点的编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'next_node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'next_node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'跳转名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'skip_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'跳转类型(PASS审批通过 REJECT退回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'skip_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'跳转条件', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'skip_condition' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'坐标', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'coordinate' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点跳转关联表', +'SCHEMA', N'dbo', +'TABLE', N'flow_skip' +GO + +CREATE TABLE flow_instance ( + id bigint NOT NULL, + definition_id bigint NOT NULL, + business_id nvarchar(40) NOT NULL, + node_type tinyint NOT NULL, + node_code nvarchar(40) NOT NULL, + node_name nvarchar(100) NULL, + variable nvarchar(max) NULL, + flow_status nvarchar(20) NOT NULL, + activity_status tinyint DEFAULT('1') NULL, + create_by nvarchar(64) NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + ext nvarchar(500) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_ins__3213E83F5190FEE1 PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +TEXTIMAGE_ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_definition表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务id', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'business_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程节点编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程节点名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'node_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务变量', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'variable' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'flow_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程激活状态(0挂起 1激活)', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'activity_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'扩展字段,预留给业务系统使用', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'ext' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例表', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance' +GO + +CREATE TABLE flow_task ( + id bigint NOT NULL, + definition_id bigint NOT NULL, + instance_id bigint NOT NULL, + node_code nvarchar(100) NOT NULL, + node_name nvarchar(100) NULL, + node_type tinyint NOT NULL, + form_custom nchar(1) DEFAULT('N') NULL, + form_path nvarchar(100) NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_tas__3213E83F5AE1F1BA PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_definition表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_instance表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'instance_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'node_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单是否自定义(Y是 N否)', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'form_custom' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'form_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'待办任务表', +'SCHEMA', N'dbo', +'TABLE', N'flow_task' +GO + +CREATE TABLE flow_his_task ( + id bigint NOT NULL, + definition_id bigint NOT NULL, + instance_id bigint NOT NULL, + task_id bigint NOT NULL, + node_code nvarchar(100) NULL, + node_name nvarchar(100) NULL, + node_type tinyint NULL, + target_node_code nvarchar(100) NULL, + target_node_name nvarchar(100) NULL, + approver nvarchar(40) NULL, + cooperate_type tinyint DEFAULT('0') NULL, + collaborator nvarchar(40) NULL, + skip_type nvarchar(10) NOT NULL, + flow_status nvarchar(20) NOT NULL, + form_custom nchar(1) DEFAULT('N') NULL, + form_path nvarchar(100) NULL, + message nvarchar(500) NULL, + ext nvarchar(500) NULL, + create_time datetime2(7) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_his__3213E83F67951564 PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_definition表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_instance表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'instance_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'对应flow_task表的id', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'task_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始节点编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始节点名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'node_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'node_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'目标节点编码', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'target_node_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束节点名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'target_node_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批者', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'approver' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'cooperate_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'协作人', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'collaborator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流转类型(PASS通过 REJECT退回 NONE无动作)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'skip_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程状态(1审批中 2 审批通过 9已退回 10失效)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'flow_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单是否自定义(Y是 N否)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'form_custom' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批表单路径', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'form_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批意见', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'message' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务详情 存业务表对象json字符串', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'ext' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务开始时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批完成时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'历史任务记录表', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task' +GO + +CREATE TABLE flow_user ( + id bigint NOT NULL, + type nchar(1) NOT NULL, + processed_by nvarchar(80) NULL, + associated bigint NOT NULL, + create_time datetime2(7) NULL, + create_by nvarchar(80) NULL, + update_time datetime2(7) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + tenant_id nvarchar(40) NULL, + CONSTRAINT PK__flow_use__3213E83FFA38CA8B PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +CREATE NONCLUSTERED INDEX user_processed_type ON flow_user (processed_by ASC, type ASC) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键id', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限人', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'processed_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务表id', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'associated' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建人', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户id', +'SCHEMA', N'dbo', +'TABLE', N'flow_user', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程用户表', +'SCHEMA', N'dbo', +'TABLE', N'flow_user' +GO + +CREATE TABLE flow_category ( + category_id bigint NOT NULL, + tenant_id nvarchar(20) DEFAULT('000000') NULL, + parent_id bigint DEFAULT(0) NULL, + ancestors nvarchar(500) DEFAULT('') NULL, + category_name nvarchar(30) NOT NULL, + order_num int DEFAULT(0) NULL, + del_flag nchar(1) DEFAULT('0') NULL, + create_dept bigint NULL, + create_by bigint NULL, + create_time datetime2(7) NULL, + update_by bigint NULL, + update_time datetime2(7) NULL, + CONSTRAINT PK__flow_cat__D54EE9B4AE98B9C1 PRIMARY KEY CLUSTERED (category_id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程分类ID', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'category_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父流程分类id', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'祖级列表', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'ancestors' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程分类名称', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'category_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示顺序', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'order_num' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'删除标志(0代表存在 2代表删除)', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'del_flag' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建部门', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'create_dept' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'flow_category', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程分类', +'SCHEMA', N'dbo', +'TABLE', N'flow_category' +GO + +INSERT flow_category VALUES (100, N'000000', 0, N'0', N'OA审批', 0, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (101, N'000000', 100, N'0,100', N'假勤管理', 0, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (102, N'000000', 100, N'0,100', N'人事管理', 0, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (103, N'000000', 101, N'0,100,101', N'请假', 0, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (104, N'000000', 101, N'0,100,101', N'出差', 1, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (105, N'000000', 101, N'0,100,101', N'加班', 2, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (106, N'000000', 101, N'0,100,101', N'换班', 3, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (107, N'000000', 101, N'0,100,101', N'外出', 4, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (108, N'000000', 102, N'0,100,102', N'转正', 1, N'0', 103, 1, getdate(), NULL, NULL); +GO +INSERT flow_category VALUES (109, N'000000', 102, N'0,100,102', N'离职', 2, N'0', 103, 1, getdate(), NULL, NULL); +GO + +CREATE TABLE test_leave ( + id bigint NOT NULL, + tenant_id nvarchar(20) DEFAULT('000000') NULL, + leave_type nvarchar(255) NOT NULL, + start_date datetime2(7) NOT NULL, + end_date datetime2(7) NOT NULL, + leave_days int NOT NULL, + remark nvarchar(255) NULL, + status nvarchar(255) NULL, + create_dept bigint NULL, + create_by bigint NULL, + create_time datetime2(7) NULL, + update_by bigint NULL, + update_time datetime2(7) NULL, + CONSTRAINT PK__test_lea__3213E83F348788FA PRIMARY KEY CLUSTERED (id) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +ON [PRIMARY] +GO + +EXEC sp_addextendedproperty +'MS_Description', N'id', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假类型', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'leave_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始时间', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'start_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束时间', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'end_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假天数', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'leave_days' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假原因', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建部门', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'create_dept' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'create_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'update_by' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'test_leave', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假申请表', +'SCHEMA', N'dbo', +'TABLE', N'test_leave' +GO + +INSERT sys_menu VALUES (11616, N'工作流', 0, 6, N'workflow', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'workflow', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11618, N'我的任务', 0, 7, N'task', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'my-task', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11619, N'我的待办', 11618, 2, N'taskWaiting', N'workflow/task/taskWaiting', N'', 1, 1, N'C', N'0', N'0', N'', N'waiting', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11632, N'我的已办', 11618, 3, N'taskFinish', N'workflow/task/taskFinish', N'', 1, 1, N'C', N'0', N'0', N'', N'finish', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11633, N'我的抄送', 11618, 4, N'taskCopyList', N'workflow/task/taskCopyList', N'', 1, 1, N'C', N'0', N'0', N'', N'my-copy', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11620, N'流程定义', 11616, 3, N'processDefinition', N'workflow/processDefinition/index', N'', 1, 1, N'C', N'0', N'0', N'', N'process-definition', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11621, N'流程实例', 11630, 1, N'processInstance', N'workflow/processInstance/index', N'', 1, 1, N'C', N'0', N'0', N'', N'tree-table', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11622, N'流程分类', 11616, 1, N'category', N'workflow/category/index', N'', 1, 0, N'C', N'0', N'0', N'workflow:category:list', N'category', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11629, N'我发起的', 11618, 1, N'myDocument', N'workflow/task/myDocument', N'', 1, 1, N'C', N'0', N'0', N'', N'guide', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11630, N'流程监控', 11616, 4, N'monitor', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'monitor', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11631, N'待办任务', 11630, 2, N'allTaskWaiting', N'workflow/task/allTaskWaiting', N'', 1, 1, N'C', N'0', N'0', N'', N'waiting', 103, 1, GETDATE(), NULL, NULL, N''); +GO -- 流程分类管理相关按钮 -INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT sys_menu VALUES (11623, N'流程分类查询', 11622, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:category:query', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11624, N'流程分类新增', 11622, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:category:add', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11625, N'流程分类修改', 11622, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:category:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11626, N'流程分类删除', 11622, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:category:remove', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11627, N'流程分类导出', 11622, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:category:export', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO -- 请假测试相关按钮 -INSERT INTO sys_menu VALUES ('11638', '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, GETDATE(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu VALUES ('11639', '请假申请查询', '11638', 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11640', '请假申请新增', '11638', 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11641', '请假申请修改', '11638', 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11642', '请假申请删除', '11638', 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, GETDATE(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11643', '请假申请导出', '11638', 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, GETDATE(), NULL, NULL, ''); +INSERT sys_menu VALUES (11638, N'请假申请', 5, 1, N'leave', N'workflow/leave/index', N'', 1, 0, N'C', N'0', N'0', N'workflow:leave:list', N'#', 103, 1, GETDATE(), NULL, NULL, N'请假申请菜单'); +GO +INSERT sys_menu VALUES (11639, N'请假申请查询', 11638, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:leave:query', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11640, N'请假申请新增', 11638, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:leave:add', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11641, N'请假申请修改', 11638, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:leave:edit', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11642, N'请假申请删除', 11638, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:leave:remove', N'#', 103, 1, GETDATE(), NULL, NULL, N''); +GO +INSERT sys_menu VALUES (11643, N'请假申请导出', 11638, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'workflow:leave:export', N'#', 103, 1, GETDATE(), NULL, NULL, N''); -INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, GETDATE(), NULL, NULL, '业务状态列表'); -INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, GETDATE(), NULL, NULL, '表单类型列表'); -INSERT INTO sys_dict_type VALUES (15, '000000', '任务状态', 'wf_task_status', 103, 1, GETDATE(), NULL, NULL, '任务状态'); +INSERT sys_dict_type VALUES (13, N'000000', N'业务状态', N'wf_business_status', 103, 1, GETDATE(), NULL, NULL, N'业务状态列表'); +GO +INSERT sys_dict_type VALUES (14, N'000000', N'表单类型', N'wf_form_type', 103, 1, GETDATE(), NULL, NULL, N'表单类型列表'); +GO +INSERT sys_dict_type VALUES (15, N'000000', N'任务状态', N'wf_task_status', 103, 1, GETDATE(), NULL, NULL, N'任务状态'); +GO -INSERT INTO sys_dict_data VALUES (39, '000000', 1, '已撤销', 'cancel', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已撤销'); -INSERT INTO sys_dict_data VALUES (40, '000000', 2, '草稿', 'draft', 'wf_business_status', '', 'info', 'N', 103, 1, GETDATE(), NULL, NULL, '草稿'); -INSERT INTO sys_dict_data VALUES (41, '000000', 3, '待审核', 'waiting', 'wf_business_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (42, '000000', 4, '已完成', 'finish', 'wf_business_status', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '已完成'); -INSERT INTO sys_dict_data VALUES (43, '000000', 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已作废'); -INSERT INTO sys_dict_data VALUES (44, '000000', 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已退回'); -INSERT INTO sys_dict_data VALUES (45, '000000', 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '已终止'); -INSERT INTO sys_dict_data VALUES (46, '000000', 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '自定义表单'); -INSERT INTO sys_dict_data VALUES (47, '000000', 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '动态表单'); -INSERT INTO sys_dict_data VALUES (48, '000000', 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '撤销'); -INSERT INTO sys_dict_data VALUES (49, '000000', 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 103, 1, GETDATE(), NULL, NULL, '通过'); -INSERT INTO sys_dict_data VALUES (50, '000000', 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '待审核'); -INSERT INTO sys_dict_data VALUES (51, '000000', 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '作废'); -INSERT INTO sys_dict_data VALUES (52, '000000', 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '退回'); -INSERT INTO sys_dict_data VALUES (53, '000000', 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '终止'); -INSERT INTO sys_dict_data VALUES (54, '000000', 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '转办'); -INSERT INTO sys_dict_data VALUES (55, '000000', 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '委托'); -INSERT INTO sys_dict_data VALUES (56, '000000', 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '抄送'); -INSERT INTO sys_dict_data VALUES (57, '000000', 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 103, 1, GETDATE(), NULL, NULL, '加签'); -INSERT INTO sys_dict_data VALUES (58, '000000', 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '减签'); -INSERT INTO sys_dict_data VALUES (59, '000000', 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 103, 1, GETDATE(), NULL, NULL, '超时'); +INSERT sys_dict_data VALUES (39, N'000000', 1, N'已撤销', N'cancel', N'wf_business_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'已撤销'); +GO +INSERT sys_dict_data VALUES (40, N'000000', 2, N'草稿', N'draft', N'wf_business_status', N'', N'info', N'N', 103, 1, GETDATE(), NULL, NULL, N'草稿'); +GO +INSERT sys_dict_data VALUES (41, N'000000', 3, N'待审核', N'waiting', N'wf_business_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'待审核'); +GO +INSERT sys_dict_data VALUES (42, N'000000', 4, N'已完成', N'finish', N'wf_business_status', N'', N'success', N'N', 103, 1, GETDATE(), NULL, NULL, N'已完成'); +GO +INSERT sys_dict_data VALUES (43, N'000000', 5, N'已作废', N'invalid', N'wf_business_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'已作废'); +GO +INSERT sys_dict_data VALUES (44, N'000000', 6, N'已退回', N'back', N'wf_business_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'已退回'); +GO +INSERT sys_dict_data VALUES (45, N'000000', 7, N'已终止', N'termination', N'wf_business_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'已终止'); +GO +INSERT sys_dict_data VALUES (46, N'000000', 1, N'自定义表单', N'static', N'wf_form_type', N'', N'success', N'N', 103, 1, GETDATE(), NULL, NULL, N'自定义表单'); +GO +INSERT sys_dict_data VALUES (47, N'000000', 2, N'动态表单', N'dynamic', N'wf_form_type', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'动态表单'); +GO +INSERT sys_dict_data VALUES (48, N'000000', 1, N'撤销', N'cancel', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'撤销'); +GO +INSERT sys_dict_data VALUES (49, N'000000', 2, N'通过', N'pass', N'wf_task_status', N'', N'success', N'N', 103, 1, GETDATE(), NULL, NULL, N'通过'); +GO +INSERT sys_dict_data VALUES (50, N'000000', 3, N'待审核', N'waiting', N'wf_task_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'待审核'); +GO +INSERT sys_dict_data VALUES (51, N'000000', 4, N'作废', N'invalid', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'作废'); +GO +INSERT sys_dict_data VALUES (52, N'000000', 5, N'退回', N'back', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'退回'); +GO +INSERT sys_dict_data VALUES (53, N'000000', 6, N'终止', N'termination', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'终止'); +GO +INSERT sys_dict_data VALUES (54, N'000000', 7, N'转办', N'transfer', N'wf_task_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'转办'); +GO +INSERT sys_dict_data VALUES (55, N'000000', 8, N'委托', N'depute', N'wf_task_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'委托'); +GO +INSERT sys_dict_data VALUES (56, N'000000', 9, N'抄送', N'copy', N'wf_task_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'抄送'); +GO +INSERT sys_dict_data VALUES (57, N'000000', 10, N'加签', N'sign', N'wf_task_status', N'', N'primary', N'N', 103, 1, GETDATE(), NULL, NULL, N'加签'); +GO +INSERT sys_dict_data VALUES (58, N'000000', 11, N'减签', N'sign_off', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'减签'); +GO +INSERT sys_dict_data VALUES (59, N'000000', 11, N'超时', N'timeout', N'wf_task_status', N'', N'danger', N'N', 103, 1, GETDATE(), NULL, NULL, N'超时'); +GO From a5d246d2b243a3d110053d78587ab96cdbecfc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 7 Jan 2025 18:14:03 +0800 Subject: [PATCH 220/227] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=20warmflow?= =?UTF-8?q?=20oracle=20pg=20sqlserver=20sql=E8=84=9A=E6=9C=AC=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_workflow.sql | 538 ++++++------------- script/sql/postgres/postgres_ry_workflow.sql | 96 ++-- 2 files changed, 203 insertions(+), 431 deletions(-) diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index 730b7ea27..6a7c5c579 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -1,11 +1,7 @@ --- ---------------------------- --- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/oracle/oracle-wram-flow-all.sql --- ---------------------------- + create table FLOW_DEFINITION ( - ID NUMBER (20) not null - constraint FLOW_DEFINITION_PK - primary key, + ID NUMBER (20) not null, FLOW_CODE VARCHAR2 (40) not null, FLOW_NAME VARCHAR2 (100) not null, CATEGORY VARCHAR2 (100), @@ -21,64 +17,31 @@ create table FLOW_DEFINITION UPDATE_TIME DATE, DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) -) / +); -comment on table FLOW_DEFINITION is '流程定义表' -/ +alter table FLOW_DEFINITION add constraint PK_FLOW_DEFINITION primary key (ID); -comment on column FLOW_DEFINITION.ID is '主键id' -/ - -comment on column FLOW_DEFINITION.FLOW_CODE is '流程编码' -/ - -comment on column FLOW_DEFINITION.FLOW_NAME is '流程名称' -/ - -comment on column FLOW_DEFINITION.CATEGORY is '流程类别' -/ - -comment on column FLOW_DEFINITION.VERSION is '流程版本' -/ - -comment on column FLOW_DEFINITION.IS_PUBLISH is '是否发布 (0未发布 1已发布 9失效)' -/ - -comment on column FLOW_DEFINITION.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' -/ - -comment on column FLOW_DEFINITION.FORM_PATH is '审批表单路径' -/ - -comment on column FLOW_DEFINITION.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)' -/ - -comment on column FLOW_DEFINITION.LISTENER_TYPE is '监听器类型' -/ - -comment on column FLOW_DEFINITION.LISTENER_PATH is '监听器路径' -/ - -comment on column FLOW_DEFINITION.EXT is '扩展字段,预留给业务系统使用' -/ - -comment on column FLOW_DEFINITION.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_DEFINITION.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_DEFINITION.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_DEFINITION.TENANT_ID is '租户id' -/ +comment on table FLOW_DEFINITION is '流程定义表'; +comment on column FLOW_DEFINITION.ID is '主键id'; +comment on column FLOW_DEFINITION.FLOW_CODE is '流程编码'; +comment on column FLOW_DEFINITION.FLOW_NAME is '流程名称'; +comment on column FLOW_DEFINITION.CATEGORY is '流程类别'; +comment on column FLOW_DEFINITION.VERSION is '流程版本'; +comment on column FLOW_DEFINITION.IS_PUBLISH is '是否发布 (0未发布 1已发布 9失效)'; +comment on column FLOW_DEFINITION.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; +comment on column FLOW_DEFINITION.FORM_PATH is '审批表单路径'; +comment on column FLOW_DEFINITION.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)'; +comment on column FLOW_DEFINITION.LISTENER_TYPE is '监听器类型'; +comment on column FLOW_DEFINITION.LISTENER_PATH is '监听器路径'; +comment on column FLOW_DEFINITION.EXT is '扩展字段,预留给业务系统使用'; +comment on column FLOW_DEFINITION.CREATE_TIME is '创建时间'; +comment on column FLOW_DEFINITION.UPDATE_TIME is '更新时间'; +comment on column FLOW_DEFINITION.DEL_FLAG is '删除标志'; +comment on column FLOW_DEFINITION.TENANT_ID is '租户id'; create table FLOW_NODE ( - ID NUMBER (20) not null - constraint FLOW_NODE_PK - primary key, + ID NUMBER (20) not null, NODE_TYPE NUMBER (1) not null, DEFINITION_ID NUMBER (20) not null, NODE_CODE VARCHAR2 (100) not null, @@ -99,79 +62,36 @@ create table FLOW_NODE DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40), PERMISSION_FLAG VARCHAR2 (200) -) / +); -comment on table FLOW_NODE is '流程节点表' -/ +alter table FLOW_NODE add constraint PK_FLOW_NODE primary key (ID); -comment on column FLOW_NODE.ID is '主键id' -/ - -comment on column FLOW_NODE.NODE_TYPE is '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_NODE.DEFINITION_ID is '对应flow_definition表的id' -/ - -comment on column FLOW_NODE.NODE_CODE is '流程节点编码' -/ - -comment on column FLOW_NODE.NODE_NAME is '流程节点名称' -/ - -comment on column FLOW_NODE.NODE_RATIO is '流程签署比例值' -/ - -comment on column FLOW_NODE.COORDINATE is '坐标' -/ - -comment on column FLOW_NODE.SKIP_ANY_NODE is '是否可以退回任意节点(Y是 N否)即将删除' -/ - -comment on column FLOW_NODE.ANY_NODE_SKIP is '任意结点跳转' -/ - -comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型' -/ - -comment on column FLOW_NODE.LISTENER_PATH is '监听器路径' -/ - -comment on column FLOW_NODE.HANDLER_TYPE is '处理器类型' -/ - -comment on column FLOW_NODE.HANDLER_PATH is '处理器路径' -/ - -comment on column FLOW_NODE.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' -/ - -comment on column FLOW_NODE.FORM_PATH is '审批表单路径' -/ - -comment on column FLOW_NODE.VERSION is '版本' -/ - -comment on column FLOW_NODE.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_NODE.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_NODE.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_NODE.TENANT_ID is '租户id' -/ - -comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)' -/ +comment on table FLOW_NODE is '流程节点表'; +comment on column FLOW_NODE.ID is '主键id'; +comment on column FLOW_NODE.NODE_TYPE is '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_NODE.DEFINITION_ID is '对应flow_definition表的id'; +comment on column FLOW_NODE.NODE_CODE is '流程节点编码'; +comment on column FLOW_NODE.NODE_NAME is '流程节点名称'; +comment on column FLOW_NODE.NODE_RATIO is '流程签署比例值'; +comment on column FLOW_NODE.COORDINATE is '坐标'; +comment on column FLOW_NODE.SKIP_ANY_NODE is '是否可以退回任意节点(Y是 N否)即将删除'; +comment on column FLOW_NODE.ANY_NODE_SKIP is '任意结点跳转'; +comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型'; +comment on column FLOW_NODE.LISTENER_PATH is '监听器路径'; +comment on column FLOW_NODE.HANDLER_TYPE is '处理器类型'; +comment on column FLOW_NODE.HANDLER_PATH is '处理器路径'; +comment on column FLOW_NODE.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; +comment on column FLOW_NODE.FORM_PATH is '审批表单路径'; +comment on column FLOW_NODE.VERSION is '版本'; +comment on column FLOW_NODE.CREATE_TIME is '创建时间'; +comment on column FLOW_NODE.UPDATE_TIME is '更新时间'; +comment on column FLOW_NODE.DEL_FLAG is '删除标志'; +comment on column FLOW_NODE.TENANT_ID is '租户id'; +comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; create table FLOW_SKIP ( - ID NUMBER (20) not null - constraint FLOW_SKIP_PK - primary key, + ID NUMBER (20) not null, DEFINITION_ID NUMBER (20) not null, NOW_NODE_CODE VARCHAR2 (100) not null, NOW_NODE_TYPE NUMBER (1), @@ -185,58 +105,29 @@ create table FLOW_SKIP UPDATE_TIME DATE, DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) -) / +); -comment on table FLOW_SKIP is '节点跳转关联表' -/ +alter table FLOW_SKIP add constraint PK_FLOW_SKIP primary key (ID); -comment on column FLOW_SKIP.ID is '主键id' -/ - -comment on column FLOW_SKIP.DEFINITION_ID is '流程定义id' -/ - -comment on column FLOW_SKIP.NOW_NODE_CODE is '当前流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_SKIP.NOW_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_SKIP.NEXT_NODE_CODE is '下一个流程节点编码' -/ - -comment on column FLOW_SKIP.NEXT_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_SKIP.SKIP_NAME is '跳转名称' -/ - -comment on column FLOW_SKIP.SKIP_TYPE is '跳转类型 (PASS审批通过 REJECT退回)' -/ - -comment on column FLOW_SKIP.SKIP_CONDITION is '跳转条件' -/ - -comment on column FLOW_SKIP.COORDINATE is '坐标' -/ - -comment on column FLOW_SKIP.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_SKIP.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_SKIP.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_SKIP.TENANT_ID is '租户id' -/ +comment on table FLOW_SKIP is '节点跳转关联表'; +comment on column FLOW_SKIP.ID is '主键id'; +comment on column FLOW_SKIP.DEFINITION_ID is '流程定义id'; +comment on column FLOW_SKIP.NOW_NODE_CODE is '当前流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_SKIP.NOW_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_SKIP.NEXT_NODE_CODE is '下一个流程节点编码'; +comment on column FLOW_SKIP.NEXT_NODE_TYPE is '下一个流程节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_SKIP.SKIP_NAME is '跳转名称'; +comment on column FLOW_SKIP.SKIP_TYPE is '跳转类型 (PASS审批通过 REJECT退回)'; +comment on column FLOW_SKIP.SKIP_CONDITION is '跳转条件'; +comment on column FLOW_SKIP.COORDINATE is '坐标'; +comment on column FLOW_SKIP.CREATE_TIME is '创建时间'; +comment on column FLOW_SKIP.UPDATE_TIME is '更新时间'; +comment on column FLOW_SKIP.DEL_FLAG is '删除标志'; +comment on column FLOW_SKIP.TENANT_ID is '租户id'; create table FLOW_INSTANCE ( - ID NUMBER not null - constraint FLOW_INSTANCE_PK - primary key, + ID NUMBER not null, DEFINITION_ID NUMBER not null, BUSINESS_ID VARCHAR2 (40) not null, NODE_TYPE NUMBER (1), @@ -251,62 +142,30 @@ create table FLOW_INSTANCE EXT VARCHAR2 (500), DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) -) / +); -comment on table FLOW_INSTANCE is '流程实例表' -/ - -comment on column FLOW_INSTANCE.ID is '主键id' -/ - -comment on column FLOW_INSTANCE.DEFINITION_ID is '对应flow_definition表的id' -/ - -comment on column FLOW_INSTANCE.BUSINESS_ID is '业务id' -/ - -comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码' -/ - -comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称' -/ - -comment on column FLOW_INSTANCE.VARIABLE is '任务变量' -/ - -comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)' -/ - -comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)' -/ - -comment on column FLOW_INSTANCE.CREATE_BY is '创建者' -/ - -comment on column FLOW_INSTANCE.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_INSTANCE.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_INSTANCE.EXT is '扩展字段,预留给业务系统使用' -/ - -comment on column FLOW_INSTANCE.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_INSTANCE.TENANT_ID is '租户id' -/ +alter table FLOW_INSTANCE add constraint PK_FLOW_INSTANCE primary key (ID); +comment on table FLOW_INSTANCE is '流程实例表'; +comment on column FLOW_INSTANCE.ID is '主键id'; +comment on column FLOW_INSTANCE.DEFINITION_ID is '对应flow_definition表的id'; +comment on column FLOW_INSTANCE.BUSINESS_ID is '业务id'; +comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码'; +comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称'; +comment on column FLOW_INSTANCE.VARIABLE is '任务变量'; +comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)'; +comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)'; +comment on column FLOW_INSTANCE.CREATE_BY is '创建者'; +comment on column FLOW_INSTANCE.CREATE_TIME is '创建时间'; +comment on column FLOW_INSTANCE.UPDATE_TIME is '更新时间'; +comment on column FLOW_INSTANCE.EXT is '扩展字段,预留给业务系统使用'; +comment on column FLOW_INSTANCE.DEL_FLAG is '删除标志'; +comment on column FLOW_INSTANCE.TENANT_ID is '租户id'; create table FLOW_TASK ( - ID NUMBER (20) not null - constraint FLOW_TASK_PK - primary key, + ID NUMBER (20) not null, DEFINITION_ID NUMBER (20) not null, INSTANCE_ID NUMBER (20) not null, NODE_CODE VARCHAR2 (100), @@ -318,46 +177,23 @@ create table FLOW_TASK UPDATE_TIME DATE, DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) -) / +); -comment on table FLOW_TASK is '待办任务表' -/ +alter table FLOW_TASK add constraint PK_FLOW_TASK primary key (ID); -comment on column FLOW_TASK.ID is '主键id' -/ - -comment on column FLOW_TASK.DEFINITION_ID is '对应flow_definition表的id' -/ - -comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id' -/ - -comment on column FLOW_TASK.NODE_CODE is '节点编码' -/ - -comment on column FLOW_TASK.NODE_NAME is '节点名称' -/ - -comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' -/ - -comment on column FLOW_TASK.FORM_PATH is '审批表单路径' -/ - -comment on column FLOW_TASK.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_TASK.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_TASK.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_TASK.TENANT_ID is '租户id' -/ +comment on table FLOW_TASK is '待办任务表'; +comment on column FLOW_TASK.ID is '主键id'; +comment on column FLOW_TASK.DEFINITION_ID is '对应flow_definition表的id'; +comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id'; +comment on column FLOW_TASK.NODE_CODE is '节点编码'; +comment on column FLOW_TASK.NODE_NAME is '节点名称'; +comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; +comment on column FLOW_TASK.FORM_PATH is '审批表单路径'; +comment on column FLOW_TASK.CREATE_TIME is '创建时间'; +comment on column FLOW_TASK.UPDATE_TIME is '更新时间'; +comment on column FLOW_TASK.DEL_FLAG is '删除标志'; +comment on column FLOW_TASK.TENANT_ID is '租户id'; create table FLOW_HIS_TASK ( @@ -383,83 +219,37 @@ create table FLOW_HIS_TASK UPDATE_TIME DATE, DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) +); -) / +alter table FLOW_HIS_TASK add constraint PK_FLOW_HIS_TASK primary key (ID); -comment on table FLOW_HIS_TASK is '历史任务记录表' -/ - -comment on column FLOW_HIS_TASK.ID is '主键id' -/ - -comment on column FLOW_HIS_TASK.DEFINITION_ID is '对应flow_definition表的id' -/ - -comment on column FLOW_HIS_TASK.INSTANCE_ID is '对应flow_instance表的id' -/ - -comment on column FLOW_HIS_TASK.TASK_ID is '对应flow_task表的id' -/ - -comment on column FLOW_HIS_TASK.NODE_CODE is '开始节点编码' -/ - -comment on column FLOW_HIS_TASK.NODE_NAME is '开始节点名称' -/ - -comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)' -/ - -comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码' -/ - -comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称' -/ - -comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)' -/ - -comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(1审批中 2 审批通过 9已退回 10失效)' -/ - -comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)' -/ - -comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径' -/ - -comment on column FLOW_HIS_TASK.MESSAGE is '审批意见' -/ - -comment on column FLOW_HIS_TASK.EXT is '扩展字段,预留给业务系统使用' -/ - -comment on column FLOW_HIS_TASK.CREATE_TIME is '任务开始时间' -/ - -comment on column FLOW_HIS_TASK.UPDATE_TIME is '审批完成时间' -/ - -comment on column FLOW_HIS_TASK.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_HIS_TASK.TENANT_ID is '租户id' -/ - -comment on column FLOW_HIS_TASK.APPROVER is '审批者' -/ - -comment on column FLOW_HIS_TASK.COOPERATE_TYPE is '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)' -/ - -comment on column FLOW_HIS_TASK.COLLABORATOR is '协作人' -/ +comment on table FLOW_HIS_TASK is '历史任务记录表'; +comment on column FLOW_HIS_TASK.ID is '主键id'; +comment on column FLOW_HIS_TASK.DEFINITION_ID is '对应flow_definition表的id'; +comment on column FLOW_HIS_TASK.INSTANCE_ID is '对应flow_instance表的id'; +comment on column FLOW_HIS_TASK.TASK_ID is '对应flow_task表的id'; +comment on column FLOW_HIS_TASK.NODE_CODE is '开始节点编码'; +comment on column FLOW_HIS_TASK.NODE_NAME is '开始节点名称'; +comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码'; +comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称'; +comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)'; +comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(1审批中 2 审批通过 9已退回 10失效)'; +comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; +comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径'; +comment on column FLOW_HIS_TASK.MESSAGE is '审批意见'; +comment on column FLOW_HIS_TASK.EXT is '扩展字段,预留给业务系统使用'; +comment on column FLOW_HIS_TASK.CREATE_TIME is '任务开始时间'; +comment on column FLOW_HIS_TASK.UPDATE_TIME is '审批完成时间'; +comment on column FLOW_HIS_TASK.DEL_FLAG is '删除标志'; +comment on column FLOW_HIS_TASK.TENANT_ID is '租户id'; +comment on column FLOW_HIS_TASK.APPROVER is '审批者'; +comment on column FLOW_HIS_TASK.COOPERATE_TYPE is '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)'; +comment on column FLOW_HIS_TASK.COLLABORATOR is '协作人'; create table FLOW_USER ( - ID NUMBER (20) not null - constraint FLOW_USER_PK - primary key, + ID NUMBER (20) not null, TYPE VARCHAR2 (1) not null, PROCESSED_BY VARCHAR2 (80), ASSOCIATED NUMBER (20) not null, @@ -468,42 +258,22 @@ create table FLOW_USER UPDATE_TIME DATE, DEL_FLAG VARCHAR2 (1) default '0', TENANT_ID VARCHAR2 (40) -) / +); -comment on table FLOW_USER is '待办任务表' -/ +alter table FLOW_USER add constraint PK_FLOW_USER primary key (ID); -comment on column FLOW_USER.ID is '主键id' -/ - -comment on column FLOW_USER.TYPE is '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)' -/ - -comment on column FLOW_USER.PROCESSED_BY is '权限人)' -/ - -comment on column FLOW_USER.ASSOCIATED is '任务表id' -/ - -comment on column FLOW_USER.CREATE_TIME is '创建时间' -/ - -comment on column FLOW_USER.CREATE_BY is '节点名称' -/ - -comment on column FLOW_USER.UPDATE_TIME is '更新时间' -/ - -comment on column FLOW_USER.DEL_FLAG is '删除标志' -/ - -comment on column FLOW_USER.TENANT_ID is '租户id' -/ - -create index USER_PROCESSED_TYPE - on FLOW_USER (PROCESSED_BY, TYPE) - / +comment on table FLOW_USER is '待办任务表'; +comment on column FLOW_USER.ID is '主键id'; +comment on column FLOW_USER.TYPE is '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)'; +comment on column FLOW_USER.PROCESSED_BY is '权限人)'; +comment on column FLOW_USER.ASSOCIATED is '任务表id'; +comment on column FLOW_USER.CREATE_TIME is '创建时间'; +comment on column FLOW_USER.CREATE_BY is '节点名称'; +comment on column FLOW_USER.UPDATE_TIME is '更新时间'; +comment on column FLOW_USER.DEL_FLAG is '删除标志'; +comment on column FLOW_USER.TENANT_ID is '租户id'; +create index USER_PROCESSED_TYPE on FLOW_USER (PROCESSED_BY, TYPE); -- ---------------------------- -- 流程分类表 @@ -521,10 +291,11 @@ CREATE TABLE flow_category create_by NUMBER (20), create_time DATE, update_by NUMBER (20), - update_time DATE, - CONSTRAINT pk_flow_category PRIMARY KEY (category_id) + update_time DATE ); +alter table flow_category add constraint pk_flow_category primary key (category_id); + COMMENT ON TABLE flow_category IS '流程分类'; COMMENT ON COLUMN flow_category.category_id IS '流程分类ID'; COMMENT ON COLUMN flow_category.tenant_id IS '租户编号'; @@ -568,10 +339,11 @@ CREATE TABLE test_leave create_by NUMBER (20), create_time DATE, update_by NUMBER (20), - update_time DATE, - CONSTRAINT pk_test_leave PRIMARY KEY (id) + update_time DATE ); +alter table test_leave add constraint pk_test_leave primary key (id); + COMMENT ON TABLE test_leave IS '请假申请表'; COMMENT ON COLUMN test_leave.id IS 'ID'; COMMENT ON COLUMN test_leave.tenant_id IS '租户编号'; @@ -599,18 +371,18 @@ INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument' INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, SYSDATE, NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu VALUES (11639, '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11640, '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11641, '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11642, '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); -INSERT INTO sys_menu VALUES (11643, '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11638', '请假申请', '5', '1', 'leave', 'workflow/leave/index', '', '1', '0', 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, SYSDATE, NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES ('11639', '请假申请查询', '11638', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11640', '请假申请新增', '11638', '2', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11641', '请假申请修改', '11638', '3', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11642', '请假申请删除', '11638', '4', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, SYSDATE, NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11643', '请假申请导出', '11638', '5', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, SYSDATE, NULL, NULL, '业务状态列表'); INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, SYSDATE, NULL, NULL, '表单类型列表'); diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index a84873285..aacd1453e 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -9,7 +9,7 @@ CREATE TABLE flow_definition category varchar(100) NULL, -- 流程类别 "version" varchar(20) NOT NULL, -- 流程版本 is_publish int2 NOT NULL DEFAULT 0, -- 是否发布(0未发布 1已发布 9失效) - form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 activity_status int2 NOT NULL DEFAULT 1, -- 流程激活状态(0挂起 1激活) listener_type varchar(100) NULL, -- 监听器类型 @@ -17,7 +17,7 @@ CREATE TABLE flow_definition ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_definition_pkey PRIMARY KEY (id) ); @@ -56,12 +56,12 @@ CREATE TABLE flow_node listener_path varchar(400) NULL, -- 监听器路径 handler_type varchar(100) NULL, -- 处理器类型 handler_path varchar(400) NULL, -- 处理器路径 - form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 "version" varchar(20) NOT NULL, -- 版本 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_node_pkey PRIMARY KEY (id) ); @@ -104,7 +104,7 @@ CREATE TABLE flow_skip coordinate varchar(100) NULL, -- 坐标 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_skip_pkey PRIMARY KEY (id) ); @@ -140,7 +140,7 @@ CREATE TABLE flow_instance create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_instance_pkey PRIMARY KEY (id) ); @@ -170,11 +170,11 @@ CREATE TABLE flow_task node_code varchar(100) NOT NULL, -- 节点编码 node_name varchar(100) NULL, -- 节点名称 node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_task_pkey PRIMARY KEY (id) ); @@ -209,13 +209,13 @@ CREATE TABLE flow_his_task collaborator varchar(40) NULL, -- 协作人(只有转办、会签、票签、委派) skip_type varchar(10) NULL, -- 流转类型(PASS通过 REJECT退回 NONE无动作) flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) - form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) + form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 message varchar(500) NULL, -- 审批意见 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_his_task_pkey PRIMARY KEY (id) ); @@ -247,13 +247,13 @@ COMMENT ON COLUMN flow_his_task.tenant_id IS '租户id'; CREATE TABLE flow_user ( id int8 NOT NULL, -- 主键id - "type" bpchar(1) NOT NULL, -- 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3流程实例的抄送人权限 4待办任务的委托人权限) + "type" bpchar(1) NOT NULL, -- 人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3流程实例的抄送人权限 4待办任务的委托人权限) processed_by varchar(80) NULL, -- 权限人 associated int8 NOT NULL, -- 任务表id create_time timestamp NULL, -- 创建时间 create_by varchar(80) NULL, -- 创建人 update_time timestamp NULL, -- 更新时间 - del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 + del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_user_pk PRIMARY KEY (id) ); @@ -275,18 +275,18 @@ COMMENT ON COLUMN flow_user.tenant_id IS '租户id'; -- ---------------------------- CREATE TABLE flow_category ( - category_id BIGINT NOT NULL COMMENT '流程分类ID', - tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户编号', - parent_id BIGINT DEFAULT 0 COMMENT '父流程分类id', - ancestors VARCHAR(500) DEFAULT '' COMMENT '祖级列表', - category_name VARCHAR(30) NOT NULL COMMENT '流程分类名称', - order_num INT DEFAULT 0 COMMENT '显示顺序', - del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', - create_dept BIGINT COMMENT '创建部门', - create_by BIGINT COMMENT '创建者', - create_time TIMESTAMP COMMENT '创建时间', - update_by BIGINT COMMENT '更新者', - update_time TIMESTAMP COMMENT '更新时间', + category_id int8 NOT NULL, + tenant_id VARCHAR(20) DEFAULT '000000'::varchar, + parent_id int8 DEFAULT 0, + ancestors VARCHAR(500) DEFAULT ''::varchar, + category_name VARCHAR(30) NOT NULL, + order_num INT DEFAULT 0, + del_flag CHAR DEFAULT '0'::bpchar, + create_dept int8, + create_by int8, + create_time TIMESTAMP, + update_by int8, + update_time TIMESTAMP, PRIMARY KEY (category_id) ); @@ -320,19 +320,19 @@ INSERT INTO flow_category VALUES (109, '000000', 102, '0,100,102', '离职', 2, -- ---------------------------- CREATE TABLE test_leave ( - id BIGINT NOT NULL COMMENT 'id', - tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户编号', - leave_type VARCHAR(255) NOT NULL COMMENT '请假类型', - start_date TIMESTAMP NOT NULL COMMENT '开始时间', - end_date TIMESTAMP NOT NULL COMMENT '结束时间', - leave_days INT NOT NULL COMMENT '请假天数', - remark VARCHAR(255) COMMENT '请假原因', - status VARCHAR(255) COMMENT '状态', - create_dept BIGINT COMMENT '创建部门', - create_by BIGINT COMMENT '创建者', - create_time TIMESTAMP COMMENT '创建时间', - update_by BIGINT COMMENT '更新者', - update_time TIMESTAMP COMMENT '更新时间', + id int8 NOT NULL, + tenant_id VARCHAR(20) DEFAULT '000000'::varchar, + leave_type VARCHAR(255) NOT NULL, + start_date TIMESTAMP NOT NULL, + end_date TIMESTAMP NOT NULL, + leave_days int2 NOT NULL, + remark VARCHAR(255), + status VARCHAR(255), + create_dept int8, + create_by int8, + create_time TIMESTAMP, + update_by int8, + update_time TIMESTAMP, PRIMARY KEY (id) ); @@ -362,17 +362,17 @@ INSERT INTO sys_menu VALUES ('11622', '流程分类', '11616', '1', 'category', INSERT INTO sys_menu VALUES ('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'guide', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'monitor', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'waiting', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11638', '请假申请', 5, 1, 'leave', 'workflow/leave/index', '', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu VALUES ('11639', '请假申请查询', 11638, 1, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11640', '请假申请新增', 11638, 2, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11641', '请假申请修改', 11638, 3, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11642', '请假申请删除', 11638, 4, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu VALUES ('11643', '请假申请导出', 11638, 5, '#', '', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11623', '流程分类查询', '11622', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11624', '流程分类新增', '11622', '2', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11625', '流程分类修改', '11622', '3', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11626', '流程分类删除', '11622', '4', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11627', '流程分类导出', '11622', '5', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:category:export', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11638', '请假申请', '5', '1', 'leave', 'workflow/leave/index', '', '1', '0', 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu VALUES ('11639', '请假申请查询', '11638', '1', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11640', '请假申请新增', '11638', '2', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11641', '请假申请修改', '11638', '3', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11642', '请假申请删除', '11638', '4', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES ('11643', '请假申请导出', '11638', '5', '#', '', '', '1', '0', 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_dict_type VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, now(), NULL, NULL, '业务状态列表'); INSERT INTO sys_dict_type VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, now(), NULL, NULL, '表单类型列表'); From 14941ab5a7f33c86800a609889f0d1e0277cd671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 7 Jan 2025 18:18:31 +0800 Subject: [PATCH 221/227] update warmflow 1.3.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 154779b7f..cc06308cf 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20241022 - 1.3.6-m1 + 1.3.7 3.2.2 From 57a46ea7b3c2238a830ebe4d34895292f33f8a8c Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 9 Jan 2025 21:54:29 +0800 Subject: [PATCH 222/227] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E9=A9=B3=E5=9B=9E=20fix=20=E4=BF=AE=E5=A4=8D=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=AE=A1=E6=89=B9=E6=8F=90=E9=86=92=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=20update=20=E4=BF=AE=E6=94=B9=E6=96=B0=E5=A2=9E=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=90=8C=E6=AD=A5=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 5 ++ .../impl/FlwDefinitionServiceImpl.java | 10 +++- .../service/impl/FlwTaskServiceImpl.java | 49 +++---------------- .../dromara/workflow/utils/WorkflowUtils.java | 3 +- 4 files changed, 23 insertions(+), 44 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 1e75643f1..1b10eb8ea 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -58,4 +58,9 @@ public interface FlowConstant { */ String FLOW_CATEGORY_NAME = "flow_category_name#30d"; + /** + * 默认租户OA申请分类id + */ + Long FLOW_CATEGORY_ID = 100L; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 0af0bbe41..baec223fe 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -30,6 +30,8 @@ import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.service.IFlwDefinitionService; @@ -59,7 +61,6 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowDefinitionMapper flowDefinitionMapper; private final FlowHisTaskMapper flowHisTaskMapper; private final FlwCategoryMapper flwCategoryMapper; - private final FlowNodeMapper flowNodeMapper; private final FlowSkipMapper flowSkipMapper; @@ -223,6 +224,11 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { if (CollUtil.isEmpty(flowDefinitions)) { return; } + FlowCategory flowCategory = flwCategoryMapper.selectOne(new LambdaQueryWrapper() + .eq(FlowCategory::getTenantId, DEFAULT_TENANT_ID).eq(FlowCategory::getCategoryId, FlowConstant.FLOW_CATEGORY_ID)); + flowCategory.setCategoryId(null); + flowCategory.setTenantId(tenantId); + flwCategoryMapper.insert(flowCategory); List defIds = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().in(FlowNode::getDefinitionId, defIds)); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper().in(FlowSkip::getDefinitionId, defIds)); @@ -231,7 +237,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { flowDefinition.setId(null); flowDefinition.setTenantId(tenantId); flowDefinition.setIsPublish(0); - flowDefinition.setCategory(null); + flowDefinition.setCategory(String.valueOf(flowCategory.getCategoryId())); int insert = flowDefinitionMapper.insert(flowDefinition); if (insert <= 0) { log.info("同步流程定义【{}】失败!", definition.getFlowCode()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 5bfaddf03..935d40997 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -361,48 +361,20 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNull(task)) { throw new ServiceException("任务不存在!"); } - List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, task.getDefinitionId())); Instance inst = insService.getById(task.getInstanceId()); BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); Long definitionId = task.getDefinitionId(); Definition definition = defService.getById(definitionId); String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId); - List listRunTask = flwTaskMapper.getListRunTask(new QueryWrapper().eq("instance_id", task.getInstanceId())); - //不是当前节点的待审任务 - List taskVos = StreamUtils.filter(listRunTask, e -> !e.getId().equals(taskId)); - WorkflowUtils.deleteRunTask(StreamUtils.toList(taskVos, FlowTaskVo::getId)); - if (applyNodeCode.equals(bo.getNodeCode())) { - WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus()); - } else { - WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus()); - } - //删除记录 - FlowNode node = flowNodes.stream().filter(e -> e.getNodeCode().equals(task.getNodeCode())).findFirst().orElse(null); - if (node.getNodeRatio().compareTo(BigDecimal.ZERO) > 0) { - List flowHisTasks = flowHisTaskMapper.selectList( - new LambdaQueryWrapper() - .eq(FlowHisTask::getFlowStatus, BusinessStatusEnum.BACK.getStatus()) - .eq(FlowHisTask::getTaskId, taskId) - .ne(FlowHisTask::getApprover, LoginHelper.getUserIdStr()) - ); - if (CollUtil.isNotEmpty(flowHisTasks)) { - flowHisTaskMapper.deleteByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getId)); - } - } + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(bo.getNodeCode()); + flowParams.message(message); + flowParams.skipType(SkipType.REJECT.getKey()); + flowParams.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) + .hisStatus(TaskStatusEnum.BACK.getStatus()); + taskService.skip(task.getId(), flowParams); + Instance instance = insService.getById(inst.getId()); - //判断或节点是否有多个,只保留一个 - List currentTaskList = selectByInstId(instance.getId()); - if (CollUtil.isNotEmpty(currentTaskList)) { - List nodeCodes = StreamUtils.toList(currentTaskList, FlowTask::getNodeCode); - List nodeCodeList = StreamUtils.filter(flowNodes, flowNode -> nodeCodes.contains(flowNode.getNodeCode())); - for (Node n : nodeCodeList) { - List flowTasks = currentTaskList.stream().filter(e -> e.getNodeCode().equals(n.getNodeCode()) && n.getNodeRatio().compareTo(BigDecimal.ZERO) == 0).collect(Collectors.toList()); - if (flowTasks.size() > 1) { - flowTasks.remove(0); - WorkflowUtils.deleteRunTask(StreamUtils.toList(flowTasks, Task::getId)); - } - } - } this.setHandler(instance, task, null); // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); @@ -413,11 +385,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } - /** - * 获取可驳回节点 - * - * @param instanceId 实例id - */ /** * 获取可驳回的前置节点 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 8cf9b6c0c..0bf8f429b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** @@ -121,7 +122,7 @@ public class WorkflowUtils { switch (messageTypeEnum) { case SYSTEM_MESSAGE: SseMessageDto dto = new SseMessageDto(); - dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId)); + dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); dto.setMessage(message); SseMessageUtils.publishMessage(dto); break; From 54e4a8c023e832b073fb4b1850b99ea9f0fdac01 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 11 Jan 2025 14:39:04 +0800 Subject: [PATCH 223/227] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=EF=BC=8C=E5=8A=9E=E7=90=86=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core}/domain/bo/CompleteTaskBo.java | 3 +-- .../common/core/domain/bo}/FlowCopy.java | 2 +- .../core}/domain/bo/StartProcessBo.java | 2 +- .../common/core/service/WorkflowService.java | 21 ++++++++++++++++ .../controller/FlwTaskController.java | 3 ++- .../{VariableVo.java => FlowVariableVo.java} | 2 +- .../workflow/service/IFlwTaskService.java | 2 ++ .../service/impl/FlwInstanceServiceImpl.java | 12 +++++----- .../service/impl/FlwTaskServiceImpl.java | 4 +++- .../service/impl/WorkflowServiceImpl.java | 24 +++++++++++++++++++ 10 files changed, 62 insertions(+), 13 deletions(-) rename {ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow => ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core}/domain/bo/CompleteTaskBo.java (93%) rename {ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo => ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo}/FlowCopy.java (89%) rename {ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow => ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core}/domain/bo/StartProcessBo.java (96%) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/{VariableVo.java => FlowVariableVo.java} (86%) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java similarity index 93% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java index e2182ca31..6520ea311 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java @@ -1,9 +1,8 @@ -package org.dromara.workflow.domain.bo; +package org.dromara.common.core.domain.bo; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; -import org.dromara.workflow.domain.vo.FlowCopy; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java similarity index 89% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java index 1fd4646e5..8088c47c0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopy.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java @@ -1,4 +1,4 @@ -package org.dromara.workflow.domain.vo; +package org.dromara.common.core.domain.bo; import lombok.Data; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java similarity index 96% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java index ea21a81e7..27ce17bfc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java @@ -1,4 +1,4 @@ -package org.dromara.workflow.domain.bo; +package org.dromara.common.core.domain.bo; import jakarta.validation.constraints.NotBlank; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index d4592126a..fb0a5ec04 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -1,5 +1,8 @@ package org.dromara.common.core.service; +import org.dromara.common.core.domain.bo.CompleteTaskBo; +import org.dromara.common.core.domain.bo.StartProcessBo; + import java.util.List; import java.util.Map; @@ -22,6 +25,7 @@ public interface WorkflowService { * 获取当前流程状态 * * @param taskId 任务id + * @return 状态 */ String getBusinessStatusByTaskId(Long taskId); @@ -29,6 +33,7 @@ public interface WorkflowService { * 获取当前流程状态 * * @param businessId 业务id + * @return 状态 */ String getBusinessStatus(String businessId); @@ -54,4 +59,20 @@ public interface WorkflowService { * @param tenantId 租户id */ void syncDef(String tenantId); + + /** + * 启动流程 + * + * @param startProcessBo 参数 + * @return 结果 + */ + Map startWorkFlow(StartProcessBo startProcessBo); + + /** + * 办理任务 + * + * @param completeTaskBo 参数 + * @return 结果 + */ + boolean completeTask(CompleteTaskBo completeTaskBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index c6895cf90..13163a9f6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -2,6 +2,8 @@ package org.dromara.workflow.controller; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.bo.CompleteTaskBo; +import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -11,7 +13,6 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java similarity index 86% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java index 6a26c8287..b4de76e93 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java @@ -11,7 +11,7 @@ import java.io.Serializable; * @author may */ @Data -public class VariableVo implements Serializable { +public class FlowVariableVo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 80bfa948c..e30646a90 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,5 +1,7 @@ package org.dromara.workflow.service; +import org.dromara.common.core.domain.bo.CompleteTaskBo; +import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 87b739450..c053e6d4a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -40,7 +40,7 @@ import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.FlowInvalidBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; -import org.dromara.workflow.domain.vo.VariableVo; +import org.dromara.workflow.domain.vo.FlowVariableVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwInstanceMapper; @@ -352,13 +352,13 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { Map map = new HashMap<>(); FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); Map variableMap = flowInstance.getVariableMap(); - List list = new ArrayList<>(); + List list = new ArrayList<>(); if (CollUtil.isNotEmpty(variableMap)) { for (Map.Entry entry : variableMap.entrySet()) { - VariableVo variableVo = new VariableVo(); - variableVo.setKey(entry.getKey()); - variableVo.setValue(entry.getValue().toString()); - list.add(variableVo); + FlowVariableVo flowVariableVo = new FlowVariableVo(); + flowVariableVo.setKey(entry.getKey()); + flowVariableVo.setValue(entry.getValue().toString()); + list.add(flowVariableVo); } } map.put("variableList", list); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 935d40997..939da78bf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.bo.CompleteTaskBo; +import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; @@ -37,7 +39,7 @@ import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.FlowCopy; +import org.dromara.common.core.domain.bo.FlowCopy; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.handler.FlowProcessEventHandler; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 7740fe679..53fc3c335 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -2,11 +2,14 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.bo.CompleteTaskBo; +import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.service.IFlwDefinitionService; import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; import java.util.List; @@ -23,6 +26,7 @@ public class WorkflowServiceImpl implements WorkflowService { private final IFlwInstanceService flwInstanceService; private final IFlwDefinitionService flwDefinitionService; + private final IFlwTaskService iFlwTaskService; /** * 删除流程实例 @@ -89,4 +93,24 @@ public class WorkflowServiceImpl implements WorkflowService { public void syncDef(String tenantId) { flwDefinitionService.syncDef(tenantId); } + + /** + * 启动流程 + * + * @param startProcessBo 参数 + */ + @Override + public Map startWorkFlow(StartProcessBo startProcessBo) { + return iFlwTaskService.startWorkFlow(startProcessBo); + } + + /** + * 办理任务 + * + * @param completeTaskBo 参数 + */ + @Override + public boolean completeTask(CompleteTaskBo completeTaskBo) { + return iFlwTaskService.completeTask(completeTaskBo); + } } From 89c1cf63ebb342aa1a21eeeca5226730001c556e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 11 Jan 2025 19:21:01 +0800 Subject: [PATCH 224/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/dto/CompleteTaskDTO.java | 71 +++++++++++++++++++ .../common/core/domain/dto/FlowCopyDTO.java | 30 ++++++++ .../core/domain/dto/StartProcessDTO.java | 45 ++++++++++++ .../common/core/service/WorkflowService.java | 12 ++-- .../controller/FlwTaskController.java | 2 - .../workflow}/domain/bo/CompleteTaskBo.java | 4 +- .../workflow/domain/bo/FlowCopyBo.java | 4 +- .../workflow}/domain/bo/StartProcessBo.java | 2 +- .../workflow/service/IFlwTaskService.java | 2 - .../service/impl/FlwTaskServiceImpl.java | 11 ++- .../service/impl/WorkflowServiceImpl.java | 21 +++--- 11 files changed, 173 insertions(+), 31 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java rename {ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow}/domain/bo/CompleteTaskBo.java (94%) rename ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java (77%) rename {ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core => ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow}/domain/bo/StartProcessBo.java (96%) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java new file mode 100644 index 000000000..2e63f8aca --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java @@ -0,0 +1,71 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 办理任务请求对象 + * + * @author may + */ +@Data +public class CompleteTaskDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + private Long taskId; + + /** + * 附件id + */ + private String fileId; + + /** + * 抄送人员 + */ + private List flowCopyList; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 办理意见 + */ + private String message; + + /** + * 消息通知 + */ + private String notice; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 扩展变量(此处为逗号分隔的ossId) + */ + private String ext; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java new file mode 100644 index 000000000..2f20b21f7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 抄送 + * + * @author may + */ +@Data +public class FlowCopyDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java new file mode 100644 index 000000000..3934ada55 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java @@ -0,0 +1,45 @@ +package org.dromara.common.core.domain.dto; + + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 启动流程对象 + * + * @author may + */ +@Data +public class StartProcessDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 业务唯一值id + */ + private String businessId; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index fb0a5ec04..565362e56 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -1,7 +1,7 @@ package org.dromara.common.core.service; -import org.dromara.common.core.domain.bo.CompleteTaskBo; -import org.dromara.common.core.domain.bo.StartProcessBo; +import org.dromara.common.core.domain.dto.CompleteTaskDTO; +import org.dromara.common.core.domain.dto.StartProcessDTO; import java.util.List; import java.util.Map; @@ -63,16 +63,16 @@ public interface WorkflowService { /** * 启动流程 * - * @param startProcessBo 参数 + * @param startProcess 参数 * @return 结果 */ - Map startWorkFlow(StartProcessBo startProcessBo); + Map startWorkFlow(StartProcessDTO startProcess); /** * 办理任务 * - * @param completeTaskBo 参数 + * @param completeTask 参数 * @return 结果 */ - boolean completeTask(CompleteTaskBo completeTaskBo); + boolean completeTask(CompleteTaskDTO completeTask); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 13163a9f6..7736b7bf8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -2,8 +2,6 @@ package org.dromara.workflow.controller; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.bo.CompleteTaskBo; -import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java similarity index 94% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 6520ea311..9fdf48478 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.domain.bo; +package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -36,7 +36,7 @@ public class CompleteTaskBo implements Serializable { /** * 抄送人员 */ - private List flowCopyList; + private List flowCopyList; /** * 消息类型 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java similarity index 77% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java index 8088c47c0..a45e52109 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/FlowCopy.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.domain.bo; +package org.dromara.workflow.domain.bo; import lombok.Data; @@ -12,7 +12,7 @@ import java.io.Serializable; * @author may */ @Data -public class FlowCopy implements Serializable { +public class FlowCopyBo implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java similarity index 96% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index 27ce17bfc..ea21a81e7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.domain.bo; +package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotBlank; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index e30646a90..80bfa948c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,7 +1,5 @@ package org.dromara.workflow.service; -import org.dromara.common.core.domain.bo.CompleteTaskBo; -import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 939da78bf..fca38fbac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -11,8 +11,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.bo.CompleteTaskBo; -import org.dromara.common.core.domain.bo.StartProcessBo; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; @@ -39,7 +37,6 @@ import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; -import org.dromara.common.core.domain.bo.FlowCopy; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.handler.FlowProcessEventHandler; @@ -139,7 +136,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List messageType = completeTaskBo.getMessageType(); String notice = completeTaskBo.getNotice(); // 获取抄送人 - List flowCopyList = completeTaskBo.getFlowCopyList(); + List flowCopyList = completeTaskBo.getFlowCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); // 获取流程定义信息 @@ -175,7 +172,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param task (当前任务)未办理的任务 * @param flowCopyList 抄送人 */ - private void setHandler(Instance instance, FlowTask task, List flowCopyList) { + private void setHandler(Instance instance, FlowTask task, List flowCopyList) { if (ObjectUtil.isNull(instance)) { return; } @@ -208,7 +205,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param task 任务信息 * @param flowCopyList 抄送人 */ - public void setCopy(FlowTask task, List flowCopyList) { + public void setCopy(FlowTask task, List flowCopyList) { if (CollUtil.isEmpty(flowCopyList)) { return; } @@ -225,7 +222,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = FlowParams.build(); flowParams.skipType(SkipType.NONE.getKey()); flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopy::getUserName)); + flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); hisTask.setUpdateTime(updateTime); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 53fc3c335..d00c90735 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -1,12 +1,15 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.bo.CompleteTaskBo; -import org.dromara.common.core.domain.bo.StartProcessBo; +import org.dromara.common.core.domain.dto.CompleteTaskDTO; +import org.dromara.common.core.domain.dto.StartProcessDTO; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.workflow.domain.bo.CompleteTaskBo; +import org.dromara.workflow.domain.bo.StartProcessBo; import org.dromara.workflow.service.IFlwDefinitionService; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; @@ -26,7 +29,7 @@ public class WorkflowServiceImpl implements WorkflowService { private final IFlwInstanceService flwInstanceService; private final IFlwDefinitionService flwDefinitionService; - private final IFlwTaskService iFlwTaskService; + private final IFlwTaskService flwTaskService; /** * 删除流程实例 @@ -97,20 +100,20 @@ public class WorkflowServiceImpl implements WorkflowService { /** * 启动流程 * - * @param startProcessBo 参数 + * @param startProcess 参数 */ @Override - public Map startWorkFlow(StartProcessBo startProcessBo) { - return iFlwTaskService.startWorkFlow(startProcessBo); + public Map startWorkFlow(StartProcessDTO startProcess) { + return flwTaskService.startWorkFlow(BeanUtil.toBean(startProcess, StartProcessBo.class)); } /** * 办理任务 * - * @param completeTaskBo 参数 + * @param completeTask 参数 */ @Override - public boolean completeTask(CompleteTaskBo completeTaskBo) { - return iFlwTaskService.completeTask(completeTaskBo); + public boolean completeTask(CompleteTaskDTO completeTask) { + return flwTaskService.completeTask(BeanUtil.toBean(completeTask, CompleteTaskBo.class)); } } From d6864a22a49f7e0eb6b00a61d79f75aa6f61d5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 12 Jan 2025 20:35:11 +0800 Subject: [PATCH 225/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E9=87=8D=E5=A4=8D=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/tenant/handle/TenantKeyPrefixHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java index fbf210df1..dcdef6e62 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java @@ -60,18 +60,18 @@ public class TenantKeyPrefixHandler extends KeyPrefixHandler { } try { if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { - return super.unmap(name); + return unmap; } } catch (NoClassDefFoundError ignore) { // 有些服务不需要mp导致类不存在 忽略即可 } if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { - return super.unmap(name); + return unmap; } String tenantId = TenantHelper.getTenantId(); if (StringUtils.isBlank(tenantId)) { log.debug("无法获取有效的租户id -> Null"); - return super.unmap(name); + return unmap; } if (StringUtils.startsWith(unmap, tenantId + "")) { // 如果存在则删除 From 6e6cea2e792e533bf4eabb92d7d31fccca93bf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 12 Jan 2025 20:35:39 +0800 Subject: [PATCH 226/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=97=A0?= =?UTF-8?q?=E9=9C=80=E5=A4=9A=E4=BD=99set=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/tenant/config/TenantConfig.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 2513aac92..3767fa2f1 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -55,14 +55,12 @@ public class TenantConfig { // 使用单机模式 // 设置多租户 redis key前缀 singleServerConfig.setNameMapper(nameMapper); - ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig); } ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig"); // 集群配置方式 参考下方注释 if (ObjectUtil.isNotNull(clusterServersConfig)) { // 设置多租户 redis key前缀 clusterServersConfig.setNameMapper(nameMapper); - ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig); } }; } From ed3cf9490d661b8ca98161dd36934745fa9bde50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 13 Jan 2025 14:01:12 +0800 Subject: [PATCH 227/227] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=94=AF=E6=8C=81?= =?UTF-8?q?token=E4=BC=A0=E8=BE=93=20=E5=8F=AA=E9=9C=80=E8=A6=81=E6=94=BE?= =?UTF-8?q?=E8=A1=8Ctoken=E5=A4=B4=E8=8E=B7=E5=8F=96=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 0d190c4ea..dbe16888d 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -119,7 +119,7 @@ security: - /error - /*/api-docs - /*/api-docs/** - - /warm-flow-ui/** + - /warm-flow-ui/token-name # 多租户配置 tenant: