1.增加主链路编码,实现多个主链路

This commit is contained in:
chenweilong 2022-12-19 11:54:58 +08:00
parent 3a3540079b
commit 1e01f892a3
7 changed files with 148 additions and 91 deletions

View File

@ -23,7 +23,11 @@ public class BaseChainEntity {
*/
@TableField("template_id")
private String templateId;
/**
* 主链路编码
*/
@TableField("main_chain_code")
private String mainChainCode;
/**
* 链路名称
*/

View File

@ -27,7 +27,11 @@ public class BaseNodeEntity {
*/
@TableField("template_id")
private String templateId;
/**
* 主链路编码
*/
@TableField("main_chain_code")
private String mainChainCode;
/**
* 节点名称
*/

View File

@ -1,5 +1,6 @@
package com.example.liteflow.mysql.model.baseChain;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
@ -13,7 +14,10 @@ public class BaseChainVO {
private String id;
private String templateId;
/**
* 主链路编码
*/
private String mainChainCode;
private String templateName;
private String chainName;

View File

@ -22,6 +22,10 @@ public class BaseNodeVO {
* 所属模板id
*/
private String templateId;
/**
* 主链路编码
*/
private String mainChainCode;
/**
* 所属模板名称
*/

View File

@ -20,7 +20,10 @@ public class CreateNodeFrom {
* 所属模板id
*/
private String templateId;
/**
* 主链路编码
*/
private String mainChainCode;
/**
* 节点名称
*/

View File

@ -17,6 +17,10 @@ public class UpdateNodeFrom {
* 节点对应输出节点id
*/
private String nodeContentId;
/**
* 主链路编码
*/
private String mainChainCode;
/**
* 规则
*/

View File

@ -27,6 +27,7 @@ import com.yomahub.liteflow.flow.FlowBus;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.flow.element.Chain;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -89,79 +90,97 @@ public class BaseChainServiceImpl extends ServiceImpl<BaseChainMapper, BaseChain
String templateName = templateEntity.getTemplateName();
String templateId = templateEntity.getId();
List<BaseNodeEntity> nodeList = templateEntity.getBaseNodeEntityList();
// 将所有节点注入
Map<String, List<BaseNodeEntity>> nodeMap = new HashMap<>();
nodeList.forEach(node -> {
String nodeType = node.getNodeType();
String nodeId = node.getNodeId();
String nodeName = node.getNodeName();
String nodeClass = node.getNodeClass();
if (NodeEnum.CommonNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createCommonNode()
.setId(nodeId)
.setName(nodeName)
.setClazz(nodeClass)
.build();
} else if (NodeEnum.IfNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createIfNode()
.setId(nodeId)
.setName(nodeName)
.setClazz(nodeClass)
.build();
String mainChainCode = node.getMainChainCode();
if (nodeMap.containsKey(mainChainCode)) {
List<BaseNodeEntity> nodeMapList = nodeMap.get(mainChainCode);
nodeMapList.add(node);
} else {
ArrayList<BaseNodeEntity> nodeMapList = Lists.newArrayList(node);
nodeMap.put(mainChainCode, nodeMapList);
}
});
// 输出节点
Map<String, BaseNodeEntity> commonNodeMap = nodeList.stream()
.filter(node -> NodeEnum.CommonNode.getName().equals(node.getNodeType()))
.collect(Collectors.toMap(BaseNodeEntity::getId, BaseNodeEntity -> BaseNodeEntity));
// 判断节点
List<BaseNodeEntity> ifNodeList = nodeList.stream().filter(node -> NodeEnum.IfNode.getName().equals(node.getNodeType())).collect(Collectors.toList());
StringBuilder stringBuilder = new StringBuilder();
int leftBracesNum = 0;
int num = 0;
for (BaseNodeEntity ifNode : ifNodeList) {
num++;
leftBracesNum++;
stringBuilder.append("IF(");
String ifNodeId = ifNode.getNodeId();
String nodeContentId = ifNode.getNodeContentId();
BaseNodeEntity commonNode = commonNodeMap.get(nodeContentId);
if (ObjectUtil.isNotNull(commonNode)) {
String commonNodeId = commonNode.getNodeId();
stringBuilder.append(ifNodeId).append(",").append(commonNodeId);
} else {
stringBuilder.append(ifNodeId).append(",defaultOutput");
for (Map.Entry<String, List<BaseNodeEntity>> entry : nodeMap.entrySet()) {
String mainChainCode = entry.getKey();
List<BaseNodeEntity> mapNodeList = entry.getValue();
// 将所有节点注入
mapNodeList.forEach(node -> {
String nodeType = node.getNodeType();
String nodeId = node.getNodeId();
String nodeName = node.getNodeName();
String nodeClass = node.getNodeClass();
if (NodeEnum.CommonNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createCommonNode()
.setId(nodeId)
.setName(nodeName)
.setClazz(nodeClass)
.build();
} else if (NodeEnum.IfNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createIfNode()
.setId(nodeId)
.setName(nodeName)
.setClazz(nodeClass)
.build();
}
});
// 输出节点
Map<String, BaseNodeEntity> commonNodeMap = mapNodeList.stream()
.filter(node -> NodeEnum.CommonNode.getName().equals(node.getNodeType()))
.collect(Collectors.toMap(BaseNodeEntity::getId, BaseNodeEntity -> BaseNodeEntity));
// 判断节点
List<BaseNodeEntity> ifNodeList = mapNodeList.stream().filter(node -> NodeEnum.IfNode.getName().equals(node.getNodeType())).collect(Collectors.toList());
StringBuilder stringBuilder = new StringBuilder();
int leftBracesNum = 0;
int num = 0;
for (BaseNodeEntity ifNode : ifNodeList) {
num++;
leftBracesNum++;
stringBuilder.append("IF(");
String ifNodeId = ifNode.getNodeId();
String nodeContentId = ifNode.getNodeContentId();
BaseNodeEntity commonNode = commonNodeMap.get(nodeContentId);
if (ObjectUtil.isNotNull(commonNode)) {
String commonNodeId = commonNode.getNodeId();
stringBuilder.append(ifNodeId).append(",").append(commonNodeId);
} else {
stringBuilder.append(ifNodeId).append(",defaultOutput");
}
if (num != ifNodeList.size()) {
stringBuilder.append(",");
} else {
stringBuilder.append(",defaultOutput");
}
}
if (num != ifNodeList.size()) {
stringBuilder.append(",");
} else {
stringBuilder.append(",defaultOutput");
for (int i = 0; i < leftBracesNum; i++) {
stringBuilder.append(")");
}
String chainName = mainChainCode + "_" + templateName;
log.info("templateName = {}, stringBuilder = {}", templateName, stringBuilder);
BaseChainEntity baseChainEntity = new BaseChainEntity();
baseChainEntity.setTemplateId(templateId);
baseChainEntity.setMainChainCode(mainChainCode);
baseChainEntity.setChainName(chainName);
baseChainEntity.setElData(stringBuilder.toString());
if (!FlowBus.containChain(templateName)) {
LiteFlowChainELBuilder.createChain()
.setChainId(chainName)
.setEL(stringBuilder.toString())
.build();
flowExecutor.reloadRule();
}
LambdaUpdateWrapper<BaseChainEntity> baseChainQueryWrapper = new LambdaUpdateWrapper<>();
baseChainQueryWrapper.eq(BaseChainEntity::getTemplateId, templateId)
.eq(BaseChainEntity::getChainName, chainName)
.eq(BaseChainEntity::getMainChainCode, mainChainCode)
.eq(BaseChainEntity::getEnableMark, EnableMarkEnum.Enable.getValue());
BaseChainEntity checkExists = this.getOne(baseChainQueryWrapper);
if (ObjectUtil.isNull(checkExists)) {
this.save(baseChainEntity);
} else {
checkExists.setElData(stringBuilder.toString());
this.updateById(checkExists);
}
}
for (int i = 0; i < leftBracesNum; i++) {
stringBuilder.append(")");
}
log.info("templateName = {}, stringBuilder = {}", templateName, stringBuilder);
BaseChainEntity baseChainEntity = new BaseChainEntity();
baseChainEntity.setTemplateId(templateId);
baseChainEntity.setChainName(templateName);
baseChainEntity.setElData(stringBuilder.toString());
if (!FlowBus.containChain(templateName)) {
LiteFlowChainELBuilder.createChain()
.setChainId(templateName)
.setEL(stringBuilder.toString())
.build();
flowExecutor.reloadRule();
}
LambdaUpdateWrapper<BaseChainEntity> baseChainQueryWrapper = new LambdaUpdateWrapper<>();
baseChainQueryWrapper.eq(BaseChainEntity::getTemplateId, templateId)
.eq(BaseChainEntity::getEnableMark, EnableMarkEnum.Enable.getValue());
BaseChainEntity checkExists = this.getOne(baseChainQueryWrapper);
if (ObjectUtil.isNull(checkExists)) {
this.save(baseChainEntity);
} else {
checkExists.setChainName(templateName);
checkExists.setElData(stringBuilder.toString());
this.updateById(checkExists);
}
});
}
@ -199,33 +218,48 @@ public class BaseChainServiceImpl extends ServiceImpl<BaseChainMapper, BaseChain
@Override
public void initMainChain() {
log.info("进入【初始化主链路】方法");
String mainChainName = "mainChain";
LambdaQueryWrapper<BaseChainEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseChainEntity::getEnableMark, EnableMarkEnum.Enable.getValue())
.ne(BaseChainEntity::getChainName, "mainChain");
queryWrapper.eq(BaseChainEntity::getEnableMark, EnableMarkEnum.Enable.getValue());
List<BaseChainEntity> chainList = this.list(queryWrapper);
log.info("chainList size = {}", chainList.size());
if (CollUtil.isNotEmpty(chainList)) {
StringJoiner elData = new StringJoiner(",", "THEN(", ")");
chainList.forEach(chain -> elData.add(chain.getChainName()));
if (!FlowBus.containChain(mainChainName)) {
Map<String, List<BaseChainEntity>> nodeMap = new HashMap<>();
// 根据链路编码进行分类
chainList.forEach(chain -> {
String mainChainCode = chain.getMainChainCode();
if (nodeMap.containsKey(mainChainCode)) {
List<BaseChainEntity> nodeMapList = nodeMap.get(mainChainCode);
nodeMapList.add(chain);
} else {
ArrayList<BaseChainEntity> nodeMapList = Lists.newArrayList(chain);
nodeMap.put(mainChainCode, nodeMapList);
}
});
// 生成链路
for (Map.Entry<String, List<BaseChainEntity>> entry : nodeMap.entrySet()) {
String mainChainCode = entry.getKey();
String chainName = mainChainCode + "_mainChain";
List<BaseChainEntity> nodeMapList = entry.getValue();
StringJoiner elData = new StringJoiner(",", "THEN(", ")");
nodeMapList.forEach(chain -> elData.add(chain.getChainName()));
log.info("elData = {}", elData);
LiteFlowChainELBuilder.createChain()
.setChainId(mainChainName)
.setChainId(chainName)
.setEL(elData.toString())
.build();
flowExecutor.reloadRule();
}
LambdaQueryWrapper<BaseChainEntity> mainQueryWrapper = new LambdaQueryWrapper<>();
mainQueryWrapper.eq(BaseChainEntity::getChainName, mainChainName);
BaseChainEntity mainChain = this.getOne(mainQueryWrapper);
if (ObjectUtil.isNull(mainChain)) {
mainChain = new BaseChainEntity();
mainChain.setChainName(mainChainName);
mainChain.setElData(elData.toString());
this.save(mainChain);
} else {
mainChain.setElData(elData.toString());
this.updateById(mainChain);
LambdaQueryWrapper<BaseChainEntity> mainQueryWrapper = new LambdaQueryWrapper<>();
mainQueryWrapper.eq(BaseChainEntity::getChainName, chainName);
BaseChainEntity mainChain = this.getOne(mainQueryWrapper);
if (ObjectUtil.isNull(mainChain)) {
mainChain = new BaseChainEntity();
mainChain.setChainName(chainName);
mainChain.setElData(elData.toString());
this.save(mainChain);
} else {
mainChain.setElData(elData.toString());
this.updateById(mainChain);
}
}
}
}