树形查询

该博客介绍了如何根据关键字`filter`和`version`来执行树形查询。首先,它会利用关键字从数据库中检索完整数据列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* 根据关键字检索查询
*
* @param filter
* @return
*/
public List cascadeQueryByKeyWords(PreSaleRiskQueryVo filter, String version) {
//根据inputValue关键字先将整个表查出来
List templateList = queryTemplateByKeyWords(filter, version);

	List<PreSaleRiskVo> fillVos = fillAllMpData(filter.getProjectCode(), templateList, version);
	List<PreSaleRiskVo> groupSortVos = groupAndSortListData(fillVos);

	return groupSortVos;
}



/**
 * 补齐数据
 * 1. 分为Level1,Level2,Level3三级
 * 2. 如果只有Level3,那么需要查询Level2和Level1
 * 3. 如果只有Level1,那么需要查询出所有子节点 :Level2和Level3
 *
 * @param projectCode
 * @param oriMps
 * @return
 */
private List<PreSaleRiskVo> fillAllMpData(String projectCode, List<PreSaleRiskVo> oriMps, String version) {
	//找出所有的Level1,查询所有子节点
	Map<String, PreSaleRiskVo> partMap = Maps.newHashMap();
	Map<Integer, PreSaleRiskVo> idMap = Maps.newHashMap();
	for (PreSaleRiskVo mp : oriMps) {
		idMap.put(mp.getId(), mp);
		if (BaseEnums.ItemLevel.Level1.name().equals(mp.getItemLevel())) {
			PreSaleRiskVo partMp = partMap.get(mp.getPart());

			String partKey = createLevel1Key(mp);

			if (partMp == null) {
				partMap.put(partKey, mp);
			}
		}
	}

	//找出所有的Level2,查询父节点和所有的子节点
	Map<String, PreSaleRiskVo> typeMap = Maps.newHashMap();
	for (PreSaleRiskVo mp : oriMps) {
		if (BaseEnums.ItemLevel.Level2.name().equals(mp.getItemLevel())) {
			//判断是否在已存在的Level1下
			if (partMap.get(createLevel1Key(mp)) != null) {
				continue;
			}

			String partTypeKey = createLevel2Key(mp);
			PreSaleRiskVo typeMp = typeMap.get(partTypeKey);
			if (typeMp == null) {
				typeMap.put(partTypeKey, mp);
			}
		}
	}

	//找出所有的Level3,查询父节点
	Map<String, PreSaleRiskVo> itemMap = Maps.newHashMap();
	for (PreSaleRiskVo mp : oriMps) {
		if (BaseEnums.ItemLevel.Level3.name().equals(mp.getItemLevel())) {
			//判断是否在已存在的Level1下
			if (partMap.get(createLevel1Key(mp)) != null) {
				continue;
			}

			//判断是否在已存在的Level2下
			if (typeMap.get(createLevel2Key(mp)) != null) {
				continue;
			}

			String level3Key = createLevel3Key(mp);
			PreSaleRiskVo itemMp = itemMap.get(level3Key);
			if (itemMp == null) {
				itemMap.put(level3Key, mp);
			}
		}
	}

	//构造Level1查询参数
	List<PreSaleRiskVo> queryList = Lists.newArrayList();
	Set<String> partKeys = partMap.keySet();
	for (String partKey : partKeys) {
		PreSaleRiskVo mp = partMap.get(partKey);

		PreSaleRiskVo queryMp = new PreSaleRiskVo();
		queryMp.setProjectCode(projectCode);
		queryMp.setPart(mp.getPart());
		queryList.add(queryMp);
	}

	//构造Level2查询参数
	Set<String> typeKeys = typeMap.keySet();
	for (String typeKey : typeKeys) {
		PreSaleRiskVo mp = typeMap.get(typeKey);

		//查询所有子节点
		PreSaleRiskVo queryMp = new PreSaleRiskVo();
		queryMp.setProjectCode(projectCode);
		queryMp.setPart(mp.getPart());
		queryMp.setType(mp.getType());
		queryList.add(queryMp);

		//查询父节点
		PreSaleRiskVo queryParentMp = new PreSaleRiskVo();
		queryParentMp.setProjectCode(projectCode);
		queryParentMp.setPart(mp.getPart());
		queryParentMp.setItemLevel(BaseEnums.ItemLevel.Level1.name());
		queryList.add(queryParentMp);
	}

	//构造Level3查询参数
	Set<String> level3Keys = itemMap.keySet();
	for (String level3Key : level3Keys) {
		PreSaleRiskVo mp = itemMap.get(level3Key);

		//查询父节点
		PreSaleRiskVo queryMp = new PreSaleRiskVo();
		queryMp.setProjectCode(projectCode);
		queryMp.setPart(mp.getPart());
		queryMp.setType(mp.getType());
		queryMp.setItemLevel(BaseEnums.ItemLevel.Level2.name());
		queryList.add(queryMp);

		//查询祖父节点
		PreSaleRiskVo queryParentMp = new PreSaleRiskVo();
		queryParentMp.setProjectCode(projectCode);
		queryParentMp.setPart(mp.getPart());
		queryParentMp.setItemLevel(BaseEnums.ItemLevel.Level1.name());
		queryList.add(queryParentMp);
	}

	List<PreSaleRiskVo> selectList;
	if (isCurrentVer(version)) {
		selectList = selectByPartTypeItemBatch(projectCode, queryList);
	} else {
		selectList = selectByPartTypeItemBatchVersion(projectCode, version, queryList);
	}

	selectList.addAll(itemMap.values());
	return selectList;
}





