package com.vincent.rsf.server.common.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.common.utils.Utils; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.DateUtils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.*; import java.util.function.Consumer; /** * Created by vincent on 2/13/2024 */ public class PageParam extends Page { private static final long serialVersionUID = 1L; public static final String ORDER_DESC_VALUE = "desc"; private final U where; /** * 是否把字段名称驼峰转下划线 */ private final boolean isToUnderlineCase; private final Class cls; public PageParam() { this(null); } public PageParam(U where) { this(where, true); } public PageParam(U where, Class cls) { this(where, true, cls); } public PageParam(U where, boolean isToUnderlineCase) { this(where, isToUnderlineCase, null); } public PageParam(U where, boolean isToUnderlineCase, Class cls) { super(); this.where = where; this.isToUnderlineCase = isToUnderlineCase; this.cls = cls; if (where != null) { if (where.getCurrent() != null) { setCurrent(where.getCurrent()); } if (where.getPageSize() != null) { setSize(where.getPageSize()); } } } public QueryWrapper buildWrapper(boolean like) { return this.buildWrapper(like, null, "create_time"); } public QueryWrapper buildWrapper(boolean like, String timeField) { return this.buildWrapper(like, null, timeField); } public QueryWrapper buildWrapper(boolean like, List fields) { return this.buildWrapper(like, null,"create_time", fields); } @SuppressWarnings("all") public QueryWrapper buildWrapper(boolean like, Consumer> consumer, String timeField) { QueryWrapper queryWrapper = new QueryWrapper<>(); Map map = where.getMap(); for (String key : map.keySet()) { Object val = map.get(key); if (key.contains("Range")) { ArrayList list = null; if (val instanceof ArrayList) { list = (ArrayList) val; } if (null != list) { key = key.replaceAll("Range", ""); if (this.isToUnderlineCase) { key = Utils.toSymbolCase(key, '_'); } queryWrapper.ge(key, DateUtils.convert(list.get(0))); queryWrapper.le(key, DateUtils.convert(list.get(1))); } } else { if (this.isToUnderlineCase) { key = Utils.toSymbolCase(key, '_'); } if (like && key.contains(timeField)) { queryWrapper.like("`" + key + "`", val); } else { queryWrapper.eq("`" + key + "`", val); } } } if (null != consumer) { consumer.accept(queryWrapper); } if (!Cools.isEmpty(where.getTimeStart())) { Date timeStart = DateUtils.convert(String.valueOf(where.getTimeStart()), DateUtils.yyyyMMdd_F); queryWrapper.ge(timeField, timeStart); } if (!Cools.isEmpty(where.getTimeEnd())) { Date timeStart = DateUtils.convert(String.valueOf(where.getTimeEnd()), DateUtils.yyyyMMdd_F); queryWrapper.le(timeField, timeStart); } if (!Cools.isEmpty(where.getOrderBy())) { if (sortIsSQL(where.getOrderBy())) { setOrders(parseOrderSQL(where.getOrderBy())); } } else { // queryWrapper.orderByDesc("create_time"); } if (!Cools.isEmpty(where.getCondition()) && !Cools.isEmpty(cls)) { List columns = new ArrayList<>(); for (Field field : Cools.getAllFields(cls)){ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())){ continue; } if (field.isAnnotationPresent(TableField.class)){ TableField annotation = field.getAnnotation(TableField.class); if (!annotation.exist()) { continue; } } String column = Utils.toSymbolCase(field.getName(), '_'); columns.add(column); } if (!columns.isEmpty()) { for (int i=0;i wrapper.like("`" + column + "`", condition)); } else { queryWrapper.or().like("`" + column + "`", condition); } } } } return queryWrapper; } @SuppressWarnings("all") public QueryWrapper buildWrapper(boolean like, Consumer> consumer,String timeField, List fields) { QueryWrapper queryWrapper = new QueryWrapper<>(); Map map = where.getMap(); for (String key : map.keySet()) { Object val = map.get(key); if (key.contains("Range")) { ArrayList list = null; if (val instanceof ArrayList) { list = (ArrayList) val; } if (null != list) { key = key.replaceAll("Range", ""); if (this.isToUnderlineCase) { key = Utils.toSymbolCase(key, '_'); } queryWrapper.ge(key, DateUtils.convert(list.get(0))); queryWrapper.le(key, DateUtils.convert(list.get(1))); } } else { if (this.isToUnderlineCase) { key = Utils.toSymbolCase(key, '_'); } if (like && !fields.contains(key)) { queryWrapper.like("`" + key + "`", val); } else { queryWrapper.eq("`" + key + "`", val); } } } if (null != consumer) { consumer.accept(queryWrapper); } if (!Cools.isEmpty(where.getTimeStart())) { Date timeStart = DateUtils.convert(String.valueOf(where.getTimeStart()), DateUtils.yyyyMMdd_F); queryWrapper.ge(timeField, timeStart); } if (!Cools.isEmpty(where.getTimeEnd())) { Date timeStart = DateUtils.convert(String.valueOf(where.getTimeEnd()), DateUtils.yyyyMMdd_F); queryWrapper.le(timeField, timeStart); } if (!Cools.isEmpty(where.getOrderBy())) { if (sortIsSQL(where.getOrderBy())) { setOrders(parseOrderSQL(where.getOrderBy())); } } else { // queryWrapper.orderByDesc("create_time"); } if (!Cools.isEmpty(where.getCondition()) && !Cools.isEmpty(cls)) { List columns = new ArrayList<>(); for (Field field : Cools.getAllFields(cls)){ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())){ continue; } if (field.isAnnotationPresent(TableField.class)){ TableField annotation = field.getAnnotation(TableField.class); if (!annotation.exist()) { continue; } } String column = Utils.toSymbolCase(field.getName(), '_'); columns.add(column); } if (!columns.isEmpty()) { for (int i=0;i wrapper.like("`" + column + "`", condition)); } else { queryWrapper.or().like("`" + column + "`", condition); } } } } return queryWrapper; } private boolean sortIsSQL(String sort) { return sort != null && (sort.contains(",") || sort.trim().contains(" ")); } private List parseOrderSQL(String orderSQL) { List orders = new ArrayList<>(); if (!Cools.isEmpty(orderSQL)) { for (String item : orderSQL.split(",")) { String[] temp = item.trim().split(" "); if (!temp[0].isEmpty()) { String column = this.isToUnderlineCase ? Utils.toSymbolCase(temp[0], '_') : temp[0]; boolean asc = temp.length == 1 || !temp[temp.length - 1].toLowerCase().equals(ORDER_DESC_VALUE); orders.add(new OrderItem(column, asc)); } } } return orders; } public Map checkoutMap() { Map map = where.getMap(); if (!Cools.isEmpty(where.getOrderBy())) { map.put("orderBy", where.getOrderBy()); } if (!Cools.isEmpty(where.getTimeStart())) { map.put("timeStart", DateUtils.convert(String.valueOf(where.getTimeStart()), DateUtils.yyyyMMdd_F)); } if (!Cools.isEmpty(where.getTimeEnd())) { map.put("timeEnd", DateUtils.convert(String.valueOf(where.getTimeEnd()), DateUtils.yyyyMMdd_F)); } if (!Cools.isEmpty(where.getCondition())) { map.put("condition", where.getCondition()); } return map; } }