mybatis-plus查詢時間段內的報表(月報等)
阿新 • • 發佈:2022-04-12
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);