diff --git a/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtils.java b/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtils.java index 751540ccfd1efea7476fd83bf7da79baf97afa0b..fc422d118de53f5f3a04411f97c5f82d244b8f0d 100644 --- a/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtils.java +++ b/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtils.java @@ -1,13 +1,12 @@ package com.schbrain.common.util; import cn.hutool.core.collection.ListUtil; +import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiConsumer; import java.util.function.Function; @@ -55,23 +54,49 @@ public class TreeUtils { return doBuildTree(keyExtractor, childrenSetter, childMapper, parentWithSubNodes, childrenComparator, parentId); } - public static List buildNodeList(List treeList, - Function> childrenGetter, - Function mapper) { + public static List getParents(E id, List nodeList, Function keyMapper, Function parentMapper, boolean includeSelf) { + // toMap 不允许 value 为空,当 parentId 为空时,单独处理下 + Map parentMap = Maps.newHashMapWithExpectedSize(nodeList.size()); + for (T node : nodeList) { + parentMap.put(keyMapper.apply(node), parentMapper.apply(node)); + } + return getParents(id, parentMap, includeSelf); + } + + public static List getParents(T id, Map parentMap, boolean includeSelf) { + List parentIds = new LinkedList<>(); + if (includeSelf) { + parentIds.add(id); + } + if (MapUtils.isEmpty(parentMap)) { + return parentIds; + } + return getParents(id, parentMap, parentIds); + } + + public static List buildNodeList(List tree, Function> childGetter, Function mapper) { List nodes = new ArrayList<>(); - doBuildNodeList(treeList, childrenGetter, mapper, nodes); + if (CollectionUtils.isEmpty(tree)) { + return nodes; + } + doBuildNodeList(tree, childGetter, mapper, nodes); return nodes; } - private static void doBuildNodeList(List treeList, - Function> childrenGetter, - Function mapper, - List nodes) { - if (CollectionUtils.isEmpty(treeList)) { - return; + private static void doBuildNodeList(List tree, Function> childGetter, Function mapper, List nodes) { + tree.forEach(node -> { + nodes.add(mapper.apply(node)); + doBuildNodeList(childGetter.apply(node), childGetter, mapper, nodes); + }); + } + + private static List getParents(T id, Map parentMap, List parentIds) { + T parentId = parentMap.get(id); + if (parentId == null) { + return parentIds; } - nodes.addAll(StreamUtils.toList(treeList, mapper)); - treeList.forEach(tree -> doBuildNodeList(childrenGetter.apply(tree), childrenGetter, mapper, nodes)); + parentIds.add(0, parentId); + return getParents(parentId, parentMap, parentIds); } private static List doBuildTree(Function keyExtractor, diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/ExceptionHandingConfiguration.java b/commons/web-common/src/main/java/com/schbrain/common/web/ExceptionHandingConfiguration.java index 15f2004f49ae92e9becb96de01c9e44acfff5ad7..a4a3348e1dbb790d987f4912d9d420003f847f52 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/ExceptionHandingConfiguration.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/ExceptionHandingConfiguration.java @@ -24,7 +24,7 @@ public class ExceptionHandingConfiguration { @Bean @ConditionalOnMissingBean - public ExceptionTranslator> defaultExceptionTranslator() { + public ExceptionTranslator> defaultExceptionTranslator() { return new DefaultExceptionTranslator(); } diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/exception/DefaultExceptionTranslator.java b/commons/web-common/src/main/java/com/schbrain/common/web/exception/DefaultExceptionTranslator.java index 4eac2de3291359d90f943e724442f79fe2a8b983..d5527c2af75d64b8cb2a2fa5444367d1c17e89c0 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/exception/DefaultExceptionTranslator.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/exception/DefaultExceptionTranslator.java @@ -10,12 +10,12 @@ import org.springframework.core.Ordered; * @author liaozan * @since 2023-06-01 */ -public class DefaultExceptionTranslator implements ExceptionTranslator> { +public class DefaultExceptionTranslator implements ExceptionTranslator> { private final boolean isProduction = EnvUtils.isProduction(); @Override - public ResponseDTO translate(Throwable throwable, int code, int action, String message) { + public ResponseDTO translate(Throwable throwable, int code, int action, String message) { if (throwable instanceof BaseException) { return ResponseDTO.error((BaseException) throwable); } diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseEntityWithLogicDelete.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseEntityWithLogicDelete.java index b190d37277db52a31056e7d5389f1463ff1a7ee8..e0afb10524d1bae7654d28b9c805c4df75efbaf6 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseEntityWithLogicDelete.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseEntityWithLogicDelete.java @@ -20,7 +20,7 @@ public class BaseEntityWithLogicDelete extends BaseEntity { */ @TableLogic @TableField(value = MybatisConstants.DELETED, select = false) - protected boolean deleted; + protected Boolean deleted; /** * 逻辑删除版本 @@ -29,4 +29,4 @@ public class BaseEntityWithLogicDelete extends BaseEntity { @TableField(value = MybatisConstants.DELETE_VERSION, select = false) protected Long deleteVersion; -} \ No newline at end of file +} diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseService.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseService.java index a7517f09b20356d574abc258c34ab1ff0a8484ba..2cec8d6919d156ad3bf7c5d6952f55f8b5fd41fb 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseService.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseService.java @@ -1,11 +1,11 @@ package com.schbrain.framework.autoconfigure.mybatis.base; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.function.Function; import java.util.function.Supplier; public interface BaseService extends IService { @@ -32,7 +32,7 @@ public interface BaseService extends IService { /** * 根据 id 获取 */ - Map getMapByIds(Collection ids, Function mapper); + Map getMapByIds(Collection ids, SFunction mapper); /** * 根据业务主键获取记录 @@ -66,7 +66,7 @@ public interface BaseService extends IService { /** * 根据业务主键获取 */ - Map getMapByBizIds(Collection bizIds, Function mapper); + Map getMapByBizIds(Collection bizIds, SFunction mapper); /** * 根据 id 更新,null 会被更新为 null diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseServiceImpl.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseServiceImpl.java index 30465e8279b8a69352952e8c63d5125dafadb2ae..e51aa16fc3c2ae0cf9f626e62826c52484c8bd94 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseServiceImpl.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/base/BaseServiceImpl.java @@ -2,6 +2,7 @@ package com.schbrain.framework.autoconfigure.mybatis.base; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.schbrain.common.exception.BaseException; @@ -22,7 +23,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.function.Function; import java.util.function.Supplier; /** @@ -34,6 +34,10 @@ public class BaseServiceImpl, T extends BaseEntity> exte @Nullable private BizIdColumnField bizIdColumnField; + private static SFunction identity() { + return any -> any; + } + @Override public T getById(Serializable id) { return getById((Long) id, false); @@ -59,15 +63,17 @@ public class BaseServiceImpl, T extends BaseEntity> exte @Override public Map getMapByIds(Collection ids) { - return getMapByIds(ids, Function.identity()); + return getMapByIds(ids, identity()); } @Override - public Map getMapByIds(Collection ids, Function mapper) { + public Map getMapByIds(Collection ids, SFunction mapper) { if (isEmpty(ids)) { return Collections.emptyMap(); } - return StreamUtils.toMap(listByIds(ids), T::getId, mapper); + // noinspection unchecked + List dataList = lambdaQuery().select(T::getId, mapper).in(T::getId, ids).list(); + return StreamUtils.toMap(dataList, T::getId, mapper); } @Override @@ -86,8 +92,7 @@ public class BaseServiceImpl, T extends BaseEntity> exte @Override public T getByBizId(Object bizId, Supplier notFoundSupplier) { - assertBidColumnFieldExist(); - T entity = query().eq(bizIdColumnField.getColumnName(), bizId).one(); + T entity = query().eq(getBidColumnField().getColumnName(), bizId).one(); if (entity == null && notFoundSupplier != null) { throw notFoundSupplier.get(); } @@ -96,25 +101,24 @@ public class BaseServiceImpl, T extends BaseEntity> exte @Override public List listByBizIds(Collection bizIds) { - assertBidColumnFieldExist(); if (isEmpty(bizIds)) { return Collections.emptyList(); } - return query().in(bizIdColumnField.getColumnName(), bizIds).list(); + return query().in(getBidColumnField().getColumnName(), bizIds).list(); } @Override public Map getMapByBizIds(Collection bizIds) { - return getMapByBizIds(bizIds, Function.identity()); + return getMapByBizIds(bizIds, identity()); } @Override - public Map getMapByBizIds(Collection bizIds, Function mapper) { - assertBidColumnFieldExist(); + public Map getMapByBizIds(Collection bizIds, SFunction mapper) { if (isEmpty(bizIds)) { return Collections.emptyMap(); } - return StreamUtils.toMap(listByBizIds(bizIds), entity -> bizIdColumnField.getValue(entity), mapper); + // How to get the mapper fieldName ? + return StreamUtils.toMap(listByBizIds(bizIds), entity -> getBidColumnField().getValue(entity), mapper); } @Override @@ -150,10 +154,11 @@ public class BaseServiceImpl, T extends BaseEntity> exte }, field -> field.isAnnotationPresent(BizId.class)); } - private void assertBidColumnFieldExist() { + protected BizIdColumnField getBidColumnField() { if (bizIdColumnField == null) { throw new BaseException(String.format("@BizId not exist in Class: \"%s\"", entityClass.getName())); } + return bizIdColumnField; } private String getUpdateByIdWithNullStatementId(Class mapperClass) {