业务场景
正常业务场景下,在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都写一遍。