java实现置顶排序功能
warning:
这篇文章距离上次修改已过355天,其中的内容可能已经有所变动。
使用的是当前时间作为排序
默认是拿到上一个排序号减一作为当前排序的排序号,但是有可能会重复排序号
所以当前排序号后面的数据要顺延-1处理
@Override
public void topSort(String targetContentId) {
if (targetContentId.equals(this.getContentEntity().getId())) {
return; // 排序目标是自己直接返回
}
checkLock();
//上一条数据
CmsArticle prev = this.getArticleService().getById(targetContentId);
Long topFlag = prev.getTopFlag() - 1;
this.content.setTopFlag(topFlag);
//排序时间重复 则后面的数据顺延-1
LambdaQueryWrapper q = new LambdaQueryWrapper<CmsArticle>()
.eq(CmsArticle::getCategoryId, prev.getCategoryId())
.ne(CmsArticle::getTopFlag, '0')
.ne(CmsArticle::getTopFlagType, 'N')
.le(CmsArticle::getTopFlag, topFlag)
.orderByDesc(CmsArticle::getTopFlag).orderByDesc(CmsArticle::getSortFlag);
List<CmsArticle> articles = this.getArticleService().getContentMapper().selectList(q);
recursiveSort(articles, 0, topFlag);
// 批量更新文章信息
this.getArticleService().saveOrUpdateBatch(articles);
this.getArticleService().updateById(content);
}
public void recursiveSort(List<CmsArticle> articles, int start, Long topFlag) {
if (start >= articles.size()) {
return; // 递归结束条件:已经遍历完整个列表
}
CmsArticle currArticle = articles.get(start);
if (currArticle.getTopFlag().equals(topFlag)) {
currArticle.setTopFlag(topFlag - 1); // 顺延-1处理
topFlag--;
}
recursiveSort(articles, start + 1, topFlag); // 递归遍历下一篇文章
}