diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/SystemUserMapper.xml b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/SystemUserMapper.xml index cfdcf7d87..5383ff41c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/SystemUserMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/SystemUserMapper.xml @@ -199,11 +199,12 @@ diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/ISystemUserService.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/ISystemUserService.java index 087a7bd02..6b3629ac1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/ISystemUserService.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/ISystemUserService.java @@ -92,4 +92,11 @@ public interface ISystemUserService extends IService { Page getSystemUserBySnPage(Map map); Map deviceLogin(Map map); + + /** + * 判断是否为供应商 + * + * @return + */ + boolean isSupplier(); } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/SystemUserServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/SystemUserServiceImpl.java index 7ca6f62b0..ec938e82c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/SystemUserServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/SystemUserServiceImpl.java @@ -1445,6 +1445,12 @@ public class SystemUserServiceImpl extends ServiceImpl selectHiddenDangerInspectRegion(Map map) { List list = hiddenDangerInspectRegionMapper.selectHiddenDangerInspectRegionList(map); - List result = TreeUtil.buildTreeByMap(list, "id", "parentRegion", "children", 0L); + List result = ListUtils.buildTreeByMap(list, "id", "parentRegion", "children", 0L); return result; } diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java index 1222fbef6..769e33f6a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java @@ -1,11 +1,11 @@ package com.zhgd.xmgl.modules.quality.service.impl; +import cn.hutool.core.lang.tree.TreeUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.modules.quality.entity.QualityRegion; import com.zhgd.xmgl.modules.quality.mapper.QualityRegionMapper; import com.zhgd.xmgl.modules.quality.service.IQualityRegionService; -import com.zhgd.xmgl.util.TreeUtil; +import com.zhgd.xmgl.util.ListUtils; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,7 +30,7 @@ public class QualityRegionServiceImpl extends ServiceImpl selectQualityRegionList(Map map) { List list = qualityRegionMapper.selectQualityRegionList(map); - return TreeUtil.buildTreeByMap(list, "id", "parentRegion", "children", 0L); + return ListUtils.buildTreeByMap(list, "id", "parentRegion", "children", 0L); } private List groupList(List list, List childList) { diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/EnterpriseInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/EnterpriseInfoMapper.xml index ad15c3c6d..75d833787 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/EnterpriseInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/EnterpriseInfoMapper.xml @@ -114,7 +114,8 @@ - \ No newline at end of file + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java index 55431ddc9..870f7f088 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/EnterpriseInfoServiceImpl.java @@ -14,6 +14,7 @@ import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.async.AsyncJiLianDa; import com.zhgd.xmgl.async.AsyncWorker; import com.zhgd.xmgl.base.CompanyVo; +import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.ProjectEnterprise; import com.zhgd.xmgl.modules.project.mapper.ProjectEnterpriseMapper; @@ -27,19 +28,20 @@ import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.TeamInfoMapper; import com.zhgd.xmgl.modules.worker.service.IEnterpriseInfoService; import com.zhgd.xmgl.modules.worker.service.IUserEnterpriseService; +import com.zhgd.xmgl.modules.xz.service.impl.XzSupplierQualificationApplyServiceImpl; +import com.zhgd.xmgl.security.entity.UserInfo; +import com.zhgd.xmgl.security.util.SecurityUtils; import com.zhgd.xmgl.util.ListUtils; import com.zhgd.xmgl.util.MessageUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * @Description: 劳务公司 @@ -68,6 +70,10 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl getEnterpriseInfoList(Map map) { @@ -78,7 +84,28 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl list = enterpriseInfoMapper.getEnterpriseInfoList(map); + if (systemUserService.isSupplier()) { + return getSupplierEnterprises(list); + } else { + return list; + } + } + + @NotNull + public List getSupplierEnterprises(List list) { + UserInfo user = SecurityUtils.getUser(); + EnterpriseInfo info = xzSupplierQualificationApplyService.getSupplierInfoByUserId(user.getUserId()); + Optional optional = list.stream().filter(entityMap -> entityMap.get("id").equals(info.getId().toString())).findFirst(); + if (!optional.isPresent()) { + return new ArrayList<>(); + } + EntityMap infoMap = optional.get(); + List childrenAsList = ListUtils.getChildrenAsList(infoMap, list, "id", "parentEnterpriseId"); + ArrayList rtList = new ArrayList<>(); + rtList.add(infoMap); + rtList.addAll(childrenAsList); + return list; } @Override @@ -226,8 +253,25 @@ public class EnterpriseInfoServiceImpl extends ServiceImpl list = enterpriseInfoMapper.getEnterpriseInfoList(map); - JSONArray result = ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(list)), "id", "parentEnterpriseId", "children"); - return result; + if (systemUserService.isSupplier()) { + UserInfo user = SecurityUtils.getUser(); + EnterpriseInfo info = xzSupplierQualificationApplyService.getSupplierInfoByUserId(user.getUserId()); + Optional optional = list.stream().filter(entityMap -> entityMap.get("id").equals(info.getId().toString())).findFirst(); + if (!optional.isPresent()) { + return new JSONArray(); + } + EntityMap infoMap = optional.get(); + List childrenAsList = ListUtils.getChildrenAsList(infoMap, list, "id", "parentEnterpriseId"); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(infoMap); + for (EntityMap entityMap : childrenAsList) { + jsonArray.add(entityMap); + } + return ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(jsonArray)), "id", "parentEnterpriseId", "children"); + } else { + JSONArray result = ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(list)), "id", "parentEnterpriseId", "children"); + return result; + } } @Override diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/TeamInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/TeamInfoServiceImpl.java index 30ad7deab..720e053ca 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/TeamInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/TeamInfoServiceImpl.java @@ -11,6 +11,7 @@ import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.async.AsyncJiLianDa; import com.zhgd.xmgl.async.AsyncWorker; +import com.zhgd.xmgl.modules.basicdata.service.impl.SystemUserServiceImpl; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; import com.zhgd.xmgl.modules.worker.entity.TeamInfo; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; @@ -29,10 +30,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; /** * @Description: 人员班组 @@ -43,6 +42,10 @@ import java.util.UUID; @Service @Transactional(rollbackFor = Exception.class) public class TeamInfoServiceImpl extends ServiceImpl implements ITeamInfoService { + @Autowired + private EnterpriseInfoServiceImpl enterpriseInfoService; + @Autowired + private SystemUserServiceImpl systemUserService; @Autowired private WorkerTypeMapper workerTypeMapper; @Autowired @@ -88,7 +91,17 @@ public class TeamInfoServiceImpl extends ServiceImpl i @Override public Map getTeamInfoList(Map map) { Map data = new HashMap<>(); - List list = teamInfoMapper.getTeamInfoList(map); + List list = new ArrayList<>(); + if (systemUserService.isSupplier()) { + List enterpriseInfoList = enterpriseInfoMapper.getEnterpriseInfoList(map); + List enterprises = enterpriseInfoService.getSupplierEnterprises(enterpriseInfoList); + if (CollUtil.isNotEmpty(enterprises)) { + map.put("enterpriseIds", enterprises.stream().map(entityMap -> entityMap.get("id")).collect(Collectors.toList())); + list = teamInfoMapper.getTeamInfoList(map); + } + } else { + list = teamInfoMapper.getTeamInfoList(map); + } data.put("list", list); int totalWorkerNum = 0; for (TeamInfo teamInfo : list) { diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzRegistryServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzRegistryServiceImpl.java index db67ea90a..5ef1caffe 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzRegistryServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzRegistryServiceImpl.java @@ -1,7 +1,6 @@ package com.zhgd.xmgl.modules.xz.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -168,28 +167,29 @@ public class XzRegistryServiceImpl extends ServiceImpl() - .eq(SystemUser::getAccount, xz.getAccount())); - if (su != null) { - return; - } String projectSns = r.getProjectSns(); String companySns = r.getCompanySns(); if (StringUtils.isBlank(projectSns) && StringUtils.isBlank(companySns)) { throw new OpenAlertException("审核通过的projectSns和companySns不能同时为空"); } - SystemUser systemUser = new SystemUser(); - systemUser.setAccount(xz.getAccount()); - systemUser.setPassword(xz.getPw()); - systemUser.setRealName(xz.getAccount()); - systemUser.setAccountType(10); - systemUser.setHeadquartersSn(null);//无关 + SystemUser su = systemUserMapper.selectOne(new LambdaQueryWrapper() + .eq(SystemUser::getAccount, xz.getAccount())); Long userId = null; - try { - userId = systemUserService.saveSystemUser(systemUser); - } catch (DuplicateKeyException e) { - e.printStackTrace(); - return; + if (su == null) { + SystemUser systemUser = new SystemUser(); + systemUser.setAccount(xz.getAccount()); + systemUser.setPassword(xz.getPw()); + systemUser.setRealName(xz.getAccount()); + systemUser.setAccountType(10); + systemUser.setHeadquartersSn(null);//无关 + try { + userId = systemUserService.saveSystemUser(systemUser); + } catch (DuplicateKeyException e) { + e.printStackTrace(); + return; + } + } else { + userId = su.getUserId(); } //处理组织权限 HashMap map = new HashMap<>(); diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java index 482b49e8b..9e1a40bbc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java @@ -16,7 +16,10 @@ import com.zhgd.xmgl.modules.basicdata.entity.XzSystemUserToCompanyProject; import com.zhgd.xmgl.modules.basicdata.mapper.CompanyMapper; import com.zhgd.xmgl.modules.basicdata.mapper.XzSystemUserToCompanyProjectMapper; import com.zhgd.xmgl.modules.basicdata.service.impl.CompanyServiceImpl; +import com.zhgd.xmgl.modules.project.entity.ProjectEnterprise; +import com.zhgd.xmgl.modules.project.mapper.ProjectEnterpriseMapper; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; +import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualification; import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualificationApply; import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualificationRecord; @@ -29,6 +32,7 @@ import com.zhgd.xmgl.modules.xz.service.IXzSupplierQualificationApplyService; import com.zhgd.xmgl.util.PageUtil; import com.zhgd.xmgl.util.RefUtil; import org.apache.commons.collections.MapUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +51,8 @@ public class XzSupplierQualificationApplyServiceImpl extends ServiceImpl queryPageList(HashMap paramMap) { @@ -116,7 +124,7 @@ public class XzSupplierQualificationApplyServiceImpl extends ServiceImpl projectSnList = new HashSet<>(); projectSnList.add(projectSn); @@ -140,10 +148,30 @@ public class XzSupplierQualificationApplyServiceImpl extends ServiceImpl eiMap = new HashMap<>(); + eiMap.put("userId", applyUserId); + EnterpriseInfo ei = enterpriseInfoMapper.getXzSupplierByUserId(eiMap); + if (ei == null) { + throw new OpenAlertException("请先填写供应商信息"); + } + return ei; + } + @Override public void delete(String id) { XzSupplierQualificationApply xzSupplierQualificationApply = baseMapper.selectById(id); diff --git a/src/main/java/com/zhgd/xmgl/util/ListUtils.java b/src/main/java/com/zhgd/xmgl/util/ListUtils.java index 33d5d48bb..bf5957fcc 100644 --- a/src/main/java/com/zhgd/xmgl/util/ListUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ListUtils.java @@ -1,7 +1,19 @@ package com.zhgd.xmgl.util; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.zhgd.jeecg.common.mybatis.EntityMap; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @program: wisdomSite @@ -14,8 +26,9 @@ public class ListUtils { /** * 数据归类 - * @param arr 需要归类的数据 - * @param id 本数据和父级关联的字段名 + * + * @param arr 需要归类的数据 + * @param id 本数据和父级关联的字段名 * @param pid 父级的字段名 * @param child 归类的的集合存放的字段 * @return @@ -52,9 +65,181 @@ public class ListUtils { hashVP.put(child, ch); } } else { + if (arr.size() == 1) { + aVal.put(child, new JSONArray()); + } r.add(aVal); } } return r; } + + + /** + * 通过Map方式构建树 + * + * @param list 列表 + * @return {@link List}<{@link T}> + */ + public static List buildTreeByMap(List list) { + return buildTreeByMap(list, "id", "parentId", "children", "0"); + } + + /** + * 通过Map方式构建树 + * + * @param list 列表 + * @param idName id名称 + * @param parentIdName 父id名称 + * @param childrenName 子节点列表名称 + * @param topParentIdVal 顶层节点父id的值 + * @return {@link List}<{@link T}> + */ + public static List buildTreeByMap(List list, String idName, String parentIdName, String childrenName, Object topParentIdVal) { + if (StringUtils.isBlank(idName) || StringUtils.isBlank(parentIdName) || StringUtils.isBlank(childrenName)) { + return new ArrayList<>(); + } + //根据parentId进行分组 + Map> mapList = list.stream().collect(Collectors.groupingBy(o -> getFieldValue(o, parentIdName).toString())); + //给每个节点设置子节点列表 + list.forEach(node -> setFieldValue(node, mapList.get(getFieldValue(node, idName).toString()), childrenName)); + return list.stream().filter(o -> topParentIdVal.equals(getFieldValue(o, parentIdName))).collect(Collectors.toList()); + } + + /** + * 获取属性值 + * + * @param o 对象 + * @param fieldName 属性名 + * @return {@link String} + */ + private static Object getFieldValue(Object o, String fieldName) { + try { + if (o instanceof EntityMap) { + return ((EntityMap) o).get(fieldName); + } else { + Class oClass = o.getClass(); + Field field = oClass.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(o); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + /** + * 设置字段值 + * + * @param o 对象 + * @param val 值 + * @param fieldName 属性名 + */ + private static void setFieldValue(Object o, Object val, String fieldName) { + try { + if (o instanceof EntityMap) { + ((EntityMap) o).put(fieldName, val); + } else { + Class oClass = o.getClass(); + Field field = oClass.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(o, val); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + + /** + * 递归查询该节点的子节点列表(不包含自己) + * + * @param root 该节点 + * @param allList 所有节点列表 + */ + public static List getChildrenAsList(T root, List allList, String idName, String parentIdName) { + List list = new ArrayList<>(); + List childrenList = allList.stream() + .filter(m -> Objects.equals(getFieldValue(m, parentIdName), getFieldValue(root, idName))) + .peek(m -> list.addAll(getChildrenAsList(m, allList, idName, parentIdName))) + .collect(Collectors.toList()); + list.addAll(childrenList); + return list; + } + + /** + * 递归查询当前节点的子节点列表(包含自己) + * + * @param curNode + * @param rsList 返回结果 + * @param idName + * @param parentIdName + * @param childrenName + * @param topParentIdVal + */ + public static void reversionTreeToList(T curNode, List rsList, String idName, String parentIdName, String childrenName, String topParentIdVal) { + Class aClass = (Class) curNode.getClass(); + rsList.add(BeanUtil.toBean(curNode, aClass)); + List subCityList = (List) getFieldValue(curNode, childrenName); + if (subCityList != null && !subCityList.isEmpty()) { + for (T city : subCityList) { //递归寻找子节点的子节点们 + reversionTreeToList(city, rsList, idName, parentIdName, childrenName, topParentIdVal); + } + } + } + + /** + * tree转list + * + * @param treeList + * @param idName + * @param parentIdName + * @param childrenName + * @param topParentIdVal + */ + public static List treeToList(List treeList, String idName, String parentIdName, String childrenName, String topParentIdVal) { + List list = new ArrayList<>(); + //这一层for的目的是:遍历根节点 + for (T t : treeList) { + reversionTreeToList(t, list, idName, parentIdName, childrenName, topParentIdVal); + } + for (T t : list) { + setFieldValue(t, null, childrenName); + } + return list; + } + + /** + * 查询当前节点的祖级节点列表(不包含自己) + * + * @param allList 所有节点列表 + * @param id 该节点id的值 + * @param idName + * @param parentIdName + * @param childrenName + * @param topParentIdVal + * @param + * @return + */ + public static List getParentList(List allList, Object id, String idName, String parentIdName, String childrenName, String topParentIdVal) { + List rsList = new ArrayList<>(); + if (CollUtil.isEmpty(allList)) { + return rsList; + } + Map idMap = allList.stream().collect(Collectors.toMap(o -> getFieldValue(o, idName), Function.identity())); + T t = idMap.get(id); + if (t == null) { + return rsList; + } + T p = idMap.get(getFieldValue(t, parentIdName)); + while (p != null) { + rsList.add(p); + p = idMap.get(getFieldValue(p, parentIdName)); + } + for (T t1 : rsList) { + setFieldValue(t1, null, childrenName); + } + return rsList; + } + } diff --git a/src/main/java/com/zhgd/xmgl/util/TreeUtil.java b/src/main/java/com/zhgd/xmgl/util/TreeUtil.java deleted file mode 100644 index 2ad698413..000000000 --- a/src/main/java/com/zhgd/xmgl/util/TreeUtil.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.zhgd.xmgl.util; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import org.apache.commons.lang3.StringUtils; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; - - -/** - * 构建Tree - */ -public class TreeUtil { - - /** - * 通过Map方式构建树 - * - * @param list 列表 - * @return {@link List}<{@link T}> - */ - public static List buildTreeByMap(List list) { - return buildTreeByMap(list, "id", "parentId", "children", "0"); - } - - /** - * 通过Map方式构建树 - * - * @param list 列表 - * @param idName id名称 - * @param parentIdName 父id名称 - * @param childrenName 子节点列表名称 - * @param topParentIdVal 顶层节点父id的值 - * @return {@link List}<{@link T}> - */ - public static List buildTreeByMap(List list, String idName, String parentIdName, String childrenName, Object topParentIdVal) { - if (StringUtils.isBlank(idName) || StringUtils.isBlank(parentIdName) || StringUtils.isBlank(childrenName)) { - return new ArrayList<>(); - } - //根据parentId进行分组 - Map> mapList = list.stream().collect(Collectors.groupingBy(o -> getFieldValue(o, parentIdName).toString())); - //给每个节点设置子节点列表 - list.forEach(node -> setFieldValue(node, mapList.get(getFieldValue(node, idName).toString()), childrenName)); - return list.stream().filter(o -> topParentIdVal.equals(getFieldValue(o, parentIdName))).collect(Collectors.toList()); - } - - /** - * 获取属性值 - * - * @param o 对象 - * @param fieldName 属性名 - * @return {@link String} - */ - private static Object getFieldValue(Object o, String fieldName) { - try { - Class oClass = o.getClass(); - Field field = oClass.getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(o); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - /** - * 设置字段值 - * - * @param o 对象 - * @param val 值 - * @param fieldName 属性名 - */ - private static void setFieldValue(Object o, Object val, String fieldName) { - try { - Class oClass = o.getClass(); - Field field = oClass.getDeclaredField(fieldName); - field.setAccessible(true); - field.set(o, val); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - - /** - * 递归查询该节点的子节点列表(不包含自己) - * - * @param root 该节点 - * @param allList 所有节点列表 - */ - public static List getChildrenAsList(T root, List allList, String idName, String parentIdName, String childrenName, String topParentIdVal) { - List list = new ArrayList<>(); - List childrenList = allList.stream() - .filter(m -> Objects.equals(getFieldValue(m, parentIdName), getFieldValue(root, idName))) - .peek(m -> list.addAll(getChildrenAsList(m, allList, idName, parentIdName, childrenName, topParentIdVal))) - .collect(Collectors.toList()); - list.addAll(childrenList); - return list; - } - - /** - * 递归查询当前节点的子节点列表(包含自己) - * - * @param curNode - * @param rsList 返回结果 - * @param idName - * @param parentIdName - * @param childrenName - * @param topParentIdVal - */ - public static void reversionTreeToList(T curNode, List rsList, String idName, String parentIdName, String childrenName, String topParentIdVal) { - Class aClass = (Class) curNode.getClass(); - rsList.add(BeanUtil.toBean(curNode, aClass)); - List subCityList = (List) getFieldValue(curNode, childrenName); - if (subCityList != null && !subCityList.isEmpty()) { - for (T city : subCityList) { //递归寻找子节点的子节点们 - reversionTreeToList(city, rsList, idName, parentIdName, childrenName, topParentIdVal); - } - } - } - - /** - * tree转list - * - * @param treeList - * @param idName - * @param parentIdName - * @param childrenName - * @param topParentIdVal - */ - public static List treeToList(List treeList, String idName, String parentIdName, String childrenName, String topParentIdVal) { - List list = new ArrayList<>(); - //这一层for的目的是:遍历根节点 - for (T t : treeList) { - reversionTreeToList(t, list, idName, parentIdName, childrenName, topParentIdVal); - } - for (T t : list) { - setFieldValue(t, null, childrenName); - } - return list; - } - - /** - * 查询当前节点的祖级节点列表(不包含自己) - * - * @param allList 所有节点列表 - * @param id 该节点id的值 - * @param idName - * @param parentIdName - * @param childrenName - * @param topParentIdVal - * @param - * @return - */ - public static List getParentList(List allList, Object id, String idName, String parentIdName, String childrenName, String topParentIdVal) { - List rsList = new ArrayList<>(); - if (CollUtil.isEmpty(allList)) { - return rsList; - } - Map idMap = allList.stream().collect(Collectors.toMap(o -> getFieldValue(o, idName), Function.identity())); - T t = idMap.get(id); - if (t == null) { - return rsList; - } - T p = idMap.get(getFieldValue(t, parentIdName)); - while (p != null) { - rsList.add(p); - p = idMap.get(getFieldValue(p, parentIdName)); - } - for (T t1 : rsList) { - setFieldValue(t1, null, childrenName); - } - return rsList; - } - - -}