企业表 ent_EnterpriseArchives 有id,企业名称 entName
veh_Vehicle 车辆表,有所属企业id companyId,车辆id,车牌号licPlate
目的是查询企业和车辆的树状结果。如下图,然后返回前端。
执行如下sql得到的结果是:【根据车牌号或者企业名称模糊查询】
SELECT
ent_EnterpriseArchives.id entId,
ent_EnterpriseArchives.entName entName,
veh_Vehicle.id vehId,
veh_Vehicle.licPlate vehPlate
from ent_EnterpriseArchives
JOIN veh_Vehicle
on ent_EnterpriseArchives.id = veh_Vehicle.companyId
where ent_EnterpriseArchives.`status` = 1
and veh_Vehicle.`status` = 1
and (
ent_EnterpriseArchives.entName like '%杭州%' or veh_Vehicle.licPlate like '%杭州%'
)
ORDER BY ent_EnterpriseArchives.id
【上述数据结果为造的假数据】
所以要对这个sql的查询结果进行去重公司名称,返回前端树状结果。下面的代码即为处理过程:
public ResponseList enterpriseVehicleTree(String paramName, HttpSession session) {
ResponseList response = new ResponseList();
List<Map<String,List<VehVehicleVO>>> resultList = new ArrayList<Map<String,List<VehVehicleVO>>>();
if(paramName == null) {
paramName = ConstantUtil.EMPTYSTRING;
}
try {
List<EnterpriseVehicleTreeVO> tempRes = baseMapper.enterpriseVehicleTree(paramName);//上述sql的查询结果
if(tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
return response;
}
Integer tempEntId = null;
Map<String,List<VehVehicleVO>> tempMap = new HashMap<String, List<VehVehicleVO>>();
List<VehVehicleVO> tempListStr = new ArrayList<VehVehicleVO>();
for (int i = 0 ; i < tempRes.size(); i++) {
EnterpriseVehicleTreeVO enterpriseVehicleTreeVO = tempRes.get(i);
if(i == ConstantUtil.INTNUM0) {
//第一家公司
tempEntId = enterpriseVehicleTreeVO.getEntId();
tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
if((i+1) == tempRes.size()) {
resultList.add(tempMap);
break;
}
}else {
//还是同一家公司
if(tempEntId == enterpriseVehicleTreeVO.getEntId()) {
tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
if((i+1) == tempRes.size()) {
resultList.add(tempMap);
}
}else {
//新的公司,先处理上一个公司的数据
resultList.add(tempMap);
tempMap = null; //注意,这个地方不可以直接调用clear方法去清空,必须重新创建tempMap对象,否则后面的新数据就把之前已经存到list中的上个公司的数据给覆盖掉了
tempMap = new HashMap<String, List<VehVehicleVO>>();
tempListStr = null; //原因同上
tempListStr = new ArrayList<VehVehicleVO>();
tempEntId = enterpriseVehicleTreeVO.getEntId();
tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
if((i+1) == tempRes.size()) {
resultList.add(tempMap);
}
}
}
}
response.setObj(resultList);
} catch (Exception e) {
log.info("xxxxxxxxxxxxxxxxxxxxxx异常,==>e.getMessage:" + e.getMessage() + ",==>e.getStackTrace():" + e.getStackTrace()+ ",==>e:" + e);
response.setSuccess(false).setMsg("xxxxxxxxxxxxxxxxxxxxxxxxx异常");
}
return response;
}
最终效果:
{
"success": true,
"msg": "",
"obj": [
{
"杭州科大讯飞": [
{
"id": 13,
"licPlate": "豫QA3586"
},
{
"id": 14,
"licPlate": "豫QA3585"
},
{
"id": 12,
"licPlate": "豫QA3587"
}
]
},
{
"杭州网易": [
{
"id": 8,
"licPlate": "浙A36W52"
}
]
}
]
}
20190901, 今天整理博客,看到这篇文章,有必要进行补充说明:
其实对于这种需求,最好的方式是进行lambda表达式的使用。在项目中另外一处依旧有类似上述的需求,而且层级更深一层。企业、车牌号、设备号【每个车辆上有多个设备】,需求同上,依旧返回树形结构数据。我当时依然采用了上述方式。上述例子只有两层,实现起来的复杂度勉强能理解接受,下面的例子,自己都要写晕了,后来出现一个bug【计数器没加1】,自己排查都要痛苦死,逻辑太复杂了。经同事指导,决定重构,采用lambda表达式分组,实现起来代码逻辑大大简化。下面贴上代码,注释部分为改造前的旧方法。
代码中设计大量的封装实体类,可能不太好理解,其实只看每一层级分组的那部分代码即可,其它无非都是业务属性封装。
/**
* @since 2019-05-06
*/
@Service
@Slf4j
public class VehVideomonitorOnlineServiceImpl extends ServiceImpl<VehVideomonitorOnlineMapper, VehVideomonitorOnline> implements IVehVideomonitorOnlineService {
/**
* @author
* @createTime 2019年5月6日上午11:00:40
* @description 视频监控
* @param
* @return
*/
@Override
public ResponseList vedioMonitor(String paramName,AreaCodeParamDTO areaCodeHandleRes) {
ResponseList response = new ResponseList();
if (paramName == null) {
paramName = ConstantUtil.EMPTYSTRING;
}
try {
List<VedioMonitorVO> resultList = new ArrayList<VedioMonitorVO>(); //结果集合
List<VehVideoMonitorOnlineVO> tempRes = baseMapper.vedioMonitor(paramName,areaCodeHandleRes.getProvinceCode(),areaCodeHandleRes.getAreaCityCode(),areaCodeHandleRes.getAreaCode());
if (tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
return response;
}
//按照企业id进行分组
Map<Integer, List<VehVideoMonitorOnlineVO>> collectMapEnt = tempRes.stream().collect(Collectors.groupingBy(VehVideoMonitorOnlineVO::getEntId));
for (Map.Entry<Integer, List<VehVideoMonitorOnlineVO>> entry : collectMapEnt.entrySet()) {
Integer entId = entry.getKey();//企业id
List<VehVideoMonitorOnlineVO> groupByEntIdList = entry.getValue();//按照企业id分组后的每组数据
VedioMonitorVO entVo = new VedioMonitorVO();//结果对象实体 一级
entVo.setEntId(entId);
String entName = "";
List<MiddleVedioMonitorVO> middleList = new ArrayList<MiddleVedioMonitorVO>(); //【车辆信息】集合
if (groupByEntIdList != null && groupByEntIdList.size() > 0) {
//按照车辆id进行分组
Map<Integer, List<VehVideoMonitorOnlineVO>> collectMapVehicle = groupByEntIdList.stream().collect(Collectors.groupingBy(VehVideoMonitorOnlineVO::getVehicleId));
for (Map.Entry<Integer, List<VehVideoMonitorOnlineVO>> entryMid : collectMapVehicle.entrySet()) {
Integer vehicleId = entryMid.getKey();//车辆id
List<VehVideoMonitorOnlineVO> groupByVehicleIdList = entryMid.getValue();//按照车辆id分组后的每组数据
MiddleVedioMonitorVO vehVo = new MiddleVedioMonitorVO();//车辆对象实体 二级
vehVo.setVehicleId(vehicleId);
String licPlate = "";
List<VehVideomonitorOnline> lastList = new ArrayList<VehVideomonitorOnline>();//设备信息集合
if (groupByVehicleIdList != null && groupByVehicleIdList.size() > 0) {
for (VehVideoMonitorOnlineVO obj : groupByVehicleIdList) {
VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline();//设备对象实体 三级
vehVideomonitorOnline.setDevId(obj.getDevId());
vehVideomonitorOnline.setVideoUrl(obj.getVideoUrl());
vehVideomonitorOnline.setStatus(obj.getStatus());
vehVideomonitorOnline.setUrl(obj.getUrl());
vehVideomonitorOnline.setDevice(obj.getDevice());
vehVideomonitorOnline.setMfg(obj.getMfg());
vehVideomonitorOnline.setVehicleId(vehicleId);
lastList.add(vehVideomonitorOnline);
licPlate = obj.getLicPlate();
entName = obj.getEntName();
}
}
vehVo.setLicPlate(licPlate);
vehVo.setVehVideomonitorOnlineList(lastList);
middleList.add(vehVo);
}
}
entVo.setEntName(entName);
entVo.setMiddleList(middleList);
resultList.add(entVo);
}
response.setObj(resultList);
} catch (Exception e) {
log.info("视频监控信息查询异常,==>e:",e);
response.setSuccess(false).setMsg("视频监控信息查询异常");
}
return response;
}
// /**
// * @author
// * @createTime 2019年5月6日上午11:00:40
// * @description 视频监控
// * @param
// * @return
// */
// @Override
// public ResponseList vedioMonitor(String paramName,AreaCodeParamDTO areaCodeHandleRes) {
// ResponseList response = new ResponseList();
// if (paramName == null) {
// paramName = ConstantUtil.EMPTYSTRING;
// }
// try {
// List<VehVideoMonitorOnlineVO> tempRes = baseMapper.vedioMonitor(paramName,areaCodeHandleRes.getProvinceCode(),areaCodeHandleRes.getAreaCityCode(),areaCodeHandleRes.getAreaCode());
// if (tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
// return response;
// }
//
// int tempEntId = 0;//企业id临时变量
// int tempVehId = 0;//车辆id临时变量
// int vehNumber = 0;
// int entNumber = 0;
//
//
// MiddleVedioMonitorVO middleVedioMonitorVO = null;
// VedioMonitorVO vedioMonitorVO = null;
// List<VedioMonitorVO> resultList = new ArrayList<VedioMonitorVO>();
// List<MiddleVedioMonitorVO> middleList = new ArrayList<MiddleVedioMonitorVO>(); //【车辆信息】集合
// List<VehVideomonitorOnline> lastList = new ArrayList<VehVideomonitorOnline>();//【设备信息】集合
// for (int i = 0; i < tempRes.size(); i++) {
// VehVideoMonitorOnlineVO vehVideoMonitorOnlineVO = tempRes.get(i);
// if(i == ConstantUtil.INTNUM0) {
// //第一家公司
// tempEntId = vehVideoMonitorOnlineVO.getEntId(); //企业id给临时变量
// tempVehId = vehVideoMonitorOnlineVO.getVehicleId(); //车辆id给临时变量
//
// //【设备信息】
// VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
// lastList.add(vehVideomonitorOnline);
//
// //【车辆信息】
// middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
// middleList.add(middleVedioMonitorVO);
//
// //【结果信息】
// vedioMonitorVO = new VedioMonitorVO(vehVideoMonitorOnlineVO.getEntId(),vehVideoMonitorOnlineVO.getEntName(),middleList);
// resultList.add(vedioMonitorVO);
//
// }else {
// //还是同一家公司
// if(tempEntId == vehVideoMonitorOnlineVO.getEntId()) {
// VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
// //还是同一辆车
// if(tempVehId == vehVideoMonitorOnlineVO.getVehicleId()) {
// lastList.add(vehVideomonitorOnline);
// middleVedioMonitorVO.setVehVideomonitorOnlineList(lastList);
// if(vehNumber == 0) {
// //还是第一辆车
// middleList.clear();
// middleList.add(middleVedioMonitorVO);
// vedioMonitorVO.setMiddleList(middleList);
// resultList.clear();
// resultList.add(vedioMonitorVO);
// }else {
// //Iterator it = middleList.iterator();
// middleList.remove(vehNumber);
// middleList.add(middleVedioMonitorVO);
// vedioMonitorVO.setMiddleList(middleList);
// judgeResultListFunction(entNumber,resultList,vedioMonitorVO);
// }
// }else {
// //同一家公司的另一辆车
// vehNumber++;
// tempVehId = vehVideoMonitorOnlineVO.getVehicleId();
// lastList = null;
// lastList = new ArrayList<VehVideomonitorOnline>();
// lastList.add(vehVideomonitorOnline);
// middleVedioMonitorVO = null;
// middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
// middleList.add(middleVedioMonitorVO);
// vedioMonitorVO.setMiddleList(middleList);
// judgeResultListFunction(entNumber,resultList,vedioMonitorVO);
// }
// }else {
// //新的公司
// entNumber++;
// vehNumber = 0;
// tempEntId = vehVideoMonitorOnlineVO.getEntId();
// tempVehId = vehVideoMonitorOnlineVO.getVehicleId();
// VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
// lastList = null;
// lastList = new ArrayList<VehVideomonitorOnline>();
// lastList.add(vehVideomonitorOnline);
// middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
// middleList = null;
// middleList = new ArrayList<MiddleVedioMonitorVO>();
// middleList.add(middleVedioMonitorVO);
// vedioMonitorVO = new VedioMonitorVO(vehVideoMonitorOnlineVO.getEntId(),vehVideoMonitorOnlineVO.getEntName(),middleList);
// resultList.add(vedioMonitorVO);
// }
// }
// }
//
// response.setObj(resultList);
// } catch (Exception e) {
// log.info("视频监控信息查询异常,==>e:",e);
// response.setSuccess(false).setMsg("视频监控信息查询异常");
// }
// return response;
//
// }
//
public void judgeResultListFunction( int entNumber,List<VedioMonitorVO> resultList, VedioMonitorVO vedioMonitorVO ) {
if(entNumber == 0) {
//还是第一家公司
resultList.clear();
resultList.add(vedioMonitorVO);
}else {
//新的公司
resultList.remove(entNumber);
resultList.add(vedioMonitorVO);
}
}
}