!95 feat(bpm): 新增节点驳回目标配置表及纯增量后端接口

Merge pull request !95 from wsm/feature/node_reject
This commit is contained in:
wsm
2026-07-27 06:25:58 +00:00
committed by Gitee
8 changed files with 222 additions and 2 deletions
+12
View File
@@ -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='流程节点驳回目标配置';
@@ -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】流程节点配置智能化-------------
// 流程审批日志
@@ -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<String> idList = Arrays.asList(ids.split(","));
this.extActProcessNodeService.removeByIds(idList);
result.success("删除成功!");
}
return result;
}
@GetMapping(value = "/queryRejectTargets")
public Result<List<ExtActProcessNodeRejectTarget>> queryRejectTargets(
@RequestParam(name="processId", required=true) String processId,
@RequestParam(name="sourceNodeCode", required=true) String sourceNodeCode) {
Result<List<ExtActProcessNodeRejectTarget>> result = new Result<>();
List<ExtActProcessNodeRejectTarget> 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<ExtActProcessNodeRejectTarget> rejectTargetList) {
// 删除旧配置
LambdaQueryWrapper<ExtActProcessNodeRejectTarget> 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<List<String>> queryRejectTargetCodes(
@RequestParam(name="processKey", required=true) String processKey,
@RequestParam(name="nodeCode", required=true) String nodeCode) {
Result<List<String>> result = new Result<>();
List<String> list = extActProcessNodeRejectTargetService.queryRejectTargetCodesByProcessKeyAndNodeCode(processKey, nodeCode);
result.setResult(list);
result.setSuccess(true);
return result;
}
/**
* 通过id查询
* @param id
@@ -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;
}
@@ -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<ExtActProcessNodeRejectTarget> {
/**
* 通过 processKey + nodeCode 查询可驳回的目标节点CODE列表(运行时过滤用)
*/
List<String> queryRejectTargetCodesByProcessKeyAndNodeCode(
@Param("processKey") String processKey,
@Param("nodeCode") String nodeCode);
/**
* 查询某源节点的所有驳回目标配置(配置页面回显用)
*/
List<ExtActProcessNodeRejectTarget> queryBySourceNode(
@Param("processId") String processId,
@Param("sourceNodeCode") String sourceNodeCode);
}
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.extbpm.process.mapper.ExtActProcessNodeRejectTargetMapper">
<resultMap id="ExtActProcessNodeRejectTarget" type="org.jeecg.modules.extbpm.process.entity.ExtActProcessNodeRejectTarget">
<result column="id" property="id" jdbcType="VARCHAR"/>
<result column="process_id" property="processId" jdbcType="VARCHAR"/>
<result column="source_node_code" property="sourceNodeCode" jdbcType="VARCHAR"/>
<result column="target_node_code" property="targetNodeCode" jdbcType="VARCHAR"/>
<result column="target_node_name" property="targetNodeName" jdbcType="VARCHAR"/>
</resultMap>
<!-- 通过 processKey + nodeCode 查询可驳回目标节点CODE(运行时过滤) -->
<select id="queryRejectTargetCodesByProcessKeyAndNodeCode" resultType="java.lang.String">
SELECT rt.target_node_code
FROM ext_act_process_node_reject_target rt
INNER JOIN ext_act_process_node eapn
ON rt.process_id = eapn.process_id
AND rt.source_node_code = eapn.process_node_code
INNER JOIN ext_act_process eap
ON eapn.process_id = eap.id
WHERE eap.process_key = #{processKey}
AND eapn.process_node_code = #{nodeCode}
</select>
<!-- 查询某源节点的所有驳回目标配置(配置页面回显) -->
<select id="queryBySourceNode" resultMap="ExtActProcessNodeRejectTarget">
SELECT id, process_id, source_node_code, target_node_code, target_node_name
FROM ext_act_process_node_reject_target
WHERE process_id = #{processId}
AND source_node_code = #{sourceNodeCode}
</select>
</mapper>
@@ -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<ExtActProcessNodeRejectTarget> {
List<String> queryRejectTargetCodesByProcessKeyAndNodeCode(String processKey, String nodeCode);
List<ExtActProcessNodeRejectTarget> queryBySourceNode(String processId, String sourceNodeCode);
}
@@ -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<ExtActProcessNodeRejectTargetMapper, ExtActProcessNodeRejectTarget>
implements IExtActProcessNodeRejectTargetService {
@Autowired
private ExtActProcessNodeRejectTargetMapper extActProcessNodeRejectTargetMapper;
@Override
public List<String> queryRejectTargetCodesByProcessKeyAndNodeCode(String processKey, String nodeCode) {
return extActProcessNodeRejectTargetMapper.queryRejectTargetCodesByProcessKeyAndNodeCode(processKey, nodeCode);
}
@Override
public List<ExtActProcessNodeRejectTarget> queryBySourceNode(String processId, String sourceNodeCode) {
return extActProcessNodeRejectTargetMapper.queryBySourceNode(processId, sourceNodeCode);
}
}