diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/PidBuildConstants.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/PidBuildConstants.java new file mode 100644 index 000000000..d949e535d --- /dev/null +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/PidBuildConstants.java @@ -0,0 +1,26 @@ +package cn.stylefeng.roses.kernel.rule.constants; + +/** + * pid结构构造过程中用到的配置 + * + * @author fengshuonan + * @since 2023/6/15 15:00 + */ +public class PidBuildConstants { + + /** + * 顶级节点的父级id + */ + public static final String TOP_FLAG = "-1"; + + /** + * 顶级节点的父级ids + */ + public static final String TOP_PIDS = "[-1],"; + + /** + * pids的拼接符号 + */ + public static final String SEPARATOR = SymbolConstant.COMMA; + +} diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/BasePidBuildModel.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/BasePidBuildModel.java new file mode 100644 index 000000000..8cc20b3b9 --- /dev/null +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/BasePidBuildModel.java @@ -0,0 +1,34 @@ +package cn.stylefeng.roses.kernel.rule.tree.buildpids; + +/** + * 构造pids结构需要的实体规范 + * + * @author fengshuonan + * @since 2023/6/15 15:01 + */ +public interface BasePidBuildModel { + + /** + * 获取树形节点id + * + * @author fengshuonan + * @since 2023/6/15 15:02 + */ + String pidBuildNodeId(); + + /** + * 获取树形节点的父级id + * + * @author fengshuonan + * @since 2023/6/15 15:02 + */ + String pidBuildParentId(); + + /** + * 设置pids结构 + * + * @author fengshuonan + * @since 2023/6/15 15:02 + */ + void setPidBuildPidStructure(String pids); +} diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/PidStructureBuildUtil.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/PidStructureBuildUtil.java new file mode 100644 index 000000000..f3e724f81 --- /dev/null +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/buildpids/PidStructureBuildUtil.java @@ -0,0 +1,92 @@ +package cn.stylefeng.roses.kernel.rule.tree.buildpids; + +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.rule.constants.PidBuildConstants; +import cn.stylefeng.roses.kernel.rule.constants.SymbolConstant; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * 构建pids结构的工具,自动填充到参数中pids + * + * @author fengshuonan + * @since 2023/6/15 15:02 + */ +public class PidStructureBuildUtil { + + /** + * 构造pids结构 + * + * @author fengshuonan + * @since 2023/6/15 15:03 + */ + public static void createPidStructure(List list) { + + // 保存每一个数据的pids路径(成品),key是节点id,value是pids路径字符串 + Map routeMap = new HashMap<>(); + + // 暂时未找到父级的pids的对象,key是节点id,value是实体对象 + Map waitMap = new HashMap<>(); + + // 一次遍历 + for (T itemModel : list) { + + String pid = itemModel.pidBuildParentId(); + + String pids = ""; + + // pid不存在或者pid是-1,直接设置pids为[-1], + if (ObjectUtil.isEmpty(pid) || PidBuildConstants.TOP_FLAG.equals(pid)) { + pids = PidBuildConstants.TOP_PIDS; + itemModel.setPidBuildPidStructure(pids); + routeMap.put(itemModel.pidBuildNodeId(), pids); + } + + // pid存在,去routeMap找它的父级的pids,【父级的pids,[父级的id],】 + else { + String parentPids = routeMap.get(pid); + + //如果此时还没处理到它的父级,放入等待队列中,处理完一轮后再回溯 + if (ObjectUtil.isEmpty(parentPids)) { + waitMap.put(itemModel.pidBuildNodeId(), itemModel); + } else { + pids = parentPids + SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS + PidBuildConstants.SEPARATOR; + itemModel.setPidBuildPidStructure(pids); + routeMap.put(itemModel.pidBuildNodeId(), pids); + } + } + } + + // 处理暂时未找到父级的pids的对象集合 + int size = waitMap.size(); + while (size != 0) { + // 处理waitMap中没拿到结果的对象 + Iterator> iterator = waitMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + T waitProcessItem = entry.getValue(); + + // 再次寻找父级的pids + String parentPids = routeMap.get(waitProcessItem.pidBuildParentId()); + if (ObjectUtil.isEmpty(parentPids)) { + //如果还是没有,等待下一次回溯 + continue; + } + + // 父级的pids有了,组装自己的pids + String pids = parentPids + SymbolConstant.LEFT_SQUARE_BRACKETS + waitProcessItem.pidBuildParentId() + SymbolConstant.RIGHT_SQUARE_BRACKETS + PidBuildConstants.SEPARATOR; + waitProcessItem.setPidBuildPidStructure(pids); + + // 放入map,以便它的下级在回溯的时候能够找到它 + routeMap.put(waitProcessItem.pidBuildNodeId(), pids); + + // 每找到一个,就删除一个 + size--; + iterator.remove(); + } + } + } +}