1. 程式人生 > 其它 >mybatis-plus查詢時間段內的報表(月報等)

mybatis-plus查詢時間段內的報表(月報等)

1.報表頻度

/**
 * 報表頻率
 *
 * @author wanghuidong
 * @date 2022/2/24 16:39
 */
public enum ReportFrequencyEnum {

    YEAR("year", "年"),

    MONTH("month", "月"),

    HALF_YEAR("half_year", "半年"),

    SEASON("season", "季");

    ReportFrequencyEnum(String code, String name) {
        this.code = code;
        
this.name = name; } private String code; private String name; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) {
this.name = name; } /** * 獲取指定code的報表頻率 * * @param code 報表頻率code * @return */ public static ReportFrequencyEnum codeOf(String code) { for (ReportFrequencyEnum reportFrequencyEnum : ReportFrequencyEnum.values()) { if (reportFrequencyEnum.getCode().equals(code)) {
return reportFrequencyEnum; } } return null; } }

 

2.報表時間

@Data
@ApiModel("報表時間")
public class ReportTime {

    @NotNull
    @ApiModelProperty("年")
    private Integer year;

    @ApiModelProperty("月(1-12)")
    private Integer month;

    @ApiModelProperty("季(1-4)")
    private Integer season;

    @ApiModelProperty("半年(上/下)")
    private String halfYear;
}

 

3.設定mybatis-plus的queryWrapper

/**
     * 設定queryWrapper的報表時間範圍
     *
     * <p>
     * 演算法邏輯示例:
     * 不跨年月報: 2022/2 - 2022/3
     * and year=2022 and month between 2 and 3
     * <p>
     * 跨年月報:2021/9 - 2023/4
     * and(
     * (year = 2021 and month >=9)
     * or
     * (year = 2022)
     * or
     * (year = 2023 and month <=4)
     * )
     *
     * @param queryWrapper  查詢條件包裝物件
     * @param frequencyEnum 報表頻度
     * @param beginTime     開始時間
     * @param endTime       結束時間
     */
    public static void setQueryWrapperTimePeriod(QueryWrapper<?> queryWrapper, ReportFrequencyEnum frequencyEnum, ReportTime beginTime, ReportTime endTime) {
        Integer startYear = beginTime.getYear();
        Integer endYear = endTime.getYear();
        boolean acrossYear = startYear.intValue() != endYear.intValue(); //是否跨年
        List<Integer> centerYears = new ArrayList<>(); //年之間間隔的年份
        for (int i = startYear + 1; i < endYear; i++) {
            centerYears.add(i);
        }
        switch (frequencyEnum) {
            case YEAR:
                queryWrapper.between("year", startYear, endYear);
                break;
            case MONTH:
                Integer startMonth = beginTime.getMonth();
                Integer endMonth = endTime.getMonth();
                if (acrossYear) {
                    queryWrapper.and(x ->
                            x.nested(x1 -> x1.eq("year", startYear).ge("month", startMonth))
                                    .or(CollUtil.isNotEmpty(centerYears), x2 -> x2.in("year", centerYears))
                                    .or(x3 -> x3.eq("year", endYear).le("month", endMonth))
                    );
                } else {
                    queryWrapper.eq("year", startYear).between("month", startMonth, endMonth);
                }
                break;
            case SEASON:
                Integer startSeason = beginTime.getSeason();
                Integer endSeason = endTime.getSeason();
                if (acrossYear) {
                    queryWrapper.and(x ->
                            x.nested(x1 -> x1.eq("year", startYear).ge("season", startSeason))
                                    .or(CollUtil.isNotEmpty(centerYears), x2 -> x2.in("year", centerYears))
                                    .or(x3 -> x3.eq("year", endYear).le("season", endSeason))
                    );
                } else {
                    queryWrapper.eq("year", startYear).between("season", startSeason, endSeason);
                }
                break;
            case HALF_YEAR:
                String startHalfYear = beginTime.getHalfYear();
                String endHalfYear = endTime.getHalfYear();
                List<String> startHalfYears = new ArrayList<>();
                startHalfYears.add(startHalfYear);
                if ("上".equals(startHalfYear)) {
                    startHalfYears.add("下");
                }
                List<String> endHalfYears = new ArrayList<>();
                endHalfYears.add(endHalfYear);
                if ("下".equals(endHalfYear)) {
                    endHalfYears.add("上");
                }
                if (acrossYear) {
                    queryWrapper.and(x ->
                            x.nested(x1 -> x1.eq("year", startYear).in("half_year", startHalfYears))
                                    .or(CollUtil.isNotEmpty(centerYears), x2 -> x2.in("year", centerYears))
                                    .or(x3 -> x3.eq("year", endYear).in("half_year", endHalfYears))
                    );
                } else {
                    List<String> halfYears = Arrays.asList(startHalfYear, endHalfYear);
                    halfYears = halfYears.stream().distinct().collect(Collectors.toList());
                    queryWrapper.eq("year", startYear).in("half_year", halfYears);
                }
                break;
        }
    }

 

4.查詢資料

        QueryWrapper<WarnTargetData> queryWrapper = new QueryWrapper<>();
        //select指定欄位,查詢指定指標
        queryWrapper.select(this.getSelectField(queryParams.getTargetIds()));
        //查詢指定業務模組
        queryWrapper.eq("business", businessEnum.getCode());
        queryWrapper.eq("frequency", queryParams.getFrequency());
        if (CollUtil.isNotEmpty(queryParams.getOrgIds())) {
            queryWrapper.in("org_id", queryParams.getOrgIds());
        }

        //指定查詢時間
        ReportUtil.setQueryWrapperTimePeriod(queryWrapper, frequencyEnum, queryParams.getBeginTime(), queryParams.getEndTime());
        IPage<WarnTargetData> page = warnTargetDataService.page(new Page<>(queryParams.getCurrent(), queryParams.getSize()), queryWrapper);