(记录贴)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后端---树形结构点击节点出现相关统计信息的主要内容,如果未能解决你的问题,请参考以下文章

(记录贴)java后台实现树形菜单+分页返回数据

antd vue tree树形结构问题记录

左右值树形结构移动节点方法(modified preorder tree traversal move node)

左右值树形结构移动节点方法(modified preorder tree traversal move node)

左右值树形结构移动节点方法(modified preorder tree traversal move node)

左右值树形结构移动节点方法(modified preorder tree traversal move node)