package com.vincent.rsf.server.common.domain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Map;
/**
* 通用游标分页参数。
*
*
这个类在现有 {@link BaseParam} 的基础上只增加一个 {@code cursor} 字段,
* 用来表示“下一页从哪里继续查”。
*
* 当前项目里的普通分页接口大多还是 {@code current + pageSize} 模式,
* 但游标分页只依赖:
*
* - {@code pageSize}:每页大小
* - {@code cursor}:上一页最后一条记录的游标值
*
*
* 这里仍然继承 {@link BaseParam},目的是继续复用原有的:
*
* - 筛选条件解析
* - {@code condition / timeStart / timeEnd} 等通用参数
* - 和 {@link com.vincent.rsf.server.common.domain.PageParam} 的协作能力
*
*
* 注意:前端即使继续传 {@code current},这里也不会报错;
* {@link BaseParam#syncMap(Map)} 会正常解析它,但后续通用游标分页逻辑不会使用它。
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CursorPageParam extends BaseParam {
/**
* 当前页的起始游标。
*
* 约定含义是:只查询“比这个游标更旧”的数据,
* 例如按 {@code id desc} 翻页时,会生成 {@code id < cursor} 的条件。
*/
private Long cursor;
@Override
public void syncMap(Map map) {
// 先复用 BaseParam 的通用参数解析能力,
// 保证 pageSize、condition、timeStart、timeEnd 等字段照常工作。
super.syncMap(map);
if (map == null) {
return;
}
Object cursorValue = map.get("cursor");
if (cursorValue == null) {
return;
}
String normalizedValue = String.valueOf(cursorValue).trim();
if (normalizedValue.isEmpty()) {
// 空字符串游标等价于“首屏没有游标”,这里直接移除,避免后续误参与 SQL。
map.remove("cursor");
return;
}
// 目前通用方案统一把游标约束为 Long,
// 这样可以覆盖当前按主键/数字字段倒序翻页的业务场景。
this.cursor = Long.parseLong(normalizedValue);
// 解析完成后要从 map 中移除,避免 PageParam.buildWrapper(true)
// 把 cursor 当成普通筛选字段再次拼进 where 条件。
map.remove("cursor");
}
}