刘光辉
8 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package jnpf.onlinedev.util;
 
import jnpf.util.FlowFormConstant;
import jnpf.util.StringUtil;
import jnpf.util.TableFeildsEnum;
import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.SqlTable;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
/**
 * 流程列表的状态别名映射与排序优先级。
 */
public final class WorkflowListSortUtils {
 
    private WorkflowListSortUtils() {
    }
 
    public static boolean isFlowStateField(String field) {
        return FlowFormConstant.FLOW_STATE.equalsIgnoreCase(field)
                || TableFeildsEnum.FLOWSTATE.getField().equalsIgnoreCase(field);
    }
 
    public static List<SortSpecification> orderBy(String tableName, String flowStateField, String primaryKey,
                                                 boolean enableFlow, String sidx, Predicate<String> isSortableField) {
        String[] sorts = StringUtil.isNotEmpty(sidx) ? sidx.split(",") : new String[0];
        boolean hasStateSort = enableFlow && Arrays.stream(sorts)
                .map(sort -> sort.startsWith("-") ? sort.substring(1) : sort)
                .anyMatch(WorkflowListSortUtils::isFlowStateField);
        SqlTable table = SqlTable.of(tableName);
        List<SortSpecification> result = new ArrayList<>();
        // 未指定状态排序时,保留平台原有的状态升序优先规则。
        if (enableFlow && !hasStateSort) {
            result.add(SqlBuilder.sortColumn(tableName, table.column(flowStateField)));
        }
        for (String sort : sorts) {
            boolean descending = sort.startsWith("-");
            String field = descending ? sort.substring(1) : sort;
            // 系统状态不依赖表单字段,不能被只展示字段过滤规则移除。
            if (enableFlow && isFlowStateField(field)) {
                field = flowStateField;
            } else if (!isSortableField.test(field)) {
                continue;
            }
            SortSpecification specification = SqlBuilder.sortColumn(tableName, table.column(field));
            result.add(descending ? specification.descending() : specification);
        }
        if (sorts.length == 0) {
            result.add(SqlBuilder.sortColumn(tableName, table.column(primaryKey)).descending());
        }
        return result;
    }
}