/**
 * 对数据按照ItemLevel的等级进行分组排序
 *
 * @param datas 原始数据
 * @return 分组和排序后的数据
 */
private List<PreSaleRiskVo> groupAndSortListData(List<PreSaleRiskVo> datas) {
	List<PreSaleRiskVo> mpVOs = Lists.newArrayList();

	Ordering<PreSaleRiskVo> orderingMp = Ordering.natural().nullsLast().onResultOf(new Function<PreSaleRiskVo, Comparable<Integer>>() {
		public Integer apply(PreSaleRiskVo mp) {
			return mp.getSeq();
		}
	});


	//对Level3分组
	Map<String, List<PreSaleRiskVo>> itemsMap = Maps.newHashMap();
	for (PreSaleRiskVo vo : datas) {
		if (BaseEnums.ItemLevel.Level3.name().equals(vo.getItemLevel())) {
			String level2Key = createLevel2Key(vo);
			List<PreSaleRiskVo> list = itemsMap.get(level2Key);
			if (list == null) {
				list = Lists.newArrayList();
				itemsMap.put(level2Key, list);
			}

			list.add(vo);
		}
	}

	//对Level2分组
	Map<String, List<PreSaleRiskVo>> typesMap = Maps.newHashMap();
	for (PreSaleRiskVo vo : datas) {
		if (BaseEnums.ItemLevel.Level2.name().equals(vo.getItemLevel())) {


			//获取Level3
			String level2Key = createLevel2Key(vo);
			List<PreSaleRiskVo> children = itemsMap.get(level2Key);
			if (children != null) {
				Collections.sort(children, orderingMp);
				vo.setChildren(children);
			}

			String level1Key = createLevel1Key(vo);
			List<PreSaleRiskVo> list = typesMap.get(level1Key);
			if (list == null) {
				list = Lists.newArrayList();
				typesMap.put(level1Key, list);
			}

			list.add(vo);
		}
	}

	Calendar calendar = Calendar.getInstance();
	calendar.getTimeInMillis();

	//对Level1填充数据
	for (PreSaleRiskVo vo : datas) {
		if (BaseEnums.ItemLevel.Level1.name().equals(vo.getItemLevel())) {
			//获取Level2
			List<PreSaleRiskVo> children = typesMap.get(createLevel1Key(vo));
			if (children != null) {
				Collections.sort(children, orderingMp);
				vo.setChildren(children);
			}

			mpVOs.add(vo);
		}
	}

	Collections.sort(mpVOs, orderingMp);

	return mpVOs;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值