package com.zy.asrs.wcs.common.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.domain.QueryField; import com.zy.asrs.framework.domain.QueryType; import com.zy.asrs.wcs.utils.Utils; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.Map; /** * Created by vincent on 2/13/2024 */ public class PageParam extends Page { private static final long serialVersionUID = 1L; private final U where; /** * 是否把字段名称驼峰转下划线 */ private final boolean isToUnderlineCase; public PageParam() { this(null); } public PageParam(U where) { this(where, true); } public PageParam(U where, boolean isToUnderlineCase) { super(); this.where = where; this.isToUnderlineCase = isToUnderlineCase; if (where != null) { if (where.getCurrent() != null) { setCurrent(where.getCurrent()); } if (where.getPageSize() != null) { setSize(where.getPageSize()); } } } /** * @param excludes 不包含的字段 */ public QueryWrapper getWrapper(String... excludes) { return buildWrapper(null, Arrays.asList(excludes)); } /** * @param columns 只包含的字段 */ public QueryWrapper getWrapperWith(String... columns) { return buildWrapper(Arrays.asList(columns), null); } private QueryWrapper buildWrapper(List columns, List excludes) { QueryWrapper queryWrapper = new QueryWrapper<>(); Map map = Cools.conver(where); for (String fieldName : map.keySet()) { Object fieldValue = map.get(fieldName); Field field = Cools.getField(where.getClass(), fieldName); assert field != null; // 过滤不包含的字段 if (columns != null && !columns.contains(fieldName)) { continue; } // 过滤排除的字段 if (excludes != null && excludes.contains(fieldName)) { continue; } // 过滤逻辑删除字段 if (field.getAnnotation(TableLogic.class) != null) { continue; } // 过滤租户id字段 if (fieldName.equals("hostId")) { continue; } // 获取注解指定的查询字段及查询方式 QueryType queryType = QueryType.LIKE; QueryField queryField = field.getAnnotation(QueryField.class); if (queryField != null) { if (!Cools.isEmpty(queryField.value())) { fieldName = queryField.value(); } queryField.type(); queryType = queryField.type(); } else { // 过滤非本表的字段 TableField tableField = field.getAnnotation(TableField.class); if (tableField != null && !tableField.exist()) { continue; } } // 字段名驼峰转下划线 if (this.isToUnderlineCase) { fieldName = Utils.toSymbolCase(fieldName, '_'); } switch (queryType) { case EQ: queryWrapper.eq(fieldName, fieldValue); break; case NE: queryWrapper.ne(fieldName, fieldValue); break; case GT: queryWrapper.gt(fieldName, fieldValue); break; case GE: queryWrapper.ge(fieldName, fieldValue); break; case LT: queryWrapper.lt(fieldName, fieldValue); break; case LE: queryWrapper.le(fieldName, fieldValue); break; case LIKE: queryWrapper.like(fieldName, fieldValue); break; case NOT_LIKE: queryWrapper.notLike(fieldName, fieldValue); break; case LIKE_LEFT: queryWrapper.likeLeft(fieldName, fieldValue); break; case LIKE_RIGHT: queryWrapper.likeRight(fieldName, fieldValue); break; case IS_NULL: queryWrapper.isNull(fieldName); break; case IS_NOT_NULL: queryWrapper.isNotNull(fieldName); break; case IN: queryWrapper.in(fieldName, fieldValue); break; case NOT_IN: queryWrapper.notIn(fieldName, fieldValue); break; case IN_STR: if (fieldValue instanceof String) { queryWrapper.in(fieldName, Arrays.asList(((String) fieldValue).split(","))); } break; case NOT_IN_STR: if (fieldValue instanceof String) { queryWrapper.notIn(fieldName, Arrays.asList(((String) fieldValue).split(","))); } break; } } return queryWrapper; } }