分页查询对象代码结构优化

wxpay
LI-CCONG\李聪聪 8 months ago
parent e8371e66c1
commit 06ed8f422a

@ -2,6 +2,7 @@ package cc.yunxi.common.domain;
import cc.yunxi.common.domain.function.SFunction;
import cc.yunxi.common.utils.LambdaUtil;
import cc.yunxi.common.utils.ObjTypeUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableField;
@ -10,14 +11,13 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;
@ -27,7 +27,7 @@ import java.util.stream.Collectors;
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageQuery {
public class PageQuery<T> {
public static final Integer DEFAULT_PAGE_SIZE = 20;
public static final Integer DEFAULT_PAGE_NUM = 1;
@ApiModelProperty(value = "页码", required = false, example = "1")
@ -39,18 +39,44 @@ public class PageQuery {
private Integer pageSize = DEFAULT_PAGE_SIZE;
@ApiModelProperty(value = "排序规则", required = false)
@Setter(AccessLevel.NONE)
private LinkedHashSet<SortingField> sortingFields;
@ApiModelProperty(value = "设置排序字段", hidden = true)
@Setter(AccessLevel.NONE)
private List<OrderItem> orderItems = new ArrayList<>(10);
// 忽略构建排序
public <T> Page<T> getPage() {
return Page.of(pageNo, pageSize);
// 添加排序规则
public PageQuery<T> addOrderItem(SFunction<T> orderByFuc) {
return this.addOrderItem(orderByFuc, true);
}
public PageQuery<T> addOrderItem(SFunction<T> orderByFuc, boolean isAsc) {
OrderItem orderItem = new OrderItem();
Class<?> clazz = LambdaUtil.getClazz(orderByFuc);
String fieldName = LambdaUtil.getFieldName(orderByFuc);
try {
Field field = clazz.getDeclaredField(fieldName);
TableField annotation = field.getAnnotation(TableField.class);
if (annotation != null) {
orderItem.setColumn(annotation.value());
} else {
String column = StringUtils.camelToUnderline(fieldName);
orderItem.setColumn(column);
}
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
orderItem.setAsc(isAsc);
return this;
}
// 构建分页排序
public <T> Page<T> buildPage(Class<?> clazz, OrderItem... orderItems) {
public Page<T> buildPage() {
Page<T> page = Page.of(pageNo, pageSize);
// 前端排序规则
Class<?> classT = ObjTypeUtil.getClassT(this, 0);
// 前端传入排序规则
if (!CollectionUtil.isEmpty(sortingFields)) {
// 防sql注入字段判断
List<OrderItem> orderItemList = sortingFields.stream().filter(sortingField -> {
@ -59,7 +85,7 @@ public class PageQuery {
if (StrUtil.isBlank(field)) {
return false;
}
clazz.getDeclaredField(field);
classT.getDeclaredField(field);
return true;
} catch (NoSuchFieldException e) {
return false;
@ -72,48 +98,20 @@ public class PageQuery {
}).collect(Collectors.toList());
page.addOrder(orderItemList);
}
// 手动指定排序规则
if (orderItems != null && orderItems.length > 0) {
// 设置指定排序规则
for (OrderItem orderItem : orderItems) {
page.addOrder(orderItem);
}
}
return page;
}
public <T> Page<T> buildPageByDefaultOrder(Class<?> clazz, String defaultSortBy, boolean isAsc) {
OrderItem orderItem = new OrderItem();
orderItem.setAsc(isAsc);
orderItem.setColumn(StringUtils.camelToUnderline(defaultSortBy));
return buildPage(clazz, orderItem);
}
public <T> Page<T> buildPageByDefaultOrder(SFunction<T> defaultSortByFuc, boolean isAsc) {
OrderItem orderItem = new OrderItem();
Class<?> clazz = LambdaUtil.getClazz(defaultSortByFuc);
String fieldName = LambdaUtil.getFieldName(defaultSortByFuc);
try {
Field field = clazz.getDeclaredField(fieldName);
TableField annotation = field.getAnnotation(TableField.class);
if (annotation != null) {
orderItem.setColumn(annotation.value());
} else {
String column = StringUtils.camelToUnderline(fieldName);
orderItem.setColumn(column);
}
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
orderItem.setAsc(isAsc);
return buildPage(clazz, orderItem);
}
@Data
@ApiModel(description = "排序规则")
public static class SortingField implements Serializable {
private static final long serialVersionUID = -1;
/**
* -
*/

@ -1,8 +1,8 @@
package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.po.ClientAccountDetail;
import cc.yunxi.enums.BalanceChangeTypeEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -13,7 +13,7 @@ import java.time.LocalDateTime;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "ClientAccountQuery", description = "散户余额明细查询条件")
public class ClientAccountQuery extends PageQuery {
public class ClientAccountQuery extends PageQuery<ClientAccountDetail> {
@ApiModelProperty(value = "散户ID", hidden = true, example = "1763507031581421570")
private String clientId;

@ -1,6 +1,7 @@
package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.po.Client;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -9,7 +10,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "ClientQuery", description = "散户查询条件")
public class ClientQuery extends PageQuery {
public class ClientQuery extends PageQuery<Client> {
@ApiModelProperty("联系电话")
private String mobilePhone;

@ -2,6 +2,7 @@ package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.UserTypeEnum;
import io.swagger.annotations.ApiModel;
@ -14,7 +15,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@ApiModel(value = "RecycleOrderQuery", description = "回收订单查询条件")
public class RecycleOrderQuery extends PageQuery {
public class RecycleOrderQuery extends PageQuery<RecycleOrder> {
@ApiModelProperty(value = "订单编号", required = false, example = "1234567890")
private String id;

@ -2,6 +2,7 @@ package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.RecycleStation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -11,7 +12,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "RecycleStationQuery", description = "回收站查询条件")
public class RecycleStationQuery extends PageQuery {
public class RecycleStationQuery extends PageQuery<RecycleStation> {
@ApiModelProperty(value = "回收站id", required = false, example = "519071906947663877")
private String stationId;

@ -1,6 +1,7 @@
package cc.yunxi.domain.query;
import cc.yunxi.common.domain.PageQuery;
import cc.yunxi.domain.po.Recycler;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -9,7 +10,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "RecycleQuery", description = "回收员查询条件")
public class RecyclerQuery extends PageQuery {
public class RecyclerQuery extends PageQuery<Recycler> {
@ApiModelProperty("所属回收站")
private String stationId;

@ -45,14 +45,10 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
@Override
public Page<Client> queryClientByPage(ClientQuery clientQuery) {
QueryWrapper<Client> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(StrUtil.isNotEmpty(clientQuery.getMobilePhone()), Client::getMobilePhone, clientQuery.getMobilePhone());
// Page<Recycler> recyclerPage = page(
// recyclerQuery.buildPageByDefaultOrder(Recycler.class, "goodTotal", true), wrapper);
Page<Client> clientPage = this.page(
clientQuery.buildPageByDefaultOrder(Client::getCreatorTime, true), wrapper);
return clientPage;
LambdaQueryWrapperX<Client> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eqIfPresent(Client::getMobilePhone, clientQuery.getMobilePhone());
Page<Client> pageDO = clientQuery.addOrderItem(Client::getCreatorTime).buildPage();
return this.page(pageDO, wrapperX);
}
@Override
@ -106,9 +102,8 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
.eqIfPresent(ClientAccountDetail::getChangeType, clientAccountQuery.getChangeType())
.betweenIfPresent(ClientAccountDetail::getCreatorTime, clientAccountQuery.getDateRange())
.orderByDesc(ClientAccountDetail::getCreatorTime);
Page<ClientAccountDetail> clientAccountDetailPage = accountDetailMapper.selectPage(
clientAccountQuery.getPage(), wrapperX);
return clientAccountDetailPage;
Page<ClientAccountDetail> pageDO = clientAccountQuery.addOrderItem(ClientAccountDetail::getCreatorTime).buildPage();
return accountDetailMapper.selectPage(pageDO, wrapperX);
}

@ -68,9 +68,8 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
wrapper.eq(true, RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
}
wrapper.eq(StrUtil.isNotEmpty(recycleOrderQuery.getId()), RecycleOrder::getId, recycleOrderQuery.getId());
Page<RecycleOrder> recycleOrderPage = page(
recycleOrderQuery.buildPageByDefaultOrder(RecycleOrder::getCreatorTime, true), wrapper);
return recycleOrderPage;
Page<RecycleOrder> pageDO = recycleOrderQuery.addOrderItem(RecycleOrder::getCreatorTime).buildPage();
return page(pageDO, wrapper);
}
public RecycleOrder getOrderById(String id) {

@ -1,6 +1,8 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.po.RecycleStation;
import cc.yunxi.domain.query.RecycleOrderQuery;
@ -34,13 +36,10 @@ public class RecycleStationServiceImpl extends ServiceImpl<RecycleStationMapper,
public Page<RecycleStation> queryStationByPage(RecycleStationQuery recycleStationQuery) {
LambdaQueryWrapper<RecycleStation> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StrUtil.isNotEmpty(recycleStationQuery.getStationName()),
RecycleStation::getStationName, recycleStationQuery.getStationName());
// Page<RecycleStation> page = recycleStationQuery.buildPage(RecycleStation.class);
Page<RecycleStation> page = recycleStationQuery.buildPageByDefaultOrder(RecycleStation::getCreatorTime, false);
Page<RecycleStation> recycleStationPage = recycleStationMapper.queryStationByPage(recycleStationQuery.getLocation(), page, wrapper);
return recycleStationPage;
LambdaQueryWrapperX<RecycleStation> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eqIfPresent(RecycleStation::getStationName, recycleStationQuery.getStationName());
Page<RecycleStation> pageDO = recycleStationQuery.addOrderItem(RecycleStation::getCreatorTime, false).buildPage();
return recycleStationMapper.queryStationByPage(recycleStationQuery.getLocation(), pageDO, wrapperX);
}

@ -1,9 +1,11 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.common.exception.DbException;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.po.ClientAccountDetail;
import cc.yunxi.domain.po.Recycler;
import cc.yunxi.domain.query.RecyclerQuery;
import cc.yunxi.domain.vo.client.ClientUpdateVO;
@ -33,16 +35,12 @@ public class RecyclerServiceImpl extends ServiceImpl<RecyclerMapper, Recycler> i
@Override
public Page<Recycler> queryRecyclerByPage(RecyclerQuery recyclerQuery) {
QueryWrapper<Recycler> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(StrUtil.isNotEmpty(recyclerQuery.getStationId()), Recycler::getStationId, recyclerQuery.getStationId())
.eq(StrUtil.isNotEmpty(recyclerQuery.getMobilePhone()), Recycler::getMobilePhone, recyclerQuery.getMobilePhone())
.like(StrUtil.isNotEmpty(recyclerQuery.getStaffsName()), Recycler::getStaffsName, recyclerQuery.getStaffsName());
// Page<Recycler> recyclerPage = page(
// recyclerQuery.buildPageByDefaultOrder(Recycler.class, "goodTotal", true), wrapper);
Page<Recycler> recyclerPage = page(
recyclerQuery.buildPageByDefaultOrder(Recycler::getOrderTotal, true), wrapper);
return recyclerPage;
LambdaQueryWrapperX<Recycler> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eqIfPresent(Recycler::getStationId, recyclerQuery.getStationId())
.eqIfPresent(Recycler::getMobilePhone, recyclerQuery.getMobilePhone())
.likeIfPresent(Recycler::getStaffsName, recyclerQuery.getStaffsName());
Page<Recycler> pageDO = recyclerQuery.addOrderItem(Recycler::getOrderTotal, true).buildPage();
return page(pageDO, wrapperX);
}
@Override

Loading…
Cancel
Save