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<T> {
|
|
public interface QueryWrapperBuilder<T> {
|
QueryWrapper<T> build(ReportQueryRequest request);
|
}
|
|
public interface RecordLoader<T> {
|
List<T> list(QueryWrapper<T> queryWrapper);
|
|
IPage<T> page(Page<T> page, QueryWrapper<T> queryWrapper);
|
|
default void afterLoad(List<T> records) {
|
}
|
}
|
|
private final QueryWrapperBuilder<T> queryWrapperBuilder;
|
private final RecordLoader<T> recordLoader;
|
|
public ListReportSupport(QueryWrapperBuilder<T> queryWrapperBuilder, RecordLoader<T> recordLoader) {
|
this.queryWrapperBuilder = queryWrapperBuilder;
|
this.recordLoader = recordLoader;
|
}
|
|
public List<T> queryRecords(ReportQueryRequest request) {
|
List<T> records = recordLoader.list(queryWrapperBuilder.build(request));
|
recordLoader.afterLoad(records);
|
return records;
|
}
|
|
public ReportQueryResponse<T> queryPage(ReportQueryRequest request) {
|
Page<T> page = new Page<>(
|
Math.max(request.getCurrent(), 1L),
|
Math.max(request.getPageSize(), 1L)
|
);
|
IPage<T> result = recordLoader.page(page, queryWrapperBuilder.build(request));
|
recordLoader.afterLoad(result.getRecords());
|
|
ReportQueryResponse<T> 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<ExcelUtil.ColumnMeta> toExcelColumns(List<ReportColumnMeta> columns) {
|
if (columns == null || columns.isEmpty()) {
|
return Collections.emptyList();
|
}
|
|
List<ExcelUtil.ColumnMeta> 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]);
|
}
|
}
|
}
|