/**
* 根据关键字检索查询
*
* @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;
}