From 950f51f9c51d2724e025143470e8cd861d069d3c Mon Sep 17 00:00:00 2001 From: wsm <2746563060@qq.com> Date: Mon, 27 Jul 2026 14:24:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(bpm):=20=E6=96=B0=E5=A2=9E=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=A9=B3=E5=9B=9E=E7=9B=AE=E6=A0=87=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=A1=A8=E5=8F=8A=E7=BA=AF=E5=A2=9E=E9=87=8F=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 ext_act_process_node_reject_target 表,支持一个节点配置多个可驳回目标节点。 纯增量实现:不修改已有 Controller/Service 方法逻辑,仅新增 3 个端点: - queryRejectTargets: 查询节点已配置的驳回目标(配置页回显) - saveRejectTargets: 保存驳回目标配置(先删后插,事务保护) - queryRejectTargetCodes: 运行时根据 processKey+nodeCode 查询允许的目标节点 ActTaskController 仅新增 processKey/taskDefinitionKey 字段暴露,原有逻辑不变。 Co-Authored-By: Claude Opus 4.7 --- db/upgrade/add_reject_target_node.sql | 12 ++++ .../bpm/controller/ActTaskController.java | 3 + .../ExtActProcessNodeController.java | 55 ++++++++++++++++++- .../entity/ExtActProcessNodeRejectTarget.java | 33 +++++++++++ .../ExtActProcessNodeRejectTargetMapper.java | 31 +++++++++++ .../ExtActProcessNodeRejectTargetMapper.xml | 34 ++++++++++++ ...IExtActProcessNodeRejectTargetService.java | 20 +++++++ ...ActProcessNodeRejectTargetServiceImpl.java | 36 ++++++++++++ 8 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 db/upgrade/add_reject_target_node.sql create mode 100644 jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/entity/ExtActProcessNodeRejectTarget.java create mode 100644 jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/ExtActProcessNodeRejectTargetMapper.java create mode 100644 jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/xml/ExtActProcessNodeRejectTargetMapper.xml create mode 100644 jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/IExtActProcessNodeRejectTargetService.java create mode 100644 jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessNodeRejectTargetServiceImpl.java diff --git a/db/upgrade/add_reject_target_node.sql b/db/upgrade/add_reject_target_node.sql new file mode 100644 index 0000000..3eaecfb --- /dev/null +++ b/db/upgrade/add_reject_target_node.sql @@ -0,0 +1,12 @@ +-- 流程节点驳回目标节点配置表 +-- 一对多:一个源节点可配置多个可驳回的目标节点 +CREATE TABLE IF NOT EXISTS `ext_act_process_node_reject_target` ( + `id` varchar(64) NOT NULL COMMENT '主键ID', + `process_id` varchar(64) NOT NULL COMMENT '流程ID(对应ext_act_process_node.process_id)', + `source_node_code` varchar(100) NOT NULL COMMENT '源节点CODE(当前配置驳回的节点)', + `target_node_code` varchar(100) NOT NULL COMMENT '目标节点CODE(可以驳回到的节点)', + `target_node_name` varchar(200) DEFAULT NULL COMMENT '目标节点名称', + PRIMARY KEY (`id`), + KEY `idx_process_source` (`process_id`, `source_node_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程节点驳回目标配置'; +、 \ No newline at end of file diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java index 396441f..7cf41f0 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java @@ -357,6 +357,9 @@ public class ActTaskController { map.put("defaultOpinionCond0", extActProcessNode.getDefaultOpinion()); map.put("defaultOpinionCond1", extActProcessNode.getDefaultOpinion2()); } + // 流程标识和当前节点编码,供前端做驳回目标过滤 + map.put("processKey", pd.getKey()); + map.put("taskDefinitionKey", task.getTaskDefinitionKey()); //--update--end------author:scott-----date:20220705-----for:【VUEN-1332】流程节点配置智能化------------- // 流程审批日志 diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java index a6717cf..9494d0d 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java @@ -22,12 +22,15 @@ import org.jeecg.modules.extbpm.process.entity.ExtActFlowData; import org.jeecg.modules.extbpm.process.entity.ExtActProcessNode; import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeDeployment; import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodePermission; +import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeRejectTarget; import org.jeecg.modules.extbpm.process.pojo.BizTaskDTO; import org.jeecg.modules.extbpm.process.service.IExtActFlowDataService; import org.jeecg.modules.extbpm.process.service.IExtActProcessNodeDeploymentService; import org.jeecg.modules.extbpm.process.service.IExtActProcessNodePermissionService; +import org.jeecg.modules.extbpm.process.service.IExtActProcessNodeRejectTargetService; import org.jeecg.modules.extbpm.process.service.IExtActProcessNodeService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -67,6 +70,8 @@ public class ExtActProcessNodeController { private IExtActProcessNodePermissionService extActProcessNodePermissionService; @Autowired private IExtActFlowDataService extActFlowDataService; + @Autowired + private IExtActProcessNodeRejectTargetService extActProcessNodeRejectTargetService; /** * 分页列表查询 @@ -142,7 +147,7 @@ public class ExtActProcessNodeController { result.success("删除成功!"); } } - + return result; } @@ -158,12 +163,58 @@ public class ExtActProcessNodeController { if(ids==null || "".equals(ids.trim())) { result.error500("参数不识别!"); }else { - this.extActProcessNodeService.removeByIds(Arrays.asList(ids.split(","))); + List idList = Arrays.asList(ids.split(",")); + this.extActProcessNodeService.removeByIds(idList); result.success("删除成功!"); } return result; } + @GetMapping(value = "/queryRejectTargets") + public Result> queryRejectTargets( + @RequestParam(name="processId", required=true) String processId, + @RequestParam(name="sourceNodeCode", required=true) String sourceNodeCode) { + Result> result = new Result<>(); + List list = extActProcessNodeRejectTargetService.queryBySourceNode(processId, sourceNodeCode); + result.setResult(list); + result.setSuccess(true); + return result; + } + + /** + * 保存节点的驳回目标配置(先删旧、后插新) + */ + @Transactional + @PostMapping(value = "/saveRejectTargets") + public Result saveRejectTargets( + @RequestParam(name="processId", required=true) String processId, + @RequestParam(name="sourceNodeCode", required=true) String sourceNodeCode, + @RequestBody(required = false) List rejectTargetList) { + // 删除旧配置 + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(ExtActProcessNodeRejectTarget::getProcessId, processId); + deleteWrapper.eq(ExtActProcessNodeRejectTarget::getSourceNodeCode, sourceNodeCode); + extActProcessNodeRejectTargetService.remove(deleteWrapper); + // 插入新配置 + if (rejectTargetList != null && !rejectTargetList.isEmpty()) { + extActProcessNodeRejectTargetService.saveBatch(rejectTargetList); + } + return Result.ok("保存成功"); + } + /** + * 根据 processKey + nodeCode 查询可驳回的目标节点CODE列表(运行时过滤用) + */ + @GetMapping(value = "/queryRejectTargetCodes") + public Result> queryRejectTargetCodes( + @RequestParam(name="processKey", required=true) String processKey, + @RequestParam(name="nodeCode", required=true) String nodeCode) { + Result> result = new Result<>(); + List list = extActProcessNodeRejectTargetService.queryRejectTargetCodesByProcessKeyAndNodeCode(processKey, nodeCode); + result.setResult(list); + result.setSuccess(true); + return result; + } + /** * 通过id查询 * @param id diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/entity/ExtActProcessNodeRejectTarget.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/entity/ExtActProcessNodeRejectTarget.java new file mode 100644 index 0000000..b40d568 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/entity/ExtActProcessNodeRejectTarget.java @@ -0,0 +1,33 @@ +package org.jeecg.modules.extbpm.process.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; + +/** + * @Description: 流程节点驳回目标配置 + * @author: jeecg-boot + * @date: 2026-07-27 + * @version: V1.0 + */ +@Data +@TableName("ext_act_process_node_reject_target") +public class ExtActProcessNodeRejectTarget implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + private java.lang.String id; + /**流程ID*/ + private java.lang.String processId; + /**源节点CODE(当前配置驳回的节点)*/ + private java.lang.String sourceNodeCode; + /**目标节点CODE(可以驳回到的节点)*/ + private java.lang.String targetNodeCode; + /**目标节点名称*/ + private java.lang.String targetNodeName; +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/ExtActProcessNodeRejectTargetMapper.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/ExtActProcessNodeRejectTargetMapper.java new file mode 100644 index 0000000..08eea21 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/ExtActProcessNodeRejectTargetMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.extbpm.process.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeRejectTarget; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 流程节点驳回目标配置 + * @author: jeecg-boot + * @date: 2026-07-27 + * @version: V1.0 + */ +public interface ExtActProcessNodeRejectTargetMapper extends BaseMapper { + + /** + * 通过 processKey + nodeCode 查询可驳回的目标节点CODE列表(运行时过滤用) + */ + List queryRejectTargetCodesByProcessKeyAndNodeCode( + @Param("processKey") String processKey, + @Param("nodeCode") String nodeCode); + + /** + * 查询某源节点的所有驳回目标配置(配置页面回显用) + */ + List queryBySourceNode( + @Param("processId") String processId, + @Param("sourceNodeCode") String sourceNodeCode); +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/xml/ExtActProcessNodeRejectTargetMapper.xml b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/xml/ExtActProcessNodeRejectTargetMapper.xml new file mode 100644 index 0000000..bd376bd --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/mapper/xml/ExtActProcessNodeRejectTargetMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/IExtActProcessNodeRejectTargetService.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/IExtActProcessNodeRejectTargetService.java new file mode 100644 index 0000000..74dd93f --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/IExtActProcessNodeRejectTargetService.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.extbpm.process.service; + +import java.util.List; + +import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeRejectTarget; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 流程节点驳回目标配置 + * @author: jeecg-boot + * @date: 2026-07-27 + * @version: V1.0 + */ +public interface IExtActProcessNodeRejectTargetService extends IService { + + List queryRejectTargetCodesByProcessKeyAndNodeCode(String processKey, String nodeCode); + + List queryBySourceNode(String processId, String sourceNodeCode); +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessNodeRejectTargetServiceImpl.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessNodeRejectTargetServiceImpl.java new file mode 100644 index 0000000..036e484 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessNodeRejectTargetServiceImpl.java @@ -0,0 +1,36 @@ +package org.jeecg.modules.extbpm.process.service.impl; + +import java.util.List; + +import org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeRejectTarget; +import org.jeecg.modules.extbpm.process.mapper.ExtActProcessNodeRejectTargetMapper; +import org.jeecg.modules.extbpm.process.service.IExtActProcessNodeRejectTargetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 流程节点驳回目标配置 + * @author: jeecg-boot + * @date: 2026-07-27 + * @version: V1.0 + */ +@Service("extActProcessNodeRejectTargetService") +public class ExtActProcessNodeRejectTargetServiceImpl + extends ServiceImpl + implements IExtActProcessNodeRejectTargetService { + + @Autowired + private ExtActProcessNodeRejectTargetMapper extActProcessNodeRejectTargetMapper; + + @Override + public List queryRejectTargetCodesByProcessKeyAndNodeCode(String processKey, String nodeCode) { + return extActProcessNodeRejectTargetMapper.queryRejectTargetCodesByProcessKeyAndNodeCode(processKey, nodeCode); + } + + @Override + public List queryBySourceNode(String processId, String sourceNodeCode) { + return extActProcessNodeRejectTargetMapper.queryBySourceNode(processId, sourceNodeCode); + } +}