zhou zhou
8 小时以前 6e5ff559023efd2d24fdca2adcb7268d06420e46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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]);
        }
    }
}