通过aop和注解实现返回列表支持排序的字段;通过mybatis-plus的Page类的OrderItem属性进行排序

前言

通过aop和注解实现返回列表支持排序的字段;通过mybatis-plus的Page类的OrderItem属性进行排序

方案

序号 操作
1 通过aop和注解实现返回列表支持排序的字段
2 通过mybatis-plus的Page对象的OrderItem属性进行排序

类注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PageSort {

    /**
     * vo对应的类,包含可排序字段信息
     */
    Class<?> clazz();
}

字段注解

@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PageSortColumn {

    /**
     * 列名
     * 不填写的话默认取ApiModelProperty注解的value值
     */
    String value() default "";

    /**
     * 数据库排序字段
     * 注意:如果字段不是来自主表,则需添加查询中的别名前缀,如: ler.create_time
     * 不填写的话默认取 field->name并自动转化为下划线命名风格
     */
    String column() default "";
}

aop实现

@Component
@Aspect
@Slf4j
@RequiredArgsConstructor
public class PageSortAspect {

    /**
     * 配置切入点
     */
    @Pointcut("@annotation(com.zq.common.annotation.PageSort)")
    public void logPointcut() {
        // 该方法无方法体,主要为了让同类中其他方法使用此切入点
    }

    /**
     * 配置环绕通知,使用在方法logPointcut()上注册的切入点
     *
     * @param joinPoint
     * @return
     */
    @Around("logPointcut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        PageSort pageSort = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(PageSort.class);
//        handleQuery(pageSort, args, point);
        Object proceed = joinPoint.proceed();
        handleColumnInfo(pageSort, proceed);
        return proceed;
    }

    private void handleColumnInfo(PageSort pageSort, Object proceed) {
        try {
            if (proceed instanceof TableDataInfo) {
                TableDataInfo<?> res = (TableDataInfo<?>) proceed;
                Field[] fields = ReflectUtil.getFields(pageSort.clazz());
                List<BasePageColumnVO> columnList = new ArrayList<>();
                for (Field field : fields) {
                    BasePageColumnVO columnInfo = getColumnInfo(field);
                    if (columnInfo == null) {
                        continue;
                    }
                    columnList.add(columnInfo);
                }
                res.setSortable(columnList);
            }
        } catch (Exception e) {
            log.error("分页排序返回字段处理失败", e);
        }
    }

    private BasePageColumnVO getColumnInfo(Field field) {
        PageSortColumn sortColumn = field.getAnnotation(PageSortColumn.class);
        if (sortColumn == null) {
            return null;
        }
        String column = sortColumn.column();
        String value = sortColumn.value();
        if (StrUtil.isEmpty(sortColumn.column())) {
            column = StrUtil.toUnderlineCase(field.getName());
        }
        if (StrUtil.isEmpty(value)) {
            ApiModelProperty modelProperty = field.getAnnotation(ApiModelProperty.class);
            value = modelProperty.value();
        }
        return new BasePageColumnVO(field.getName(), value, column);
    }

}

测试

测试方法

@ApiOperation(value = "分页查询【支持自定义排序】")
@PostMapping("/pageByOrderItem")
@PageSort(clazz = MdAssemblyVO.class)
public TableDataInfo<MdAssemblyVO> pageByOrderItem(@RequestBody MdAssemblyPageQuery assemblyPageQuery) {
    TableDataInfo<MdAssemblyVO> tableDataInfo = assemblyService.pageByOrderItem(assemblyPageQuery);
    return tableDataInfo;
}

测试类

@Data
public class MdAssemblyVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "生产线ID")
    private Long assemblyId;

    @ApiModelProperty(value = "生产线编码")
    @PageSortColumn
    private String assemblyCode;

    @ApiModelProperty(value = "生产线名称")
    @PageSortColumn
    private String assemblyName;

    @ApiModelProperty(value = "是否启用")
    @PageSortColumn
    private String enableFlag;

    @ApiModelProperty(value = "车间ID")
    private Long workshopId;

    @ApiModelProperty(value = "车间编码")
    private String workshopCode;

    @ApiModelProperty(value = "车间名称")
    private String workshopName;

    @ApiModelProperty(value = "部门id")
    private Long deptId;

    @ApiModelProperty(value = "部门名称")
    private String deptName;

    @ApiModelProperty(value = "创建时间")
    @PageSortColumn
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @ApiModelProperty(value = "更新时间")
    @PageSortColumn
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

}

查询条件,MdAssemblyPageQuery类

@Data
@EqualsAndHashCode(callSuper = false)
public class MdAssemblyPageQuery extends BasePageQuery implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "关键词搜索")
    private String searchValue;

    @ApiModelProperty(value = "生产线ID")
    private Long assemblyId;

    @ApiModelProperty(value = "生产线IDS")
    private Set<Long> assemblyIds;

    @ApiModelProperty(value = "是否启用")
    private String enableFlag;

    @ApiModelProperty(value = "物料产品ID")
    private Long itemId;

    @ApiModelProperty(value = "工站ID")
    private Long workstationId;

}

查询条件基类,BasePageQuery类

@Data
@ApiModel
public class BasePageQuery {

    @ApiModelProperty(value = "页码", example = "1")
    protected Integer pageNum = 1;

    @ApiModelProperty(value = "每页记录数", example = "10")
    protected Integer pageSize = 10;

    @ApiModelProperty(value = "规则配置所需拼接sql", hidden = true)
    private String queryRuleSql;

    @ApiModelProperty(value = "排序字段")
    private List<OrderItem> orders;

    @ApiModelProperty(value = "关键词关联的主表ID", hidden = true)
    private Set<Long> keyIds;

    public <T> BasePageVO<T> page() {
        BasePageVO<T> basePage = new BasePageVO<>(pageNum, pageSize);
        if (CollectionUtil.isNotEmpty(orders)) {
            basePage.addOrder(orders);
        }
        return basePage;
    }
}

Page类的OrderItem属性

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 需要进行排序的字段
     */
    private String column;
    /**
     * 是否正序排列,默认 true
     */
    private boolean asc = true;

    public static OrderItem asc(String column) {
        return build(column, true);
    }

    public static OrderItem desc(String column) {
        return build(column, false);
    }

    public static List<OrderItem> ascs(String... columns) {
        return Arrays.stream(columns).map(OrderItem::asc).collect(Collectors.toList());
    }

    public static List<OrderItem> descs(String... columns) {
        return Arrays.stream(columns).map(OrderItem::desc).collect(Collectors.toList());
    }

    private static OrderItem build(String column, boolean asc) {
        return new OrderItem(column, asc);
    }
}
posted @ 2025-08-06 08:01  南翔技校毕业后  阅读(47)  评论(0)    收藏  举报