update 获得节点列表

This commit is contained in:
lijiarao
2023-10-09 16:50:53 +08:00
parent 26fe8d9096
commit 2876556f05
7 changed files with 140 additions and 92 deletions
@@ -1,5 +1,8 @@
package com.jero.modules.activiti.controller;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.stream.StreamUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -41,6 +44,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author liJiaRao
@@ -274,25 +279,148 @@ public class ModelerController {
//查询节点信息
LambdaQueryWrapper<ProcessModelNode> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessModelNode::getModelId,modelId);
//wrapper.eq(ProcessModelNode::getNodeType,"userTask");
wrapper.orderByAsc(ProcessModelNode::getSort);
List<ProcessModelNode> nodeOriginList = processModelNodeService.list(wrapper);
ArrayList<Map<String,Object>> nodes = new ArrayList<>();
ArrayList<Map<String,Object>> edges = new ArrayList<>();
//获取所有子流程id
List<String> subProcessIdList = nodeOriginList.stream()
.map(ProcessModelNode::getXmlSubNodeId)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
Map<String,String> startEventReplace = new HashMap<>();
Map<String,ProcessModelNode> endEventReplace = new HashMap<>();
//确定结束节点的连线
List<ProcessModelNode> removeNodeList = new ArrayList<>();
for (String subProcessId : subProcessIdList) {
//获得全部子流程节点
List<ProcessModelNode> subNodeList = nodeOriginList.stream()
.filter(item -> subProcessId.equals(item.getXmlSubNodeId()))
.collect(Collectors.toList());
Map<String, String> sourceTargetMap = CollStreamUtil.toMap(subNodeList, ProcessModelNode::getXmlSourceRef, ProcessModelNode::getXmlTargetRef);
Map<String, ProcessModelNode> targetSourceMap = CollStreamUtil.toIdentityMap(subNodeList, ProcessModelNode::getXmlTargetRef);
for (ProcessModelNode subNode : subNodeList) {
String xmlNodeId = subNode.getXmlNodeId();
String nodeType = subNode.getNodeType();
if ("startEvent".equals(nodeType)){
//通过关联的线获取下一个节点的id
String s = sourceTargetMap.get(xmlNodeId);
startEventReplace.put(subProcessId,s);
}else if ("endEvent".equals(nodeType)){
//subEndEventList.add(xmlNodeId);
//通过target拿到线
ProcessModelNode flow = targetSourceMap.get(xmlNodeId);
endEventReplace.put(subProcessId,flow);
removeNodeList.add(flow);
}
}
}
//删除结束节点的连线
nodeOriginList.removeAll(removeNodeList);
//获得子流程之后的连线
List<ProcessModelNode> beforeSubProcessFlowList = nodeOriginList.stream()
.filter(item -> subProcessIdList.contains(item.getXmlSourceRef()))
.collect(Collectors.toList());
//获得子流程之后的连线map
Map<String, ProcessModelNode> beforeSubProcessFlowMap = CollStreamUtil.toIdentityMap(beforeSubProcessFlowList, ProcessModelNode::getXmlSourceRef);
//把之前删除的结束节点更新后在加回来
List<ProcessModelNode> addNodeList = new ArrayList<>();
for (ProcessModelNode modelNode : nodeOriginList) {
String nodeType = modelNode.getNodeType();
String nodeName = modelNode.getNodeName();
String xmlSourceRef = modelNode.getXmlSourceRef();
String xmlTargetRef = modelNode.getXmlTargetRef();
if ("sequenceFlow".equals(nodeType)){
if (!"驳回".equals(nodeName)){
Map<String,Object> edge = new HashMap<>();
edge.put("source",modelNode.getXmlSourceRef());
edge.put("target",modelNode.getXmlTargetRef());
edges.add(edge);
if (endEventReplace.containsKey(xmlSourceRef)) {
ProcessModelNode modelNode1 = endEventReplace.get(xmlSourceRef);
modelNode1.setXmlTargetRef(xmlTargetRef);
addNodeList.add(modelNode1);
//modelNode.setXmlTargetRef(modelNode1.getXmlTargetRef());
}
}else if (!"endEvent".equals(nodeType)&&!"startEvent".equals(nodeType)){
if (startEventReplace.containsKey(xmlTargetRef)) {
xmlTargetRef = startEventReplace.get(xmlTargetRef);
modelNode.setXmlTargetRef(xmlTargetRef);
}
}
}
//把之前删除的结束节点更新后在加回来
nodeOriginList.addAll(addNodeList);
//找到驳回的线
List<ProcessModelNode> removeList = nodeOriginList.stream()
.filter(item -> "驳回".equals(item.getNodeName()))
.collect(Collectors.toList());
//全部去除
nodeOriginList.removeAll(removeList);
//找到全部的通过线
List<ProcessModelNode> passFlowList = nodeOriginList.stream()
.filter(item -> "通过".equals(item.getNodeName()))
.filter(item -> "sequenceFlow".equals(item.getNodeType()))
.collect(Collectors.toList());
//全部去除
nodeOriginList.removeAll(passFlowList);
//获得来源id为网关的对应map(通过线的来源id一定是审批网关)
Map<String, ProcessModelNode> sourceIdIsGatewayMap = CollStreamUtil.toIdentityMap(passFlowList, ProcessModelNode::getXmlSourceRef);
//根据通过的线获取全部审批网关id
List<String> approvalGatewayList = passFlowList.stream().map(ProcessModelNode::getXmlSourceRef).collect(Collectors.toList());
//根据审批网关id获取网关前的线(目标id为网关id的是网关前的线)
List<ProcessModelNode> beforeGatewayFlowList = nodeOriginList.stream()
.filter(item -> approvalGatewayList.contains(item.getXmlTargetRef()))
.collect(Collectors.toList());
//全部去除
nodeOriginList.removeAll(beforeGatewayFlowList);
ArrayList<Map<String,Object>> edges = new ArrayList<>();
//组合来源id和去向id
for (ProcessModelNode modelNode : beforeGatewayFlowList) {
//网关前的节点id
String beforeGatewayNodeId = modelNode.getXmlSourceRef();
//这里是网关id
String xmlTargetRef = modelNode.getXmlTargetRef();
//网关后的线
ProcessModelNode modelNode1 = sourceIdIsGatewayMap.get(xmlTargetRef);
//网关后的节点id
String afterGatewayNodeId = modelNode1.getXmlTargetRef();
Map<String,Object> edge = new HashMap<>();
edge.put("source", beforeGatewayNodeId);
edge.put("target",afterGatewayNodeId);
edges.add(edge);
}
//找到全部的审批网关(审批网关名字是null)
List<ProcessModelNode> gatewayList = nodeOriginList.stream()
.filter(item -> approvalGatewayList.contains(item.getXmlNodeId()))
.collect(Collectors.toList());
//全部去除
nodeOriginList.removeAll(gatewayList);
ArrayList<Map<String,Object>> nodes = new ArrayList<>();
Map<String, ProcessModelNode> stringProcessModelNodeMap = CollStreamUtil.toIdentityMap(nodeOriginList, ProcessModelNode::getXmlNodeId);
for (ProcessModelNode modelNode : nodeOriginList) {
String nodeType = modelNode.getNodeType();
String nodeName = modelNode.getNodeName();
String xmlSourceRef = modelNode.getXmlSourceRef();
String xmlTargetRef = modelNode.getXmlTargetRef();
if ("sequenceFlow".equals(nodeType)){
Map<String,Object> edge = new HashMap<>();
edge.put("label",nodeName);
edge.put("source", xmlSourceRef);
edge.put("target",xmlTargetRef);
edges.add(edge);
}else if ("userTask".equals(nodeType)){
Map<String,Object> node = new HashMap<>();
node.put("id",modelNode.getXmlNodeId());
node.put("name",nodeName!=null?nodeName:"");
node.put("name",nodeName!=null?nodeName:"网关");
node.put("isApprovalNode",modelNode.getIsApprovalNode());
node.put("isCanDeleted",modelNode.getIsCanDeleted());
nodes.add(node);
}else if ("gateway".equals(nodeType)){
Map<String,Object> node = new HashMap<>();
node.put("id",modelNode.getXmlNodeId());
node.put("name","条件网关");
node.put("isApprovalNode",modelNode.getIsApprovalNode());
node.put("isCanDeleted",modelNode.getIsCanDeleted());
nodes.add(node);
@@ -11,5 +11,4 @@ import java.util.List;
* @date 2023-09-26 15:12
*/
public interface LawsProcessNodeOriginMapper extends BaseMapper<ProcessNodeOrigin> {
int insertList(@Param("list") List<ProcessNodeOrigin> list);
}
@@ -11,8 +11,6 @@ import com.jero.modules.activiti.entity.ProcessModelNode;
*@date 2023-10-08 14:08
*/
public interface ProcessModelNodeMapper extends BaseMapper<ProcessModelNode> {
int insertList(@Param("list")List<ProcessModelNode> list);
int deleteByModelId(@Param("modelId")String modelId);
@@ -27,43 +27,4 @@
sys_code
</sql>
<!--auto generated by MybatisCodeHelper on 2023-09-25-->
<insert id="insertList">
INSERT INTO process_node_origin(
id,
process_definition_id,
node_name,
node_type,
xml_node_id,
xml_source_ref,
xml_target_ref,
is_approval_node,
is_can_deleted,
sort,
create_by,
create_time,
update_by,
update_time,
sys_code
)VALUES
<foreach collection="list" index="index" item="element" separator=",">
(
#{element.id},
#{element.processDefinitionId},
#{element.nodeName},
#{element.nodeType},
#{element.xmlNodeId},
#{element.xmlSourceRef},
#{element.xmlTargetRef},
#{element.isApprovalNode},
#{element.isCanDeleted},
#{element.sort},
#{element.createBy},
#{element.createTime},
#{element.updateBy},
#{element.updateTime},
#{element.sysCode}
)
</foreach>
</insert>
</mapper>
@@ -36,44 +36,6 @@
<result column="update_time" property="updateTime"/>
<result column="sys_code" property="sysCode"/>
</resultMap>
<insert id="insertList">
INSERT INTO process_model_node(
id,
model_id,
node_name,
node_type,
xml_node_id,
xml_source_ref,
xml_target_ref,
is_approval_node,
is_can_deleted,
sort,
create_by,
create_time,
update_by,
update_time,
sys_code
)VALUES
<foreach collection="list" item="element" index="index" separator=",">
(
#{element.id,jdbcType=VARCHAR},
#{element.modelId,jdbcType=VARCHAR},
#{element.nodeName,jdbcType=VARCHAR},
#{element.nodeType},
#{element.xmlNodeId},
#{element.xmlSourceRef},
#{element.xmlTargetRef},
#{element.isApprovalNode,jdbcType=TINYINT},
#{element.isCanDeleted,jdbcType=TINYINT},
#{element.sort,jdbcType=TINYINT},
#{element.createBy,jdbcType=VARCHAR},
#{element.createTime,jdbcType=TIMESTAMP},
#{element.updateBy,jdbcType=VARCHAR},
#{element.updateTime,jdbcType=TIMESTAMP},
#{element.sysCode,jdbcType=VARCHAR}
)
</foreach>
</insert>
<!--auto generated by MybatisCodeHelper on 2023-10-08-->
<delete id="deleteByModelId">
@@ -66,7 +66,7 @@ public class LawsProcessNodeOriginService extends ServiceImpl<LawsProcessNodeOri
processNodeOrigin.setId(null);
processNodeOrigin.setProcessDefinitionId(processDefinitionId);
}
processNodeOriginMapper.insertList(processNodeOriginList);
this.saveBatch(processNodeOriginList);
}
}
@@ -67,7 +67,7 @@ public class ProcessModelNodeService extends ServiceImpl<ProcessModelNodeMapper,
processModelNode.setIsApprovalNode(YesOrNoEnum.YES.getInteger());
}
}
processModelNodeMapper.insertList(processModelNodeList);
this.saveBatch(processModelNodeList);
}
public Object addTask(AddTaskVO addTaskVO, HttpServletResponse response) {