package com.vincent.rsf.server.common.support.report; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.server.common.domain.report.ReportColumnMeta; import com.vincent.rsf.server.common.domain.report.ReportMeta; import com.vincent.rsf.server.common.domain.report.ReportQueryRequest; import com.vincent.rsf.server.common.domain.report.ReportQueryResponse; import com.vincent.rsf.server.common.utils.ExcelUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ListReportSupport { public interface QueryWrapperBuilder { QueryWrapper build(ReportQueryRequest request); } public interface RecordLoader { List list(QueryWrapper queryWrapper); IPage page(Page page, QueryWrapper queryWrapper); default void afterLoad(List records) { } } private final QueryWrapperBuilder queryWrapperBuilder; private final RecordLoader recordLoader; public ListReportSupport(QueryWrapperBuilder queryWrapperBuilder, RecordLoader recordLoader) { this.queryWrapperBuilder = queryWrapperBuilder; this.recordLoader = recordLoader; } public List queryRecords(ReportQueryRequest request) { List records = recordLoader.list(queryWrapperBuilder.build(request)); recordLoader.afterLoad(records); return records; } public ReportQueryResponse queryPage(ReportQueryRequest request) { Page page = new Page<>( Math.max(request.getCurrent(), 1L), Math.max(request.getPageSize(), 1L) ); IPage result = recordLoader.page(page, queryWrapperBuilder.build(request)); recordLoader.afterLoad(result.getRecords()); ReportQueryResponse response = new ReportQueryResponse<>(); response.setRecords(result.getRecords()); response.setTotal(result.getTotal()); response.setCurrent(result.getCurrent()); response.setPageSize(result.getSize()); response.setPages(result.getPages()); return response; } public static List toExcelColumns(List columns) { if (columns == null || columns.isEmpty()) { return Collections.emptyList(); } List excelColumns = new ArrayList<>(); for (ReportColumnMeta column : columns) { if (column == null || Cools.isEmpty(column.getSource())) { continue; } excelColumns.add(new ExcelUtil.ColumnMeta() .setKey(column.getKey()) .setSource(column.getSource()) .setLabel(column.getLabel()) .setExtendField(Boolean.TRUE.equals(column.getIsExtendField()))); } return excelColumns; } public static ExcelUtil.ReportMeta toExcelReportMeta(ReportMeta reportMeta) { if (reportMeta == null) { return null; } return new ExcelUtil.ReportMeta() .setTitle(reportMeta.getTitle()) .setCompanyName(reportMeta.getCompanyName()) .setPrintedBy(reportMeta.getPrintedBy()) .setReportDate(reportMeta.getReportDate()) .setReportDateValue(reportMeta.getReportDateValue()); } public static void applyOrderBy(QueryWrapper queryWrapper, String orderBy) { if (Cools.isEmpty(orderBy)) { return; } for (String item : orderBy.split(",")) { String[] temp = item.trim().split(" "); if (temp.length == 0 || Cools.isEmpty(temp[0])) { continue; } boolean asc = temp.length == 1 || !"desc".equalsIgnoreCase(temp[temp.length - 1]); queryWrapper.orderBy(true, asc, temp[0]); } } }