ruoyi对数据二次处理后分页失效

业务场景

正常业务场景下,在service层只做一次查询就能满足需求,若需要分页,只需在Controller层添加继承BaseController,使用startPage()和getDataTable()即可。业务需求存在需要对查询的数据做二次处理。

问题描述

业务需求存在需要对查询的数据做再加工处理,处理过后使用原来的分页时,分页就不对了,总条数total不对。

原因分析

ruoyi使用的是PageHelper分页,查询数据返回的list在开始时使用的startPage(),这个list会存入线程中,使用getDataTable()时new PageInfo(list)时这里的list变成了处理过的listTemp,与线程中的list不同了。

解决方案

1.controler中处理

⭐⭐⭐

public TableDataInfo list(BrhPurchaseOrderReportVo orderReportVo) {

PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        
        List<BrhPurchaseOrderReportVo> list = new ArrayList<>();
        //获取处理好的list集合
        int num = list.size();
        //处理list
        list = list.stream()..某些代码..collect(Collectors.toList());

        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setRows(list);
        rspData.setTotal(num);
        return rspData;
}

2.BaseController中处理

⭐⭐⭐⭐⭐

public class BaseController
{
    ...某些代码
    
    /**
     * 响应请求分页数据
     * 查询后重新处理list再返回时使用
     * @param listVO 处理过的list
     * @param list 未处理的list
     * by wuhb
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    protected TableDataInfo getDataTableNew(List<?> listVO, List<?> list)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(listVO);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
    }
    
    ...某些代码

}

使用

public TableDataInfo list(BrhPurchaseOrderReportVo orderReportVo) {
    startPage();
        //未处理的list
        List<MerPurchaseOrderReportVo> list = purchaseOrderReportService.getMerInfoList(orderReportVo);
        //二次处理过的list
        List<MerPurchaseOrderReportVo> listVo = purchaseOrderReportService.getMerOrderReportList(orderReportVo,list);
        return getDataTableNew(listVo,list);
}

总结

ruoyi框架的分页针对一般查询足够了,但对于需要处理的查询结果需要稍微调整下。这里推荐第2个解决方案,对代码没有侵入性且复用性高,不用每个controler都写一遍。

猜你喜欢

转载自blog.csdn.net/xieedeni/article/details/131303286