优雅调整数据排序

  • • 发表于2021-03-07 01:07:55.0
  • • 作者 小徐同学
  • • 513 次浏览
  • • 4 条评论
  • • 最后编辑时间 2021-08-30 10:33:52.0
  • • 来自 [笔 记]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

日常开发我们常常遇到需要数据排序的情况下,普遍有以下三种排序方式:
1.拖拽排序
2.快速排序
3.上下移动

这三种排序理应用一个方法包含,并且保证后台数据有序 1,2,3,4,5,6,7,而不是排序完后后台数据跳跃性变化 ,1,3,4,6,7

所以总结了下优雅统一的写法,前端只需要传要改变顺序的数据ID以及目标 序号(从1开始 不是SEQ)


import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @description: SortKit
 * @date: 2021/7/30 15:34
 * @author: 77
 */
public class SortKit {

    private static final String DEFAULT_SEQ_NAME = "seq";

    public static void sort(String tableName, Long id, Integer seq, String seqColName) {
        sort(tableName, id, seq, seqColName, new Kv());
    }

    public static void sort(String tableName, Long id, Integer seq) {
        sort(tableName, id, seq, DEFAULT_SEQ_NAME, new Kv());
    }

    public static void sort(String tableName, Long id, Integer seq, Kv params) {
        sort(tableName, id, seq, DEFAULT_SEQ_NAME, params);
    }

    public static void sort(String tableName, Long id, Integer seq, String seqColName, Kv params) {
        Record record = Db.findById(tableName, id);
        ValKit.isNull(record, "数据不存在");
        Integer originalSeq = record.getInt(seqColName);
        ValKit.isFalse(Arrays.asList(record.getColumnNames()).contains(seqColName), tableName + "不存在" + seqColName + "字段");
        boolean isUp = false;
        if (originalSeq != null && originalSeq > seq) {
            isUp = true;
        }
        String dataSql = "select id," + seqColName + " from " + tableName + " where 1=1 #for(x:cond) and #(x.key) = #p(x.value) #end order by " + seqColName + " ";
        List<Record> dataList = Db.templateByString(dataSql, Kv.by("cond", params)).find();
        if (seq <= 0) {
            seq = 1;
        } else if (seq > dataList.size()) {
            seq = dataList.size();
        }

        for (int i = 0; i < dataList.size(); i++) {
            Record r = dataList.get(i);
            Long compareId = r.getLong("id");
            //如果是移到首位
            if (seq <= 1 && compareId.equals(id)) {
                r.set(seqColName, 0);
            }
            //如果是移到末尾
            else if (seq >= dataList.size() && compareId.equals(id)) {
                r.set(seqColName, dataList.size() + 1);
            } else if (compareId.equals(id)) {
                r.set(seqColName, seq);
            } else if (seq == i + 1) {
                r.set(seqColName, isUp ? seq + 1 : seq - 1);
            } else if (seq > i + 1) {
                r.set(seqColName, i + 1);
            } else {
                r.set(seqColName, i + 2);
            }
        }
        Collections.sort(dataList, Comparator.comparingDouble(value -> value.getInt(seqColName)));
        for (int i = 0; i < dataList.size(); i++) {
            Record r = dataList.get(i);
            r.set(seqColName, i + 1);
        }
        Db.batchUpdate(tableName, dataList, 1000);
    }
}
评论区(共4条评论)
4条评论
Ctrl+Enter
作者

Michael

小徐同学

帖子:73 回复:0

全栈搬运工

作者详情》
Top