(记录贴)java后端---树形结构点击节点出现相关统计信息
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(记录贴)java后端---树形结构点击节点出现相关统计信息相关的知识,希望对你有一定的参考价值。
前言
这个我觉得写的还挺有趣记录一下,本来两礼拜前就写完了对应功能,但是突然被通知叫去出差,耽搁了两礼拜。原型图如下
注:原型图只是初稿,且不涉及真实数据,均为自己编的测试数据
功能描述:要求将相关人员分为总路长、路长、专管员、巡查员,总路长为最上级,某条路的总负责人,而每个路长下面又有专管员和巡查员,专管员和巡查员分别负责管理和巡查道路,点击对应节点,如点击路长李四就会出现对应的统计信息
该功能可以归纳解决两个问题:
1、关系树 2、点击对应树的节点出现对应的统计信息
解决问题一: 路长从属关系树
这个用的是之前用过的方法:链接
因为不用分页,所以用的是链接中的方法一
解决问题二: 路长及其下属巡查统计
这个就是点击某个人员,然后显示他对应的统计信息
对应Controller中的代码
1、首先通过点击的相关人员id查询到对应的用户,没有则报用户不存在的异常
2、用户是总路长(parent_id=0)则直接获取其下属的id,然后通过id遍历每个人信息进行统计,其中queryStatisticalInfo()是核心,后面会贴出来,查询到对应的信息封装成一个VO,然后想加统计出总的结果,就可以直接返回
大致思路就是这样
@GetMapping("/queryStatisticalInfo")
@ApiOperation(value = "路长及其下属巡查统计", notes = "路长及其下属巡查统计")
@ApiImplicitParam(paramType="query", name = "userId", value = "用户id", required = true, dataType = "long")
public ResultMsg queryStatisticalInfo(long userId){
//userId对应用户
SysUser sysUser = SysUserDbTool.getMapper().selectById(userId);
Assert.notNull(sysUser,"该用户不存在!!!");
if (sysUser.getParentId()==0){
//直接返回总路长的数据,总路长唯一,其parentId为0
//先找出除路长以外的巡查和养护员id
List<Long> ids = SysUserDbTool.getMapper().queryWorkerId();
Integer patrolNumTotal=0; //总日常巡查数量
Integer maintainNumTotal=0; //总保养(养护)巡查数量
Integer eventReportNumTotal=0; //总事件上报数量
Integer dealFinishTotal=0; //总处理完成数量
//遍历统计总数量
for (Long id : ids){
RoadMasterStatisticalVO bigMasterStatisticalVO = SysUserDbTool.getMapper().queryStatisticalInfo(id);
patrolNumTotal += bigMasterStatisticalVO.getPatrolNum();
maintainNumTotal += bigMasterStatisticalVO.getMaintainNum();
eventReportNumTotal += bigMasterStatisticalVO.getEventReportNum();
dealFinishTotal += bigMasterStatisticalVO.getDealFinish();
}
RoadMasterStatisticalVO bigMasterStatisticalResult = new RoadMasterStatisticalVO(sysUser.getId(),sysUser.getRealName(),patrolNumTotal,maintainNumTotal,eventReportNumTotal,dealFinishTotal);
return ResultMsg.success(bigMasterStatisticalResult);
}
//userId的用户是否是普通站长
List<SysUser> childs = SysUserDbTool.getMapper().selectChilds(userId);
//有孩子(有下属),则将孩子对应数据做一个统计(累加)
if (childs.size()!=0){
Integer patrolNum=0; //日常巡查数量
Integer maintainNum=0; //保养(养护)巡查数量
Integer eventReportNum=0; //事件上报数量
Integer dealFinish=0; //处理完成数量
for (SysUser child : childs) {
RoadMasterStatisticalVO roadMasterStatisticalVO = SysUserDbTool.getMapper().queryStatisticalInfo(child.getId());
//将下属的数据做一个累加
patrolNum += roadMasterStatisticalVO.getPatrolNum();
maintainNum += roadMasterStatisticalVO.getMaintainNum();
eventReportNum += roadMasterStatisticalVO.getEventReportNum();
dealFinish += roadMasterStatisticalVO.getDealFinish();
}
//将累加完毕的值设置回roadMasterStatisticalVO,从而统计出其父类(路长)
RoadMasterStatisticalVO roadMasterStatisticalVOTotal = new RoadMasterStatisticalVO();
roadMasterStatisticalVOTotal.setId(sysUser.getId());
roadMasterStatisticalVOTotal.setRealName(sysUser.getRealName());
roadMasterStatisticalVOTotal.setPatrolNum(patrolNum);
roadMasterStatisticalVOTotal.setMaintainNum(maintainNum);
roadMasterStatisticalVOTotal.setEventReportNum(eventReportNum);
roadMasterStatisticalVOTotal.setDealFinish(dealFinish);
//返回
return ResultMsg.success(roadMasterStatisticalVOTotal);
}else{
//没有孩子,则直接查自己的数据,如巡查员就是最下层级的,没有下属
RoadMasterStatisticalVO roadMasterStatisticalVO = SysUserDbTool.getMapper().queryStatisticalInfo(userId);
return ResultMsg.success(roadMasterStatisticalVO);
}
}
下面是查统计信息,因为涉及多张表,所以采用一个一个嵌套查询
<!--统计接口-->
<select id="queryStatisticalInfo" resultType="com.vkl.dao.vo.road.master.RoadMasterStatisticalVO">
select e.id,e.real_name,e.patrol_num,e.maintain_num,count(ree.person_id) event_report_num,count(if(ree.issolve=1,true,null)) deal_finish
from
(select t.id,t.real_name,t.patrol_num,count(t.id) maintain_num
from
(select u.id,u.real_name,count(1) patrol_num
from sys_user u
left join road_patrol_record rpr on rpr.patrol_person_id = u.id
where u.id = #{userId} and rpr.report_time is not null
) as t
left join road_maintain_record rmr on rmr.maintain_person_id = t.id
where rmr.report_time is not null
) as e
left join road_event_emergency ree on ree.person_id=e.id
</select>
解释上面查询:
1、首先是查询出用户信息以及日常巡查数,然后将其看成一张表,这张表的字段是id,real_name,patrol_num
select u.id,u.real_name,count(1) patrol_num
from sys_user u
left join road_patrol_record rpr on rpr.patrol_person_id = u.id
where u.id = #{userId} and rpr.report_time is not null
2、然后你把刚刚的看成一张表,假如叫表A,from 表A,然后再和其它表连接,这样同理,就能查出对应的统计信息了,有时看需求还可以用一下IF聚合函数if(ree.issolve=1,true,null)
表示只要已解决的
select t.id,t.real_name,t.patrol_num,count(t.id) maintain_num
from
(select u.id,u.real_name,count(1) patrol_num
from sys_user u
left join road_patrol_record rpr on rpr.patrol_person_id = u.id
where u.id = #{userId} and rpr.report_time is not null
) as t
left join road_maintain_record rmr on rmr.maintain_person_id = t.id
where rmr.report_time is not null
以上就是实现对应功能的思路及代码
以上是关于(记录贴)java后端---树形结构点击节点出现相关统计信息的主要内容,如果未能解决你的问题,请参考以下文章
左右值树形结构移动节点方法(modified preorder tree traversal move node)
左右值树形结构移动节点方法(modified preorder tree traversal move node)